diff --git a/auth/src/main/java/com/baiyue/auth/controller/InternalAccountController.java b/auth/src/main/java/com/baiyue/auth/controller/InternalAccountController.java index 9ee82fe11..8fb352b2c 100644 --- a/auth/src/main/java/com/baiyue/auth/controller/InternalAccountController.java +++ b/auth/src/main/java/com/baiyue/auth/controller/InternalAccountController.java @@ -55,6 +55,12 @@ public class InternalAccountController { @PathVariable Long id, @Valid @RequestBody UpdateAccountStatusRequest request) { verify(token); service.updateStatus(id, request); return ApiResponse.success(null); } + @PostMapping("/sessions/revoke") + public ApiResponse revokeSessions( + @RequestHeader(value="X-Internal-Service-Token", required=false) String token, + @Valid @RequestBody RevokeAccountSessionsRequest request) { + verify(token); service.revokeSessions(request.accountIds()); return ApiResponse.success(null); + } @PutMapping("/{id}/profile") public ApiResponse profile(@RequestHeader(value="X-Internal-Service-Token", required=false) String token, @PathVariable Long id, @Valid @RequestBody UpdateAccountProfileRequest request) { diff --git a/auth/src/main/java/com/baiyue/auth/dto/AccountManagementDtos.java b/auth/src/main/java/com/baiyue/auth/dto/AccountManagementDtos.java index c36d5d9b0..80dbe0f85 100644 --- a/auth/src/main/java/com/baiyue/auth/dto/AccountManagementDtos.java +++ b/auth/src/main/java/com/baiyue/auth/dto/AccountManagementDtos.java @@ -2,10 +2,12 @@ package com.baiyue.auth.dto; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Pattern; import java.time.LocalDateTime; +import java.util.Set; /** 账号安全及内部账号管理契约。 */ public final class AccountManagementDtos { @@ -35,6 +37,12 @@ public final class AccountManagementDtos { } public record UpdateAccountProfileRequest(@NotBlank @Size(max = 64) String displayName) { } public record UpdateAccountStatusRequest(@NotBlank String status) { } + public record RevokeAccountSessionsRequest( + @NotEmpty @Size(max = 500) Set<@NotNull Long> accountIds) { + public RevokeAccountSessionsRequest { + accountIds = Set.copyOf(accountIds); + } + } public record ResetPasswordRequest(@NotBlank @Size(min = 8, max = 64) @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d).+$", message = "密码必须同时包含字母和数字") String newPassword, Boolean forceChangePassword) { diff --git a/auth/src/main/java/com/baiyue/auth/service/AccountManagementService.java b/auth/src/main/java/com/baiyue/auth/service/AccountManagementService.java index 66ff20523..795a40b31 100644 --- a/auth/src/main/java/com/baiyue/auth/service/AccountManagementService.java +++ b/auth/src/main/java/com/baiyue/auth/service/AccountManagementService.java @@ -13,6 +13,7 @@ import com.baiyue.common.audit.BusinessAudit; import java.util.Locale; import java.util.Objects; +import java.util.Set; /** 账号生命周期管理,所有密码只以 BCrypt 摘要写入数据库。 */ @Service @@ -98,6 +99,14 @@ public class AccountManagementService { bumpVersion(account); } + @Transactional + @BusinessAudit(event = "ACCOUNT_SESSIONS_REVOKE", resourceType = "ACCOUNT_BATCH", + resourceId = "'RBAC_CHANGE'", description = "RBAC 变更批量撤销账号会话", + captureBefore = false, captureAfter = false) + public void revokeSessions(Set accountIds) { + accountIds.forEach(accountId -> bumpVersion(required(accountId))); + } + @Transactional @BusinessAudit(event = "ACCOUNT_PROFILE_CHANGE", resourceType = "ACCOUNT", resourceId = "#accountId", description = "同步账号显示名称", captureAfter = false) @@ -118,11 +127,11 @@ public class AccountManagementService { @BusinessAudit(event = "CUSTOMER_ACCOUNT_ARCHIVE", resourceType = "TENANT", resourceId = "#tenantId", description = "归档客户并撤销客户账号", captureBefore = false, captureAfter = false) public void archiveTenant(Long tenantId) { - for (AuthAccount account : accountRepository.findMerchantByTenant(tenantId)) { + for (AuthAccount account : repository.findMerchantByTenant(tenantId)) { account.setAccountStatus("DISABLED"); account.setPasswordChangeRequired(false); account.setTokenVersion((account.getTokenVersion() == null ? 0 : account.getTokenVersion()) + 1); - accountRepository.save(account); + repository.save(account); tokenSessionStore.revokeAll(account.getId()); } } diff --git a/auth/src/main/java/com/baiyue/auth/service/AuthService.java b/auth/src/main/java/com/baiyue/auth/service/AuthService.java index 528f726a4..26c532365 100644 --- a/auth/src/main/java/com/baiyue/auth/service/AuthService.java +++ b/auth/src/main/java/com/baiyue/auth/service/AuthService.java @@ -156,7 +156,7 @@ public class AuthService { @Transactional @BusinessAudit(event = "CUSTOMER_IMPERSONATION_EXCHANGE", resourceType = "IMPERSONATION", - resourceId = "#code", description = "兑换客户代登录授权码", captureBefore = false, captureAfter = false) + resourceId = "'IMPERSONATION_EXCHANGE'", description = "兑换客户代登录授权码", captureBefore = false, captureAfter = false) public ImpersonationTokenResponse exchangeImpersonationTicket(String code) { TokenSessionStore.ImpersonationTicket ticket = tokenSessionStore.consumeImpersonationTicket(code); if (ticket == null) throw new BizException(ResultCode.UNAUTHORIZED, "代登录授权码无效或已过期"); diff --git a/auth/src/test/java/com/baiyue/auth/service/AccountManagementServiceTest.java b/auth/src/test/java/com/baiyue/auth/service/AccountManagementServiceTest.java index a32fe1a99..3ac7cccd2 100644 --- a/auth/src/test/java/com/baiyue/auth/service/AccountManagementServiceTest.java +++ b/auth/src/test/java/com/baiyue/auth/service/AccountManagementServiceTest.java @@ -24,6 +24,7 @@ import jakarta.annotation.Resource; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.time.LocalDateTime; +import java.util.Set; @DisplayName("账号管理服务") @SpringJUnitConfig(classes = {AccountManagementService.class, AccountManagementServiceTest.TestConfig.class}) @@ -154,6 +155,21 @@ class AccountManagementServiceTest { verify(repository).save(account); verify(sessions).revokeAll(10L); } + + @Test void rbacChangeRevokesAccessAndRefreshSessionsAndBumpsTokenVersions() { + AuthAccount second = new AuthAccount(); + second.setId(11L); second.setTokenVersion(7); second.setAccountStatus("ACTIVE"); + when(repository.findById(11L)).thenReturn(second); + + service.revokeSessions(Set.of(10L, 11L)); + + assertEquals(3, account.getTokenVersion()); + assertEquals(8, second.getTokenVersion()); + verify(repository).save(account); + verify(repository).save(second); + verify(sessions).revokeAll(10L); + verify(sessions).revokeAll(11L); + } @Configuration static class TestConfig { @Bean diff --git a/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java b/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java index 3bb963ec9..d367442c7 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/repository/InboundMeasurementRepository.java @@ -55,6 +55,13 @@ public class InboundMeasurementRepository { .eq(InboundOrderEntity::getId, inbound.getId())) == 1; } + public boolean updateInboundWeightSummary(InboundOrderEntity inbound) { + return inboundOrders.update(inbound, new LambdaUpdateWrapper() + .eq(InboundOrderEntity::getTenantId, inbound.getTenantId()) + .eq(InboundOrderEntity::getId, inbound.getId()) + .set(InboundOrderEntity::getActualGrossWeightKg, inbound.getActualGrossWeightKg())) == 1; + } + public InboundMeasurementEntity findMeasurement(long tenantId, long inboundId, long measurementId) { return measurements.selectOne(new LambdaQueryWrapper() .eq(InboundMeasurementEntity::getTenantId, tenantId) diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java index 8365270a0..5a39acb2b 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/InboundMeasurementService.java @@ -292,7 +292,7 @@ public class InboundMeasurementService { inbound.setProcessStatus("MEASURING"); } inbound.setUpdatedBy(operatorId); - if (!repository.updateInbound(inbound)) { + if (!repository.updateInboundWeightSummary(inbound)) { throw concurrentModification(); } } diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java index 3cc3dff9b..6d63d8b23 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/TenantScopedMutationRepositoryTest.java @@ -2,6 +2,7 @@ package com.baiyue.firstleg.repository; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baiyue.firstleg.entity.FeeItemEntity; @@ -57,6 +58,7 @@ class TenantScopedMutationRepositoryTest { static void initializeMetadata() { initialize(FulfillmentTaskEntity.class); initialize(InboundWeightResultEntity.class); + initialize(InboundOrderEntity.class); initialize(InboundFeeDetailEntity.class); } @@ -90,6 +92,24 @@ class TenantScopedMutationRepositoryTest { assertTenantAndId(wrapper.getValue()); } + @Test + @SuppressWarnings({"rawtypes", "unchecked"}) + void weightSummaryUpdateExplicitlyClearsNullGrossWeight() { + InboundOrderEntity inbound = new InboundOrderEntity(); + inbound.setTenantId(TENANT); + inbound.setId(ID); + inbound.setActualGrossWeightKg(null); + when(inboundOrders.update(any(), any(Wrapper.class))).thenReturn(1); + + assertThat(measurementRepository.updateInboundWeightSummary(inbound)).isTrue(); + + ArgumentCaptor> wrapper = ArgumentCaptor.forClass(Wrapper.class); + verify(inboundOrders).update(eq(inbound), wrapper.capture()); + assertTenantAndId(wrapper.getValue()); + assertThat(((LambdaUpdateWrapper) wrapper.getValue()).getSqlSet()) + .contains("actual_gross_weight_kg"); + } + @Test @SuppressWarnings({"rawtypes", "unchecked"}) void feeDetailDeleteMatchesTenantAndId() { diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java index c3bab2e87..91ac3e60c 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/InboundMeasurementServiceTest.java @@ -125,7 +125,7 @@ class InboundMeasurementServiceTest { when(repository.findWeight(1L, 10L, 20L)).thenReturn(current); when(repository.updateWeight(current)).thenReturn(true); when(repository.listWeights(1L, 10L)).thenReturn(List.of(current, previous)); - when(repository.updateInbound(inbound)).thenReturn(true); + when(repository.updateInboundWeightSummary(inbound)).thenReturn(true); InboundMeasurementResponses.WeightResult response = service.confirmWeightResult( 1L, 10L, 20L, 9L, "操作员", @@ -152,7 +152,7 @@ class InboundMeasurementServiceTest { when(repository.findWeight(1L, 10L, 20L)).thenReturn(weight); when(repository.updateWeight(weight)).thenReturn(true); when(repository.listWeights(1L, 10L)).thenReturn(List.of(weight)); - when(repository.updateInbound(inbound)).thenReturn(true); + when(repository.updateInboundWeightSummary(inbound)).thenReturn(true); InboundMeasurementResponses.WeightResult response = service.confirmWeightResult( 1L, 10L, 20L, 9L, "操作员", @@ -173,7 +173,7 @@ class InboundMeasurementServiceTest { when(repository.findWeight(1L, 10L, 20L)).thenReturn(weight); when(repository.updateWeight(weight)).thenReturn(true); when(repository.listWeights(1L, 10L)).thenReturn(List.of(weight)); - when(repository.updateInbound(inbound)).thenReturn(true); + when(repository.updateInboundWeightSummary(inbound)).thenReturn(true); InboundMeasurementResponses.WeightResult response = service.confirmWeightResult( 1L, 10L, 20L, 9L, "操作员", @@ -199,7 +199,7 @@ class InboundMeasurementServiceTest { verify(repository, never()).updateWeight(any()); verify(repository, never()).insertRevision(any()); - verify(repository, never()).updateInbound(any()); + verify(repository, never()).updateInboundWeightSummary(any()); } @Test @@ -217,7 +217,7 @@ class InboundMeasurementServiceTest { verify(repository, never()).updateWeight(any()); verify(repository, never()).insertRevision(any()); - verify(repository, never()).updateInbound(any()); + verify(repository, never()).updateInboundWeightSummary(any()); } @Test @@ -246,7 +246,7 @@ class InboundMeasurementServiceTest { when(repository.findWeight(1L, 10L, 20L)).thenReturn(weight); when(repository.updateWeight(weight)).thenReturn(true); when(repository.listWeights(1L, 10L)).thenReturn(List.of(weight)); - when(repository.updateInbound(inbound)).thenReturn(true); + when(repository.updateInboundWeightSummary(inbound)).thenReturn(true); InboundMeasurementResponses.WeightResult response = service.confirmWeightResult( 1L, 10L, 20L, 9L, "操作员", @@ -308,7 +308,7 @@ class InboundMeasurementServiceTest { verify(repository, never()).updateWeight(any()); verify(repository, never()).insertRevision(any()); - verify(repository, never()).updateInbound(any()); + verify(repository, never()).updateInboundWeightSummary(any()); } @Test @@ -327,7 +327,7 @@ class InboundMeasurementServiceTest { assertThat(response.version()).isEqualTo(2); verify(repository, never()).updateWeight(any()); verify(repository, never()).insertRevision(any()); - verify(repository, never()).updateInbound(any()); + verify(repository, never()).updateInboundWeightSummary(any()); } @Test @@ -366,7 +366,7 @@ class InboundMeasurementServiceTest { verify(repository, times(2)).updateWeight(weight); verify(repository, times(1)).insertRevision(any(InboundWeightRevisionEntity.class)); verify(repository, never()).listWeights(anyLong(), anyLong()); - verify(repository, never()).updateInbound(any()); + verify(repository, never()).updateInboundWeightSummary(any()); } @Test @@ -383,7 +383,7 @@ class InboundMeasurementServiceTest { verify(repository).deleteWeight(1L, 10L, 20L, 1); verify(imageClient).delete("internal-token", 9L, 1L, 10L, 120L); - verify(repository, never()).updateInbound(any()); + verify(repository, never()).updateInboundWeightSummary(any()); } @Test @@ -396,14 +396,36 @@ class InboundMeasurementServiceTest { when(repository.findWeight(1L, 10L, 20L)).thenReturn(weight); when(repository.deleteWeight(1L, 10L, 20L, 2)).thenReturn(true); when(repository.listWeights(1L, 10L)).thenReturn(List.of()); - when(repository.updateInbound(inbound)).thenReturn(true); + when(repository.updateInboundWeightSummary(inbound)).thenReturn(true); when(imageClient.delete("internal-token", 9L, 1L, 10L, 120L)) .thenReturn(ApiResponse.success(null)); service.deleteWeightResult(1L, 10L, 20L, 2, 9L); assertThat(inbound.getActualGrossWeightKg()).isNull(); - verify(repository).updateInbound(inbound); + verify(repository).updateInboundWeightSummary(inbound); + } + + @Test + void deletingConfirmedWeightRecalculatesTotalFromRemainingHistory() { + InboundOrderEntity inbound = inbound("MEASURING"); + inbound.setActualGrossWeightKg(new BigDecimal("15.000")); + InboundWeightResultEntity deleted = weight(20L, "10.000", "KG", "CONFIRMED", 2); + deleted.setFinalWeightKg(new BigDecimal("10.000")); + InboundWeightResultEntity remaining = weight(21L, "5.000", "KG", "CONFIRMED", 1); + remaining.setFinalWeightKg(new BigDecimal("5.000")); + when(repository.findInbound(1L, 10L)).thenReturn(inbound); + when(repository.findWeight(1L, 10L, 20L)).thenReturn(deleted); + when(repository.deleteWeight(1L, 10L, 20L, 2)).thenReturn(true); + when(repository.listWeights(1L, 10L)).thenReturn(List.of(remaining)); + when(repository.updateInboundWeightSummary(inbound)).thenReturn(true); + when(imageClient.delete("internal-token", 9L, 1L, 10L, 120L)) + .thenReturn(ApiResponse.success(null)); + + service.deleteWeightResult(1L, 10L, 20L, 2, 9L); + + assertThat(inbound.getActualGrossWeightKg()).isEqualByComparingTo("5.000"); + verify(repository).updateInboundWeightSummary(inbound); } @Test diff --git a/iam/src/main/java/com/baiyue/iam/client/AuthAccountClient.java b/iam/src/main/java/com/baiyue/iam/client/AuthAccountClient.java index a350af9dc..28b516d46 100644 --- a/iam/src/main/java/com/baiyue/iam/client/AuthAccountClient.java +++ b/iam/src/main/java/com/baiyue/iam/client/AuthAccountClient.java @@ -5,6 +5,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; +import java.util.Set; /** auth-service 内部账号管理客户端。 */ @FeignClient(name = "auth-service", contextId = "authAccountClient", @@ -30,6 +31,9 @@ public interface AuthAccountClient { @RequestBody ImpersonationTicketRequest request); @PutMapping("/{id}/scope") ApiResponse scope(@RequestHeader("X-Internal-Service-Token") String token, @PathVariable Long id, @RequestBody ScopeRequest request); + @PostMapping("/sessions/revoke") ApiResponse revokeSessions( + @RequestHeader("X-Internal-Service-Token") String token, + @RequestBody RevokeAccountSessionsRequest request); @DeleteMapping("/{id}/compensation") ApiResponse compensate(@RequestHeader("X-Internal-Service-Token") String token, @PathVariable Long id); @@ -56,6 +60,11 @@ public interface AuthAccountClient { public PasswordRequest(String newPassword) { this(newPassword, false); } } record ScopeRequest(Long tenantId, Long membershipId, String appCode) { } + record RevokeAccountSessionsRequest(Set accountIds) { + public RevokeAccountSessionsRequest { + accountIds = Set.copyOf(accountIds); + } + } record ImpersonationTicketRequest(Long targetAuthUserId, Long tenantId, Long membershipId, Long actorUserId, Long actorMembershipId, String reason) { } record ImpersonationTicketResponse(String code, String ticketId, long expiresIn) { } diff --git a/iam/src/main/java/com/baiyue/iam/mapper/IamMembershipRoleMapper.java b/iam/src/main/java/com/baiyue/iam/mapper/IamMembershipRoleMapper.java index 79637cd6d..d15438b9b 100644 --- a/iam/src/main/java/com/baiyue/iam/mapper/IamMembershipRoleMapper.java +++ b/iam/src/main/java/com/baiyue/iam/mapper/IamMembershipRoleMapper.java @@ -1,4 +1,29 @@ /** * 成员角色关联 MyBatis-Plus Mapper,负责 {@code iam_membership_role} 表的基础持久化操作。 */ -package com.baiyue.iam.mapper; import com.baiyue.iam.entity.IamMembershipRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface IamMembershipRoleMapper extends BaseMapper{} +package com.baiyue.iam.mapper; + +import com.baiyue.iam.entity.IamMembershipRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface IamMembershipRoleMapper extends BaseMapper { + @Select(""" + SELECT DISTINCT u.auth_user_id + FROM iam_membership_role mr + JOIN iam_membership m ON m.id = mr.membership_id AND m.tenant_id = mr.tenant_id + JOIN iam_user u ON u.id = m.user_id + WHERE mr.tenant_id = #{tenantId} + AND mr.role_id = #{roleId} + AND m.deleted = 0 + AND u.deleted = 0 + ORDER BY u.auth_user_id + """) + List findAssignedAuthUserIds(@Param("tenantId") long tenantId, + @Param("roleId") Long roleId); +} diff --git a/iam/src/main/java/com/baiyue/iam/repository/RbacRepository.java b/iam/src/main/java/com/baiyue/iam/repository/RbacRepository.java index 76c8b4fad..72699047c 100644 --- a/iam/src/main/java/com/baiyue/iam/repository/RbacRepository.java +++ b/iam/src/main/java/com/baiyue/iam/repository/RbacRepository.java @@ -122,6 +122,10 @@ public class RbacRepository { .eq(IamMembershipRole::getRoleId, roleId)) > 0; } + public List findAssignedAuthUserIds(long tenantId, Long roleId) { + return membershipRoleMapper.findAssignedAuthUserIds(tenantId, roleId); + } + public void deleteRole(long tenantId, String appCode, Long roleId) { rolePermissionMapper.delete(new LambdaQueryWrapper() .eq(IamRolePermission::getTenantId, tenantId) diff --git a/iam/src/main/java/com/baiyue/iam/service/RbacService.java b/iam/src/main/java/com/baiyue/iam/service/RbacService.java index 65c8c8d8b..95a70f734 100644 --- a/iam/src/main/java/com/baiyue/iam/service/RbacService.java +++ b/iam/src/main/java/com/baiyue/iam/service/RbacService.java @@ -1,8 +1,10 @@ package com.baiyue.iam.service; import com.baiyue.common.audit.BusinessAudit; +import com.baiyue.common.core.api.ApiResponse; import com.baiyue.common.core.api.ResultCode; import com.baiyue.common.core.exception.BizException; +import com.baiyue.iam.client.AuthAccountClient; import com.baiyue.iam.dto.RbacDtos.*; import com.baiyue.iam.entity.IamMembership; import com.baiyue.iam.entity.IamPermission; @@ -11,6 +13,8 @@ import com.baiyue.iam.repository.MemberRepository; import com.baiyue.iam.repository.RbacRepository; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import jakarta.annotation.Resource; +import feign.FeignException; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.dao.DataIntegrityViolationException; @@ -25,8 +29,12 @@ import java.util.Comparator; /** 双端 RBAC 应用服务,严格按租户和应用域隔离。 */ @Service public class RbacService { + private static final int SESSION_REVOCATION_BATCH_SIZE = 500; @Resource private RbacRepository repository; @Resource private MemberRepository memberRepository; + @Resource private AuthAccountClient authClient; + @Value("${baiyue.security.internal-service-token}") + private String internalToken; public List roles(long tenantId, String appCode) { return repository.findRoles(tenantId, appCode).stream() @@ -75,11 +83,13 @@ public class RbacService { @BusinessAudit(event = "ROLE_STATUS_CHANGE", resourceType = "ROLE", resourceId = "#roleId", description = "启停角色", captureBefore = true, captureAfter = true) + @Transactional public RoleResponse changeStatus(long tenantId, String appCode, Long roleId, ChangeRoleStatusRequest request) { IamRole role = requireCustomRole(tenantId, appCode, roleId); role.setStatus(request.status()); repository.updateRole(role); + revokeAssignedSessions(tenantId, roleId); return response(role, repository.findRolePermissionIds(tenantId, roleId)); } @@ -224,6 +234,22 @@ public class RbacService { } } repository.replaceRolePermissions(tenantId, request.roleId(), request.permissionIds()); + revokeAssignedSessions(tenantId, request.roleId()); + } + + private void revokeAssignedSessions(long tenantId, Long roleId) { + List accountIds = repository.findAssignedAuthUserIds(tenantId, roleId); + for (int start = 0; start < accountIds.size(); start += SESSION_REVOCATION_BATCH_SIZE) { + Set batch = Set.copyOf(accountIds.subList(start, + Math.min(start + SESSION_REVOCATION_BATCH_SIZE, accountIds.size()))); + try { + ApiResponse response = authClient.revokeSessions(internalToken, + new AuthAccountClient.RevokeAccountSessionsRequest(batch)); + if (response == null || !response.successful()) throw sessionRevocationUnavailable(); + } catch (FeignException exception) { + throw sessionRevocationUnavailable(); + } + } } private IamRole requireRole(long tenantId, String appCode, Long roleId) { @@ -284,4 +310,9 @@ public class RbacService { private BizException forbidden() { return new BizException(ResultCode.FORBIDDEN, "禁止跨租户或跨应用访问"); } + + private BizException sessionRevocationUnavailable() { + return new BizException(ResultCode.SERVICE_UNAVAILABLE, + "认证会话撤销失败,角色变更未生效"); + } } diff --git a/iam/src/test/java/com/baiyue/iam/service/AuthorizationSnapshotServiceTest.java b/iam/src/test/java/com/baiyue/iam/service/AuthorizationSnapshotServiceTest.java index f6ae54403..550066f8d 100644 --- a/iam/src/test/java/com/baiyue/iam/service/AuthorizationSnapshotServiceTest.java +++ b/iam/src/test/java/com/baiyue/iam/service/AuthorizationSnapshotServiceTest.java @@ -93,4 +93,21 @@ class AuthorizationSnapshotServiceTest { assertThat(result).isEmpty(); } + @Test + void newLoginPermissionsDisappearWhileRoleDisabledAndReturnAfterReenable() { + when(mapper.countActiveIdentity(42L, 7L, 9L)).thenReturn(1); + when(mapper.findRoles(42L, 7L, 9L, "MERCHANT")) + .thenReturn(List.of("ORDER_VIEWER"), List.of(), List.of("ORDER_VIEWER")); + when(mapper.findPermissions(42L, 7L, 9L, "MERCHANT")) + .thenReturn(List.of("merchant:order:list", "merchant:order:view"), List.of(), + List.of("merchant:order:list", "merchant:order:view")); + SnapshotRequest request = new SnapshotRequest(42L, 7L, 9L, "MERCHANT"); + + assertThat(service.load(request).getPermissions()) + .containsExactlyInAnyOrder("merchant:order:list", "merchant:order:view"); + assertThat(service.load(request).getPermissions()).isEmpty(); + assertThat(service.load(request).getPermissions()) + .containsExactlyInAnyOrder("merchant:order:list", "merchant:order:view"); + } + } diff --git a/iam/src/test/java/com/baiyue/iam/service/RbacServiceTest.java b/iam/src/test/java/com/baiyue/iam/service/RbacServiceTest.java index ec8f8770f..0f709b6c6 100644 --- a/iam/src/test/java/com/baiyue/iam/service/RbacServiceTest.java +++ b/iam/src/test/java/com/baiyue/iam/service/RbacServiceTest.java @@ -1,7 +1,9 @@ package com.baiyue.iam.service; +import com.baiyue.common.core.api.ApiResponse; import com.baiyue.common.core.api.ResultCode; import com.baiyue.common.core.exception.BizException; +import com.baiyue.iam.client.AuthAccountClient; import com.baiyue.iam.dto.RbacDtos.AssignRolesRequest; import com.baiyue.iam.dto.RbacDtos.GrantPermissionsRequest; import com.baiyue.iam.dto.RbacDtos.CreateRoleRequest; @@ -19,6 +21,7 @@ import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; +import org.springframework.test.context.TestPropertySource; import jakarta.annotation.Resource; @@ -30,9 +33,11 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @SpringJUnitConfig(RbacService.class) +@TestPropertySource(properties = "baiyue.security.internal-service-token=test-internal-token") class RbacServiceTest { @MockBean private RbacRepository repository; @MockBean private MemberRepository memberRepository; + @MockBean private AuthAccountClient authClient; @Resource private RbacService service; @Test @@ -311,6 +316,53 @@ class RbacServiceTest { verify(repository).deletePermission(custom); } + @Test + void roleDisableAndEnableRevokeAllAssignedAccountSessions() { + IamRole role = role(11L, 100L, "MERCHANT", "CUSTOM"); + when(repository.findRole(11L, 100L, "MERCHANT")).thenReturn(role); + when(repository.findRolePermissionIds(100L, 11L)).thenReturn(Set.of(21L)); + when(repository.findAssignedAuthUserIds(100L, 11L)).thenReturn(List.of(501L, 502L)); + when(authClient.revokeSessions(any(), any())).thenReturn(ApiResponse.success(null)); + + service.changeStatus(100L, "MERCHANT", 11L, new ChangeRoleStatusRequest("DISABLED")); + service.changeStatus(100L, "MERCHANT", 11L, new ChangeRoleStatusRequest("ACTIVE")); + + ArgumentCaptor captor = + ArgumentCaptor.forClass(AuthAccountClient.RevokeAccountSessionsRequest.class); + verify(authClient, times(2)).revokeSessions(eq("test-internal-token"), captor.capture()); + assertEquals(Set.of(501L, 502L), captor.getAllValues().get(0).accountIds()); + assertEquals(Set.of(501L, 502L), captor.getAllValues().get(1).accountIds()); + } + + @Test + void rolePermissionReplacementRevokesAllAssignedAccountSessions() { + when(repository.findRole(11L, 100L, "MERCHANT")) + .thenReturn(role(11L, 100L, "MERCHANT", "CUSTOM")); + when(repository.findAssignedAuthUserIds(100L, 11L)).thenReturn(List.of(501L)); + when(authClient.revokeSessions(any(), any())).thenReturn(ApiResponse.success(null)); + + service.grantPermissions(100L, "MERCHANT", new GrantPermissionsRequest(11L, Set.of())); + + verify(repository).replaceRolePermissions(100L, 11L, Set.of()); + verify(authClient).revokeSessions(eq("test-internal-token"), + eq(new AuthAccountClient.RevokeAccountSessionsRequest(Set.of(501L)))); + } + + @Test + void authFailureRejectsRoleStatusChangeSoIamTransactionCanRollBack() { + IamRole role = role(11L, 100L, "MERCHANT", "CUSTOM"); + when(repository.findRole(11L, 100L, "MERCHANT")).thenReturn(role); + when(repository.findAssignedAuthUserIds(100L, 11L)).thenReturn(List.of(501L)); + when(authClient.revokeSessions(any(), any())).thenReturn(ApiResponse.failure( + ResultCode.SERVICE_UNAVAILABLE, "auth unavailable", null, null)); + + BizException exception = assertThrows(BizException.class, () -> service.changeStatus( + 100L, "MERCHANT", 11L, new ChangeRoleStatusRequest("DISABLED"))); + + assertEquals(ResultCode.SERVICE_UNAVAILABLE, exception.getResultCode()); + assertEquals("认证会话撤销失败,角色变更未生效", exception.getMessage()); + } + private IamRole role(Long id, Long tenantId, String appCode, String roleType) { IamRole role = new IamRole(); role.setId(id); diff --git a/iam/src/test/java/com/baiyue/iam/service/TenantCustomerExportTest.java b/iam/src/test/java/com/baiyue/iam/service/TenantCustomerExportTest.java index 9cc3b8ef1..ebf58a601 100644 --- a/iam/src/test/java/com/baiyue/iam/service/TenantCustomerExportTest.java +++ b/iam/src/test/java/com/baiyue/iam/service/TenantCustomerExportTest.java @@ -3,6 +3,7 @@ package com.baiyue.iam.service; import com.baiyue.iam.client.AuthAccountClient; import com.baiyue.iam.entity.IamTenant; import com.baiyue.iam.repository.ProfileResourceRepository; +import com.baiyue.iam.repository.MemberRepository; import com.baiyue.iam.repository.TenantRepository; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -21,6 +22,7 @@ import static org.mockito.Mockito.when; class TenantCustomerExportTest { @MockBean private TenantRepository repository; @MockBean private ProfileResourceRepository profileRepository; + @MockBean private MemberRepository memberRepository; @MockBean private AuthAccountClient authAccountClient; @MockBean private TenantApprovalInitializationCoordinator approvalInitialization; @MockBean private CustomerDimensionRuleInitializationService dimensionRuleInitialization; diff --git a/order/src/main/java/com/baiyue/order/service/OrderApplicationService.java b/order/src/main/java/com/baiyue/order/service/OrderApplicationService.java index 2ca523c5d..0811d4696 100644 --- a/order/src/main/java/com/baiyue/order/service/OrderApplicationService.java +++ b/order/src/main/java/com/baiyue/order/service/OrderApplicationService.java @@ -1,6 +1,7 @@ package com.baiyue.order.service; import com.baiyue.common.core.api.PageResult; +import com.baiyue.common.core.api.ResultCode; import com.baiyue.common.core.exception.BizException; import com.baiyue.order.dto.OrderDetailResponse; import com.baiyue.order.dto.OrderRequests; @@ -87,7 +88,7 @@ public class OrderApplicationService { OrderStatus before = order.getStatus(); if (before != OrderStatus.DRAFT && before != OrderStatus.REJECTED && !(allowSubmitted && before == OrderStatus.SUBMITTED)) { - throw new BizException("当前订单状态不允许编辑订单资料"); + throw new BizException(ResultCode.CONFLICT, "当前订单状态不允许编辑订单资料"); } pricingChannelGuard.requireAvailable(tenantId, request.receivingWarehouseId(), request.channelCode()); apply(order, request, snapshots); order.setStatus(OrderStatus.DRAFT); order.setUpdatedBy(userId); @@ -181,20 +182,22 @@ public class OrderApplicationService { private void validatePrototypeFields(OrderRequests.SaveRequest request) { if ("PICKUP".equals(request.pickupMethod()) && request.sender() == null) { - throw new BizException("上门提货时必须填写发货信息"); + throw new BizException(ResultCode.VALIDATION_FAILED, "上门提货时必须填写发货信息"); } if ("PRIVATE".equals(request.destinationType()) && request.receiver() == null) { - throw new BizException("私人地址必须填写收货信息"); + throw new BizException(ResultCode.VALIDATION_FAILED, "私人地址必须填写收货信息"); } if ("FBA".equals(request.destinationType())) { if (!StringUtils.hasText(request.amazonWarehouseCode()) || !StringUtils.hasText(request.shipmentId()) || !StringUtils.hasText(request.referenceId())) { - throw new BizException("FBA orders require Amazon warehouse code, Shipment ID and Reference ID"); + throw new BizException(ResultCode.VALIDATION_FAILED, + "FBA orders require Amazon warehouse code, Shipment ID and Reference ID"); } for (var cargo : request.cargoes()) { if (!StringUtils.hasText(cargo.skuNo()) || !StringUtils.hasText(cargo.upcNo()) || !StringUtils.hasText(cargo.shipmentId()) || !StringUtils.hasText(cargo.referenceId())) { - throw new BizException("FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID."); + throw new BizException(ResultCode.VALIDATION_FAILED, + "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID."); } } } @@ -216,21 +219,23 @@ public class OrderApplicationService { if (cargoes == null || cargoes.isEmpty()) throw new BizException("At least one cargo line is required"); var parties = repository.findParties(tenantId, order.getId()); if ("PICKUP".equals(order.getPickupMethod()) && !hasParty(parties, "SENDER")) { - throw new BizException("上门提货时必须填写发货信息"); + throw new BizException(ResultCode.VALIDATION_FAILED, "上门提货时必须填写发货信息"); } if ("PRIVATE".equals(order.getDestinationType()) && !hasParty(parties, "RECEIVER")) { - throw new BizException("私人地址必须填写收货信息"); + throw new BizException(ResultCode.VALIDATION_FAILED, "私人地址必须填写收货信息"); } if ("FBA".equals(order.getDestinationType())) { if (!StringUtils.hasText(order.getAmazonWarehouseCode()) || !StringUtils.hasText(order.getShipmentId()) || !StringUtils.hasText(order.getReferenceId())) { - throw new BizException("FBA orders require Amazon warehouse code, Shipment ID and Reference ID"); + throw new BizException(ResultCode.VALIDATION_FAILED, + "FBA orders require Amazon warehouse code, Shipment ID and Reference ID"); } for (var cargo : cargoes) { if (!StringUtils.hasText(cargo.getSkuNo()) || !StringUtils.hasText(cargo.getUpcNo()) || !StringUtils.hasText(cargo.getShipmentId()) || !StringUtils.hasText(cargo.getReferenceId())) { - throw new BizException("FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID."); + throw new BizException(ResultCode.VALIDATION_FAILED, + "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID."); } } } diff --git a/order/src/test/java/com/baiyue/order/service/OrderApplicationServiceStateTest.java b/order/src/test/java/com/baiyue/order/service/OrderApplicationServiceStateTest.java index 249141a8a..e8ccd14de 100644 --- a/order/src/test/java/com/baiyue/order/service/OrderApplicationServiceStateTest.java +++ b/order/src/test/java/com/baiyue/order/service/OrderApplicationServiceStateTest.java @@ -310,7 +310,9 @@ class OrderApplicationServiceStateTest { assertThatThrownBy(() -> service(repository, mock(OrderEligibilityGuard.class), masterData) .updateDraft(10001L, 2L, 1L, request())) .isInstanceOf(BizException.class) - .hasMessageContaining("不允许编辑"); + .hasMessage("当前订单状态不允许编辑订单资料") + .extracting(exception -> ((BizException) exception).getResultCode()) + .isEqualTo(ResultCode.CONFLICT); verify(repository, never()).saveOrder(anyLong(), any()); } @@ -379,7 +381,9 @@ class OrderApplicationServiceStateTest { assertThatThrownBy(() -> service(repository, mock(OrderEligibilityGuard.class), masterData) .createDraft(20002L, 2L, request, "pickup-without-sender")) .isInstanceOf(BizException.class) - .hasMessageContaining("上门提货时必须填写发货信息"); + .hasMessage("上门提货时必须填写发货信息") + .extracting(exception -> ((BizException) exception).getResultCode()) + .isEqualTo(ResultCode.VALIDATION_FAILED); verifyNoInteractions(masterData); } @@ -393,7 +397,41 @@ class OrderApplicationServiceStateTest { assertThatThrownBy(() -> service(repository, mock(OrderEligibilityGuard.class), masterData) .createDraft(20002L, 2L, request, "private-without-receiver")) .isInstanceOf(BizException.class) - .hasMessageContaining("私人地址必须填写收货信息"); + .hasMessage("私人地址必须填写收货信息") + .extracting(exception -> ((BizException) exception).getResultCode()) + .isEqualTo(ResultCode.VALIDATION_FAILED); + + verifyNoInteractions(masterData); + } + + @Test + void fbaOrderStillRequiresAmazonWarehouseShipmentAndReferenceIds() { + OrderRepository repository = mock(OrderRepository.class); + OrderMasterDataGuard masterData = mock(OrderMasterDataGuard.class); + OrderRequests.SaveRequest request = fbaRequest(null, null, null); + + assertThatThrownBy(() -> service(repository, mock(OrderEligibilityGuard.class), masterData) + .createDraft(20002L, 2L, request, "fba-without-order-identifiers")) + .isInstanceOf(BizException.class) + .hasMessage("FBA orders require Amazon warehouse code, Shipment ID and Reference ID") + .extracting(exception -> ((BizException) exception).getResultCode()) + .isEqualTo(ResultCode.VALIDATION_FAILED); + + verifyNoInteractions(masterData); + } + + @Test + void fbaCargoStillRequiresSkuUpcShipmentAndReferenceIds() { + OrderRepository repository = mock(OrderRepository.class); + OrderMasterDataGuard masterData = mock(OrderMasterDataGuard.class); + OrderRequests.SaveRequest request = fbaRequest("ONT8", "FBA-SHIPMENT-1", "REF-1"); + + assertThatThrownBy(() -> service(repository, mock(OrderEligibilityGuard.class), masterData) + .createDraft(20002L, 2L, request, "fba-without-cargo-identifiers")) + .isInstanceOf(BizException.class) + .hasMessage("FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID.") + .extracting(exception -> ((BizException) exception).getResultCode()) + .isEqualTo(ResultCode.VALIDATION_FAILED); verifyNoInteractions(masterData); } @@ -410,7 +448,9 @@ class OrderApplicationServiceStateTest { assertThatThrownBy(() -> service(repository, mock(OrderEligibilityGuard.class), mock(OrderMasterDataGuard.class)) .transit(20002L, 2L, "u", 1L, OrderStatus.SUBMITTED, null)) .isInstanceOf(BizException.class) - .hasMessageContaining("上门提货时必须填写发货信息"); + .hasMessage("上门提货时必须填写发货信息") + .extracting(exception -> ((BizException) exception).getResultCode()) + .isEqualTo(ResultCode.VALIDATION_FAILED); verify(repository, never()).saveOrder(anyLong(), any()); } @@ -469,6 +509,19 @@ class OrderApplicationServiceStateTest { "BUY_DECLARATION", "TAX_INCLUDED", "LCL", false, destinationType, null, null, null); } + private OrderRequests.SaveRequest fbaRequest(String amazonWarehouseCode, String shipmentId, + String referenceId) { + OrderRequests.SaveRequest source = request(null, "SELF_EXPRESS", null, null, "FBA"); + return new OrderRequests.SaveRequest( + source.customerId(), source.customerName(), source.transportMode(), source.tradeTerm(), + source.destinationCountryCode(), source.destinationWarehouseId(), source.destinationWarehouseName(), + source.expectedShipDate(), source.customerRemark(), source.sender(), source.receiver(), source.cargoes(), + source.pickupMethod(), source.receivingWarehouseId(), source.receivingWarehouseName(), + source.channelCode(), source.channelName(), source.carrierId(), source.carrierName(), source.taxMode(), + source.pricingTaxMode(), source.containerMode(), source.customsInspection(), source.destinationType(), + amazonWarehouseCode, shipmentId, referenceId); + } + private OrderMasterDataGuard.Snapshots snapshots() { return snapshots(new PartnerClient.Partner(7L, 0L, "客户", "ACTIVE", "SHIPPER", List.of("SHIPPER"))); } diff --git a/reports/admin-test-env-acceptance-20260808013719.json b/reports/admin-test-env-acceptance-20260808013719.json new file mode 100644 index 000000000..687d2b19b --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808013719.json @@ -0,0 +1,714 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808013719156", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:37:20.808Z", + "startedAt": "2026-08-08T01:37:19.156Z", + "success": false, + "fatal": null, + "summary": { + "total": 36, + "passed": 28, + "failed": 8 + }, + "modules": [ + { + "name": "customers", + "startedAt": "2026-08-08T01:37:19.675Z", + "finishedAt": "2026-08-08T01:37:20.808Z", + "success": false, + "passed": 27, + "failed": 8, + "fatal": null + } + ], + "scenarios": [ + { + "name": "customer-dimension-rules", + "module": "customers", + "success": false, + "deploymentBlocked": true, + "passed": 10, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "规则行 ID、tenantId 为字符串且初始版本为0", + "evidence": "groupTenantIdType=string, rows=string/undefined/v0,string/undefined/v0,string/undefined/v0,string/undefined/v0", + "code": "200", + "requestId": "21161286-1dac-4fd6-838e-5ff5a3366392, 243dcd3d-3ea2-4bfa-b7bd-976f13eb3fbf", + "traceId": "e7a484b82ca844ac933c14482228c3ce" + } + ], + "createdResources": { + "customer": { + "tenantId": "2085903147058450433", + "marker": "ADMIN-API-20260808013719156", + "contactPhone": "16153039675" + } + }, + "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": "b32bc7f2-2d2e-4db2-b3d2-a487433106de, 06ecaa92-97c9-4ad7-afa4-94e79cc325d8", + "traceId": "b9c74369c3aa4120836782c7bd47c9cf", + "evidence": "", + "checkedAt": "2026-08-08T01:37:19.674Z" + }, + { + "module": "customers", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16153039675" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "279a04a4-642b-47d3-9e86-530c3e473aeb, 08930ade-8e5f-4ec4-bc07-944c224c86a2", + "traceId": "4cd28b1dcdbe4f979157a834d7d4331b", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T01:37:19.790Z" + }, + { + "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": "5fafeaeb-3e78-4bd4-9287-1ec9cb01ffe1, 9d539168-3722-4b4b-b80f-3bbdb77239e9", + "traceId": "319ec1d18c124a1eb1b4dc0e4d83e4c3", + "evidence": "", + "checkedAt": "2026-08-08T01:37:19.874Z" + }, + { + "module": "customers", + "scenario": null, + "name": "创建响应客户字段完整", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5fafeaeb-3e78-4bd4-9287-1ec9cb01ffe1, 9d539168-3722-4b4b-b80f-3bbdb77239e9", + "traceId": "319ec1d18c124a1eb1b4dc0e4d83e4c3", + "evidence": "missing=unifiedSocialCreditCode,approvedAt", + "checkedAt": "2026-08-08T01:37:19.874Z" + }, + { + "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": "5fafeaeb-3e78-4bd4-9287-1ec9cb01ffe1, 9d539168-3722-4b4b-b80f-3bbdb77239e9", + "traceId": "319ec1d18c124a1eb1b4dc0e4d83e4c3", + "evidence": "tenantId=2085903147058450433, status=PROFILE_REQUIRED", + "checkedAt": "2026-08-08T01:37:19.874Z" + }, + { + "module": "customers", + "scenario": null, + "name": "创建客户生成初始密码", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5fafeaeb-3e78-4bd4-9287-1ec9cb01ffe1, 9d539168-3722-4b4b-b80f-3bbdb77239e9", + "traceId": "319ec1d18c124a1eb1b4dc0e4d83e4c3", + "evidence": "generated=false, length=0", + "checkedAt": "2026-08-08T01:37:19.874Z" + }, + { + "module": "customers", + "scenario": null, + "name": "管理员用户名默认使用联系电话", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5fafeaeb-3e78-4bd4-9287-1ec9cb01ffe1, 9d539168-3722-4b4b-b80f-3bbdb77239e9", + "traceId": "319ec1d18c124a1eb1b4dc0e4d83e4c3", + "evidence": "matches=false", + "checkedAt": "2026-08-08T01:37:19.874Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "新客户尺寸规则可查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21161286-1dac-4fd6-838e-5ff5a3366392, 243dcd3d-3ea2-4bfa-b7bd-976f13eb3fbf", + "traceId": "e7a484b82ca844ac933c14482228c3ce", + "evidence": "tenantId=2085903147058450433", + "checkedAt": "2026-08-08T01:37:19.920Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "固定四箱规顺序完整且无重复", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21161286-1dac-4fd6-838e-5ff5a3366392, 243dcd3d-3ea2-4bfa-b7bd-976f13eb3fbf", + "traceId": "e7a484b82ca844ac933c14482228c3ce", + "evidence": "count=4, order=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T01:37:19.920Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "四箱规默认内径、加边和备注正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21161286-1dac-4fd6-838e-5ff5a3366392, 243dcd3d-3ea2-4bfa-b7bd-976f13eb3fbf", + "traceId": "e7a484b82ca844ac933c14482228c3ce", + "evidence": "defaults=matched", + "checkedAt": "2026-08-08T01:37:19.920Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "规则行 ID、tenantId 为字符串且初始版本为0", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21161286-1dac-4fd6-838e-5ff5a3366392, 243dcd3d-3ea2-4bfa-b7bd-976f13eb3fbf", + "traceId": "e7a484b82ca844ac933c14482228c3ce", + "evidence": "groupTenantIdType=string, rows=string/undefined/v0,string/undefined/v0,string/undefined/v0,string/undefined/v0", + "checkedAt": "2026-08-08T01:37:19.920Z" + }, + { + "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=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21161286-1dac-4fd6-838e-5ff5a3366392, 243dcd3d-3ea2-4bfa-b7bd-976f13eb3fbf", + "traceId": "e7a484b82ca844ac933c14482228c3ce", + "evidence": "derivedRows=4", + "checkedAt": "2026-08-08T01:37:19.920Z" + }, + { + "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=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21161286-1dac-4fd6-838e-5ff5a3366392, 243dcd3d-3ea2-4bfa-b7bd-976f13eb3fbf", + "traceId": "e7a484b82ca844ac933c14482228c3ce", + "evidence": "fields=boxType,innerLengthCm,innerWidthCm,innerHeightCm,edgeAdditionCm,remark,version", + "checkedAt": "2026-08-08T01:37:19.920Z" + }, + { + "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=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2da22620-8e23-4cb5-830d-09b0c7abebd8, e01048dc-e5b7-41dc-9537-ff47e713dcb6", + "traceId": "5d1ecdf1289a4d55a90368d1a397ec8e", + "evidence": "rows=4", + "checkedAt": "2026-08-08T01:37:19.993Z" + }, + { + "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=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2da22620-8e23-4cb5-830d-09b0c7abebd8, e01048dc-e5b7-41dc-9537-ff47e713dcb6", + "traceId": "5d1ecdf1289a4d55a90368d1a397ec8e", + "evidence": "versions=1,1,1,1", + "checkedAt": "2026-08-08T01:37:19.993Z" + }, + { + "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=2085903147058450433" + }, + "http": 200, + "code": "A0409", + "message": "箱规尺寸配置已被修改,请刷新后重试", + "requestId": "9dc714d8-e24e-4466-a2a1-0916180b4b2e", + "traceId": "907d64457fb2470f8c536b394efe67d6", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:37:20.072Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突后重新查询四条规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "70ee21a4-f9bb-4b47-b102-9161cad9e95c, c54ecf0e-a981-432f-9cfe-84dd2e92eca5", + "traceId": "c593da8cca8840d398a1fec59e792ae9", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.125Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突请求未造成四行部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "70ee21a4-f9bb-4b47-b102-9161cad9e95c, c54ecf0e-a981-432f-9cfe-84dd2e92eca5", + "traceId": "c593da8cca8840d398a1fec59e792ae9", + "evidence": "unchangedRows=4", + "checkedAt": "2026-08-08T01:37:20.125Z" + }, + { + "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-808013719156" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "197c5762-b2f4-4d72-a576-5ab1b7db124e, abfe6a1b-b6f8-4723-858a-cfe509448f33", + "traceId": "a91f3982e2c3472ea094033eacb08832", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.168Z" + }, + { + "module": "customers", + "scenario": null, + "name": "列表包含新客户且字段完整", + "passed": false, + "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-808013719156" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "197c5762-b2f4-4d72-a576-5ab1b7db124e, abfe6a1b-b6f8-4723-858a-cfe509448f33", + "traceId": "a91f3982e2c3472ea094033eacb08832", + "evidence": "found=true, missing=unifiedSocialCreditCode,approvedAt", + "checkedAt": "2026-08-08T01:37:20.168Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6fc40aa0-8e0e-448f-9585-ea1e906d416d, c7649135-2a3e-4400-bb90-72075c23e23c", + "traceId": "4d208b9fa2ea4268834af84d42aac20d", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.240Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户详情基本信息正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6fc40aa0-8e0e-448f-9585-ea1e906d416d, c7649135-2a3e-4400-bb90-72075c23e23c", + "traceId": "4d208b9fa2ea4268834af84d42aac20d", + "evidence": "tenantId=2085903147058450433", + "checkedAt": "2026-08-08T01:37:20.240Z" + }, + { + "module": "customers", + "scenario": null, + "name": "编辑客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2eabab50-7229-4ae0-8792-eca6e6d35bc5, 5dc4a056-69d1-458b-aa73-b62a1768f508", + "traceId": "f151d4a7d60b4393848113c0a2e47c8a", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.340Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2eabab50-7229-4ae0-8792-eca6e6d35bc5, 5dc4a056-69d1-458b-aa73-b62a1768f508", + "traceId": "f151d4a7d60b4393848113c0a2e47c8a", + "evidence": "tenantId=2085903147058450433", + "checkedAt": "2026-08-08T01:37:20.340Z" + }, + { + "module": "customers", + "scenario": null, + "name": "回查客户编辑结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c99e7d20-30f3-453e-adf7-81617c0202be, 5e4b928d-dc03-40a9-b7ac-b57928563861", + "traceId": "8fc0982f732a4cbeb01f75b1ce2fa200", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.501Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c99e7d20-30f3-453e-adf7-81617c0202be, 5e4b928d-dc03-40a9-b7ac-b57928563861", + "traceId": "8fc0982f732a4cbeb01f75b1ce2fa200", + "evidence": "tenantId=2085903147058450433", + "checkedAt": "2026-08-08T01:37:20.501Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询资质", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d87dbe3e-de44-441d-816c-e1ee1a371b29, bee8d393-a7f5-4341-94ce-eaf673f193ce", + "traceId": "756ebff2cc9f4f1eac1e4f9d8a633a76", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.554Z" + }, + { + "module": "customers", + "scenario": null, + "name": "资质概况结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d87dbe3e-de44-441d-816c-e1ee1a371b29, bee8d393-a7f5-4341-94ce-eaf673f193ce", + "traceId": "756ebff2cc9f4f1eac1e4f9d8a633a76", + "evidence": "count=0", + "checkedAt": "2026-08-08T01:37:20.554Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询成员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2439e6c5-6ae9-4fb7-819d-93cca240bae6, 43d3143c-ff79-4de0-9cf7-575d214c8a07", + "traceId": "be4bfdad721641ca8fd24db9ebfc85cb", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.643Z" + }, + { + "module": "customers", + "scenario": null, + "name": "联系电话账号是企业管理员", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085903147058450433/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2439e6c5-6ae9-4fb7-819d-93cca240bae6, 43d3143c-ff79-4de0-9cf7-575d214c8a07", + "traceId": "be4bfdad721641ca8fd24db9ebfc85cb", + "evidence": "ownerFound=false, matches=false", + "checkedAt": "2026-08-08T01:37:20.643Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询运单数量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4ba32e71-b9ea-412d-8d26-bade4ce94874, 5e539bbf-cddb-43bf-9d65-f89060e2c12d", + "traceId": "4906a891015d469a976af95d08f3be10", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.705Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况返回当前客户运单数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085903147058450433" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4ba32e71-b9ea-412d-8d26-bade4ce94874, 5e539bbf-cddb-43bf-9d65-f89060e2c12d", + "traceId": "4906a891015d469a976af95d08f3be10", + "evidence": "orderCount=0", + "checkedAt": "2026-08-08T01:37:20.705Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户运单记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085903147058450433&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6cf876bf-1fd5-4f72-a655-3ad61ec38758, efcc42ca-fd26-4346-a8c5-cb3b1378442b", + "traceId": "bb1beb549cd342d4a54afa9279507525", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.754Z" + }, + { + "module": "customers", + "scenario": null, + "name": "运单记录分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085903147058450433&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6cf876bf-1fd5-4f72-a655-3ad61ec38758, efcc42ca-fd26-4346-a8c5-cb3b1378442b", + "traceId": "bb1beb549cd342d4a54afa9279507525", + "evidence": "records=0, total=0", + "checkedAt": "2026-08-08T01:37:20.754Z" + }, + { + "module": "customers", + "scenario": null, + "name": "停用客户", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085903147058450433/status" + }, + "http": 200, + "code": "A0409", + "message": "Tenant status must be changed through review / 当前租户状态必须通过审核流程变更", + "requestId": "9bc5cbb7-0a5b-4dfc-b560-7c07af10fd7c", + "traceId": "592ca8eb0d354c82b041b8fcdcca6f39", + "evidence": "", + "checkedAt": "2026-08-08T01:37:20.808Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户停用状态正确", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085903147058450433/status" + }, + "http": 200, + "code": "A0409", + "message": "Tenant status must be changed through review / 当前租户状态必须通过审核流程变更", + "requestId": "9bc5cbb7-0a5b-4dfc-b560-7c07af10fd7c", + "traceId": "592ca8eb0d354c82b041b8fcdcca6f39", + "evidence": "status=missing", + "checkedAt": "2026-08-08T01:37:20.808Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808014241.json b/reports/admin-test-env-acceptance-20260808014241.json new file mode 100644 index 000000000..36be9eee0 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808014241.json @@ -0,0 +1,811 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808014241953", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:42:44.907Z", + "startedAt": "2026-08-08T01:42:41.953Z", + "success": false, + "fatal": null, + "summary": { + "total": 42, + "passed": 38, + "failed": 4 + }, + "modules": [ + { + "name": "system", + "startedAt": "2026-08-08T01:42:42.321Z", + "finishedAt": "2026-08-08T01:42:44.907Z", + "success": false, + "passed": 37, + "failed": 4, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": { + "systemPermission": { + "id": "2085904500002508801", + "code": "platform:acceptance:808014241953" + }, + "systemRole": { + "id": "2085904500719734785", + "code": "ADMIN_ACCEPT_808014241953" + }, + "systemUser": { + "membershipId": "2085904502246461444", + "username": "admin_accept_808014241953", + "finalStatus": "DISABLED" + } + }, + "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": "4c49a105-97ea-4dea-8fee-0736c80c118a, 72186a54-d723-44bb-9d17-fc19f6ea8a02", + "traceId": "67f637fdf2d441748c50d3de0b8cb354", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.320Z" + }, + { + "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": "e36f26a6-bc74-4948-9af7-bf3c492a40e0, a591dd23-109a-4a02-9279-19b6d0227c59", + "traceId": "8377b21d52d44447911e167eae2ac593", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.376Z" + }, + { + "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": "e36f26a6-bc74-4948-9af7-bf3c492a40e0, a591dd23-109a-4a02-9279-19b6d0227c59", + "traceId": "8377b21d52d44447911e167eae2ac593", + "evidence": "count=117", + "checkedAt": "2026-08-08T01:42:42.376Z" + }, + { + "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": "f48c31c1-3964-4472-bf35-c95b0dd825fe, 7d789d67-c137-4ff3-9320-f2c401480661", + "traceId": "5de16dae865440ddaae00d5fe095c028", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.422Z" + }, + { + "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": "f48c31c1-3964-4472-bf35-c95b0dd825fe, 7d789d67-c137-4ff3-9320-f2c401480661", + "traceId": "5de16dae865440ddaae00d5fe095c028", + "evidence": "permissionId=2085904500002508801", + "checkedAt": "2026-08-08T01:42:42.422Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑自定义权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085904500002508801" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "11a26c6b-6bee-41ec-8cd7-3d9fac7dca0f, 0c63ba1f-5132-4b4b-a16a-a7fa213872d0", + "traceId": "585636101cf84d279a9970c7f1dbd719", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.469Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085904500002508801" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "11a26c6b-6bee-41ec-8cd7-3d9fac7dca0f, 0c63ba1f-5132-4b4b-a16a-a7fa213872d0", + "traceId": "585636101cf84d279a9970c7f1dbd719", + "evidence": "permissionId=2085904500002508801", + "checkedAt": "2026-08-08T01:42:42.470Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085904500002508801/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f62d27df-0be8-41b8-88c3-73cecd3181ee, ea26caa1-a419-446c-b69a-379e623a57d0", + "traceId": "142ba41e18454d84893bf68e1d283d4d", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.512Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085904500002508801/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f62d27df-0be8-41b8-88c3-73cecd3181ee, ea26caa1-a419-446c-b69a-379e623a57d0", + "traceId": "142ba41e18454d84893bf68e1d283d4d", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:42:42.512Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085904500002508801/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "313b41b0-85e4-4c89-9cd1-00170e341923, 3db0b9af-4cb3-4150-825f-3cfafd49afb9", + "traceId": "37f04009ef6c4689b3c9079d58017cf1", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.557Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085904500002508801/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "313b41b0-85e4-4c89-9cd1-00170e341923, 3db0b9af-4cb3-4150-825f-3cfafd49afb9", + "traceId": "37f04009ef6c4689b3c9079d58017cf1", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T01:42:42.557Z" + }, + { + "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": "8511affb-21aa-4323-9f68-1685c6f236cb, 46d1d027-ce93-46f2-b0a1-6d7eb866d4b8", + "traceId": "a1a643e9f6754cde95fc3c2c41bd7ba8", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.595Z" + }, + { + "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": "8511affb-21aa-4323-9f68-1685c6f236cb, 46d1d027-ce93-46f2-b0a1-6d7eb866d4b8", + "traceId": "a1a643e9f6754cde95fc3c2c41bd7ba8", + "evidence": "roleId=2085904500719734785", + "checkedAt": "2026-08-08T01:42:42.595Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085904500719734785" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fce1fefc-38bb-4ccd-99a9-fc26ad81ec82, 7c15617e-2dab-48d7-b3ab-ecf90d56e5f2", + "traceId": "dbc1a05a1a7f44eea694561a34fe227d", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.644Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085904500719734785" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fce1fefc-38bb-4ccd-99a9-fc26ad81ec82, 7c15617e-2dab-48d7-b3ab-ecf90d56e5f2", + "traceId": "dbc1a05a1a7f44eea694561a34fe227d", + "evidence": "roleId=2085904500719734785", + "checkedAt": "2026-08-08T01:42:42.644Z" + }, + { + "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": "fcb6411b-ba1c-4bf3-977d-ef826667c70a, f4205f34-944d-49a4-870b-f2e301a68f98", + "traceId": "64504abb7fd248a288d14251aec09d16", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.690Z" + }, + { + "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": "d06e1ae9-d9db-49a2-bbc0-09fcbea5d3d9, 62f3ee28-4b68-4de5-b702-be727085ab5a", + "traceId": "3dae813f3d9a4433b2244c2e142ac4f8", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.722Z" + }, + { + "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": "d06e1ae9-d9db-49a2-bbc0-09fcbea5d3d9, 62f3ee28-4b68-4de5-b702-be727085ab5a", + "traceId": "3dae813f3d9a4433b2244c2e142ac4f8", + "evidence": "permissionIds=2085904500002508801", + "checkedAt": "2026-08-08T01:42:42.723Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085904500719734785/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ca6f833c-988a-4a5f-b6ee-22c83382d1f5, 1dd1994b-cf4e-4f29-b339-12472455c830", + "traceId": "ff4a67a10c31417c81c9104a0711a7f8", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.768Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085904500719734785/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ca6f833c-988a-4a5f-b6ee-22c83382d1f5, 1dd1994b-cf4e-4f29-b339-12472455c830", + "traceId": "ff4a67a10c31417c81c9104a0711a7f8", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:42:42.768Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085904500719734785/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cadd6dab-03cb-444a-ba06-fdf5b86b590f, 63df40e8-b0db-4a47-bd03-5c0c368d2cb5", + "traceId": "06d30283bd724e808f13cfad977a2774", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.809Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085904500719734785/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cadd6dab-03cb-444a-ba06-fdf5b86b590f, 63df40e8-b0db-4a47-bd03-5c0c368d2cb5", + "traceId": "06d30283bd724e808f13cfad977a2774", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T01:42:42.809Z" + }, + { + "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": "e33e566e-3092-46da-86cb-c474c8df6d0b, c29248bd-1584-4274-a8d6-14ed0968cf1c", + "traceId": "793d2b8ee3ed4a179ee1476be55ca06b", + "evidence": "", + "checkedAt": "2026-08-08T01:42:42.853Z" + }, + { + "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": "e33e566e-3092-46da-86cb-c474c8df6d0b, c29248bd-1584-4274-a8d6-14ed0968cf1c", + "traceId": "793d2b8ee3ed4a179ee1476be55ca06b", + "evidence": "tenants=1, roles=5", + "checkedAt": "2026-08-08T01:42:42.853Z" + }, + { + "module": "system", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16153362853" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "71fbc173-8c2f-42cd-a90f-66da41cd0f90, fdc437e8-6a73-4da1-8825-0da398a57849", + "traceId": "d8b5129ade20418fa8b33dfb7d70d994", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T01:42:42.908Z" + }, + { + "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": "f62c3b70-358e-4c0d-9ab8-87818d12fcb7, ef8398dd-3382-4746-a392-b514e79bcf36", + "traceId": "07c0df68cf2c470f816cbf06d1220f29", + "evidence": "", + "checkedAt": "2026-08-08T01:42:43.300Z" + }, + { + "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": "f62c3b70-358e-4c0d-9ab8-87818d12fcb7, ef8398dd-3382-4746-a392-b514e79bcf36", + "traceId": "07c0df68cf2c470f816cbf06d1220f29", + "evidence": "membershipId=2085904502246461444", + "checkedAt": "2026-08-08T01:42:43.300Z" + }, + { + "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_808014241953" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "24d51f86-af43-4a2a-b953-f9bcb57f1639, dfe7e908-1437-48dd-ba63-ac82d87291ff", + "traceId": "553ba9d384834849aa038240a317c3e3", + "evidence": "", + "checkedAt": "2026-08-08T01:42:43.346Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户列表包含新账号且字段完整", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=20&keyword=admin_accept_808014241953" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "24d51f86-af43-4a2a-b953-f9bcb57f1639, dfe7e908-1437-48dd-ba63-ac82d87291ff", + "traceId": "553ba9d384834849aa038240a317c3e3", + "evidence": "records=1", + "checkedAt": "2026-08-08T01:42:43.346Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085904502246461444" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "68357647-6e2c-477b-bca6-355c2ac8c336, 8abe4456-e213-449d-8f95-f5a7aa8cd269", + "traceId": "3db6a0906cbe4a84a6857fb4e7f36590", + "evidence": "", + "checkedAt": "2026-08-08T01:42:43.511Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085904502246461444" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "68357647-6e2c-477b-bca6-355c2ac8c336, 8abe4456-e213-449d-8f95-f5a7aa8cd269", + "traceId": "3db6a0906cbe4a84a6857fb4e7f36590", + "evidence": "membershipId=2085904502246461444", + "checkedAt": "2026-08-08T01:42:43.511Z" + }, + { + "module": "system", + "scenario": null, + "name": "新建内部用户可使用初始密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5511e82f-3d3e-4684-b19e-fd546995d376, 922bfcd5-e74f-4301-8109-341b9f0f4c70", + "traceId": "cbb48c8b80814e8ab54653d07691886d", + "evidence": "username=admin_accept_808014241953", + "checkedAt": "2026-08-08T01:42:43.854Z" + }, + { + "module": "system", + "scenario": null, + "name": "重置平台内部用户密码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085904502246461444/password" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6c82688d-5c61-42b0-898e-df93f46472c1, f4814fac-39a0-4274-9d7e-1b4622b3c253", + "traceId": "7a921093f9254c74bdee43dbb4d4fed4", + "evidence": "", + "checkedAt": "2026-08-08T01:42:44.270Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户使用重置密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0ba5839-c929-46b1-b88d-3b9efd55631f, a1f453b3-e0e4-48e1-af8b-f39e8e329d33", + "traceId": "29e4cadeb808446bbea7ce36dc0e8c1d", + "evidence": "username=admin_accept_808014241953", + "checkedAt": "2026-08-08T01:42:44.608Z" + }, + { + "module": "system", + "scenario": null, + "name": "清空测试用户角色", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085904502246461444" + }, + "http": 200, + "code": "A0400", + "message": "请选择角色", + "requestId": "395f3729-59d8-4318-8635-2e982d65689b", + "traceId": "939f0b64578644f48ad600c6c71945ef", + "evidence": "", + "checkedAt": "2026-08-08T01:42:44.635Z" + }, + { + "module": "system", + "scenario": null, + "name": "测试用户角色已清空", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085904502246461444" + }, + "http": 200, + "code": "A0400", + "message": "请选择角色", + "requestId": "395f3729-59d8-4318-8635-2e982d65689b", + "traceId": "939f0b64578644f48ad600c6c71945ef", + "evidence": "roleCount=n/a", + "checkedAt": "2026-08-08T01:42:44.635Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085904502246461444/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "40821960-2d23-48db-8e38-a8ccf2e86bfa, abe3d3aa-b6e5-4c0c-ac15-e504bf62755e", + "traceId": "8fd0f9b1fd6c43a188373514dd8608a1", + "evidence": "", + "checkedAt": "2026-08-08T01:42:44.763Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户停用状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085904502246461444/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "40821960-2d23-48db-8e38-a8ccf2e86bfa, abe3d3aa-b6e5-4c0c-ac15-e504bf62755e", + "traceId": "8fd0f9b1fd6c43a188373514dd8608a1", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:42:44.763Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用用户禁止登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "1f6bc9f9-775d-48fe-98da-ce14dda250bd", + "traceId": "2dcc3aa5601b45ed9156cc891a552355", + "evidence": "HTTP=200, code=A0403", + "checkedAt": "2026-08-08T01:42:44.784Z" + }, + { + "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": "bbbeb1a1-67aa-460e-98b1-a1812794bca2, 10868182-906f-46ac-8748-ca18bfce29a8", + "traceId": "ebe468e6eb214e0d8e34d2e2ba59c883", + "evidence": "", + "checkedAt": "2026-08-08T01:42:44.829Z" + }, + { + "module": "system", + "scenario": null, + "name": "删除临时测试角色", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/roles/2085904500719734785" + }, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "b3b98661-969b-415c-a3f9-2a1f70157be7", + "traceId": "0e2cbc17e3a74107af588bda5a93af0e", + "evidence": "", + "checkedAt": "2026-08-08T01:42:44.870Z" + }, + { + "module": "system", + "scenario": null, + "name": "删除临时权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/permissions/2085904500002508801" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eef358f2-dcd2-40db-86ce-bf615ad78de7, b6858e45-82fc-4e16-94ac-2b25c056d16f", + "traceId": "921ba4d6c2cd46779d63851ae9b1617e", + "evidence": "", + "checkedAt": "2026-08-08T01:42:44.907Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808014935.json b/reports/admin-test-env-acceptance-20260808014935.json new file mode 100644 index 000000000..c9412b04f --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808014935.json @@ -0,0 +1,740 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808014935078", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:49:35.989Z", + "startedAt": "2026-08-08T01:49:35.078Z", + "success": false, + "fatal": null, + "summary": { + "total": 38, + "passed": 31, + "failed": 7 + }, + "modules": [ + { + "name": "customers", + "startedAt": "2026-08-08T01:49:35.449Z", + "finishedAt": "2026-08-08T01:49:35.989Z", + "success": false, + "passed": 30, + "failed": 7, + "fatal": null + } + ], + "scenarios": [ + { + "name": "customer-dimension-rules", + "module": "customers", + "success": true, + "deploymentBlocked": false, + "passed": 13, + "failed": 0 + } + ], + "deploymentBlockers": [], + "createdResources": { + "customer": { + "tenantId": "2085906232656908290", + "marker": "ADMIN-API-20260808014935078", + "contactPhone": "16153775449" + } + }, + "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": "a720a97c-bbdd-4de5-89de-b48a88173ee3, 5b4d1342-f103-468c-a99f-88cb1fba5f1b", + "traceId": "af52909ad7e145c9a94cbe28b895aa3b", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.449Z" + }, + { + "module": "customers", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16153775449" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a1184143-913e-4721-8321-74a93b3a71ee, bbd21c85-e5ed-4011-9414-638be1043067", + "traceId": "2821f39b6a94496ebc93303e54f46dae", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T01:49:35.491Z" + }, + { + "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": "9cda04a4-3646-4f69-9c01-aebd7118fd22, bab83655-d9b4-4420-aecf-aa01328d6a30", + "traceId": "b6aca188f51f4455a145a1782677f971", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.531Z" + }, + { + "module": "customers", + "scenario": null, + "name": "创建响应客户字段完整", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9cda04a4-3646-4f69-9c01-aebd7118fd22, bab83655-d9b4-4420-aecf-aa01328d6a30", + "traceId": "b6aca188f51f4455a145a1782677f971", + "evidence": "missing=unifiedSocialCreditCode,approvedAt", + "checkedAt": "2026-08-08T01:49:35.531Z" + }, + { + "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": "9cda04a4-3646-4f69-9c01-aebd7118fd22, bab83655-d9b4-4420-aecf-aa01328d6a30", + "traceId": "b6aca188f51f4455a145a1782677f971", + "evidence": "tenantId=2085906232656908290, status=PROFILE_REQUIRED", + "checkedAt": "2026-08-08T01:49:35.531Z" + }, + { + "module": "customers", + "scenario": null, + "name": "创建客户生成初始密码", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9cda04a4-3646-4f69-9c01-aebd7118fd22, bab83655-d9b4-4420-aecf-aa01328d6a30", + "traceId": "b6aca188f51f4455a145a1782677f971", + "evidence": "generated=false, length=0", + "checkedAt": "2026-08-08T01:49:35.531Z" + }, + { + "module": "customers", + "scenario": null, + "name": "管理员用户名默认使用联系电话", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9cda04a4-3646-4f69-9c01-aebd7118fd22, bab83655-d9b4-4420-aecf-aa01328d6a30", + "traceId": "b6aca188f51f4455a145a1782677f971", + "evidence": "matches=false", + "checkedAt": "2026-08-08T01:49:35.531Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "新客户尺寸规则可查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a9fab6f-d233-49ce-9671-ee18d65c6d17, 14909cd4-8d05-4406-8ef3-1bff5303a410", + "traceId": "837808a650b4498dabac6a48b9c8d91b", + "evidence": "tenantId=2085906232656908290", + "checkedAt": "2026-08-08T01:49:35.569Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "固定四箱规顺序完整且无重复", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a9fab6f-d233-49ce-9671-ee18d65c6d17, 14909cd4-8d05-4406-8ef3-1bff5303a410", + "traceId": "837808a650b4498dabac6a48b9c8d91b", + "evidence": "count=4, order=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T01:49:35.569Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "四箱规默认内径、加边和备注正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a9fab6f-d233-49ce-9671-ee18d65c6d17, 14909cd4-8d05-4406-8ef3-1bff5303a410", + "traceId": "837808a650b4498dabac6a48b9c8d91b", + "evidence": "defaults=matched", + "checkedAt": "2026-08-08T01:49:35.569Z" + }, + { + "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=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a9fab6f-d233-49ce-9671-ee18d65c6d17, 14909cd4-8d05-4406-8ef3-1bff5303a410", + "traceId": "837808a650b4498dabac6a48b9c8d91b", + "evidence": "groupTenantIdType=string, rows=string/v0,string/v0,string/v0,string/v0", + "checkedAt": "2026-08-08T01:49:35.569Z" + }, + { + "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=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a9fab6f-d233-49ce-9671-ee18d65c6d17, 14909cd4-8d05-4406-8ef3-1bff5303a410", + "traceId": "837808a650b4498dabac6a48b9c8d91b", + "evidence": "derivedRows=4", + "checkedAt": "2026-08-08T01:49:35.569Z" + }, + { + "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=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a9fab6f-d233-49ce-9671-ee18d65c6d17, 14909cd4-8d05-4406-8ef3-1bff5303a410", + "traceId": "837808a650b4498dabac6a48b9c8d91b", + "evidence": "fields=boxType,innerLengthCm,innerWidthCm,innerHeightCm,edgeAdditionCm,remark,version", + "checkedAt": "2026-08-08T01:49:35.569Z" + }, + { + "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=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0a02678d-9b08-481c-83fd-e49aca8f95d1, f80c147e-57d2-48d2-87bd-41e7cfc20ec9", + "traceId": "d7d775ad69294342a0fa7ecab51f0371", + "evidence": "rows=4", + "checkedAt": "2026-08-08T01:49:35.610Z" + }, + { + "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=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0a02678d-9b08-481c-83fd-e49aca8f95d1, f80c147e-57d2-48d2-87bd-41e7cfc20ec9", + "traceId": "d7d775ad69294342a0fa7ecab51f0371", + "evidence": "versions=1,1,1,1", + "checkedAt": "2026-08-08T01:49:35.610Z" + }, + { + "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=2085906232656908290" + }, + "http": 200, + "code": "A0409", + "message": "箱规尺寸配置已被修改,请刷新后重试", + "requestId": "66ea1f92-f817-495f-b853-7cd32cca4c6c", + "traceId": "c7eccaf37e5541f6bd7e862858e585e1", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:49:35.648Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突后重新查询四条规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "333d1f5e-57a0-4ff8-a206-8f928bae7aa3, 4029e9ab-3e95-46e5-856e-687d3769e02b", + "traceId": "0d610b96e002491fa9877bf1e8a17531", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.674Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突请求未造成四行部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "333d1f5e-57a0-4ff8-a206-8f928bae7aa3, 4029e9ab-3e95-46e5-856e-687d3769e02b", + "traceId": "0d610b96e002491fa9877bf1e8a17531", + "evidence": "unchangedRows=4", + "checkedAt": "2026-08-08T01:49:35.674Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "恢复本轮修改前的四箱规配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "94733cd5-bdae-4180-8718-28e6ab4a1403, bc0f1db1-9cee-49ec-94e3-ebb3edce4a6e", + "traceId": "bc83db99ee44415c88262aeda0c5986e", + "evidence": "restore=original-values", + "checkedAt": "2026-08-08T01:49:35.718Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "尺寸规则恢复后回显与初始值一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "94733cd5-bdae-4180-8718-28e6ab4a1403, bc0f1db1-9cee-49ec-94e3-ebb3edce4a6e", + "traceId": "bc83db99ee44415c88262aeda0c5986e", + "evidence": "restoredRows=4", + "checkedAt": "2026-08-08T01:49:35.718Z" + }, + { + "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-808014935078" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b15d5d78-27cb-4f70-9539-bc9782fa9d4d, becba750-039d-45f3-9232-d234a0822d75", + "traceId": "b164e91b4b5d4a71b0e33f7a58547796", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.761Z" + }, + { + "module": "customers", + "scenario": null, + "name": "列表包含新客户且字段完整", + "passed": false, + "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-808014935078" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b15d5d78-27cb-4f70-9539-bc9782fa9d4d, becba750-039d-45f3-9232-d234a0822d75", + "traceId": "b164e91b4b5d4a71b0e33f7a58547796", + "evidence": "found=true, missing=unifiedSocialCreditCode,approvedAt", + "checkedAt": "2026-08-08T01:49:35.761Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aa331679-497b-4007-a2fb-da56e3cbbad4, f446df9f-2e1b-4d83-add1-89bd202e044b", + "traceId": "8b3768d937bf40fc95d56ad6d113a018", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.786Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户详情基本信息正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aa331679-497b-4007-a2fb-da56e3cbbad4, f446df9f-2e1b-4d83-add1-89bd202e044b", + "traceId": "8b3768d937bf40fc95d56ad6d113a018", + "evidence": "tenantId=2085906232656908290", + "checkedAt": "2026-08-08T01:49:35.786Z" + }, + { + "module": "customers", + "scenario": null, + "name": "编辑客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "52b27de8-d911-4e28-bf4e-6f0336de347a, 8fd191d9-9086-4947-809b-9566cfa8ef3f", + "traceId": "60335ad877ce4f2aab22a4b7a46ddea6", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.822Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "52b27de8-d911-4e28-bf4e-6f0336de347a, 8fd191d9-9086-4947-809b-9566cfa8ef3f", + "traceId": "60335ad877ce4f2aab22a4b7a46ddea6", + "evidence": "tenantId=2085906232656908290", + "checkedAt": "2026-08-08T01:49:35.822Z" + }, + { + "module": "customers", + "scenario": null, + "name": "回查客户编辑结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dddb9214-4e49-4700-a8c1-1b3251c1f770, c178d727-427f-498e-b9a2-53c147ce1d0f", + "traceId": "fa9b09a40152434ca0b84fed609b8135", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.847Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dddb9214-4e49-4700-a8c1-1b3251c1f770, c178d727-427f-498e-b9a2-53c147ce1d0f", + "traceId": "fa9b09a40152434ca0b84fed609b8135", + "evidence": "tenantId=2085906232656908290", + "checkedAt": "2026-08-08T01:49:35.847Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询资质", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "128ff201-0f6a-414e-9795-de0096fb3651, cd73f145-57fe-4868-ac80-2f17fe43e736", + "traceId": "3f8cc6b956e642bfae01be933562bcb5", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.868Z" + }, + { + "module": "customers", + "scenario": null, + "name": "资质概况结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "128ff201-0f6a-414e-9795-de0096fb3651, cd73f145-57fe-4868-ac80-2f17fe43e736", + "traceId": "3f8cc6b956e642bfae01be933562bcb5", + "evidence": "count=0", + "checkedAt": "2026-08-08T01:49:35.868Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询成员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "86b6120a-8875-4d54-8d31-be87136912a3, 004d2843-40b5-4f24-90d5-0a50fbfbff6a", + "traceId": "f209e87c6de4499d88c225d417aae147", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.895Z" + }, + { + "module": "customers", + "scenario": null, + "name": "联系电话账号是企业管理员", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085906232656908290/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "86b6120a-8875-4d54-8d31-be87136912a3, 004d2843-40b5-4f24-90d5-0a50fbfbff6a", + "traceId": "f209e87c6de4499d88c225d417aae147", + "evidence": "ownerFound=false, matches=false", + "checkedAt": "2026-08-08T01:49:35.895Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询运单数量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a1628f1c-7c0e-487e-9c73-bdb947e5b097, 7a56c8b1-45b6-43d1-a375-04b7931031d1", + "traceId": "a4702c0bc393445d9c87382fcb0b0967", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.927Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况返回当前客户运单数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085906232656908290" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a1628f1c-7c0e-487e-9c73-bdb947e5b097, 7a56c8b1-45b6-43d1-a375-04b7931031d1", + "traceId": "a4702c0bc393445d9c87382fcb0b0967", + "evidence": "orderCount=0", + "checkedAt": "2026-08-08T01:49:35.927Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户运单记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085906232656908290&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a451cd7f-d4ee-47e2-97cd-5a901cd94601, adc8098d-f2d4-4d63-aaf1-4de7bb39b09b", + "traceId": "6d7fff06ac24421e81fa29ff76d01452", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.961Z" + }, + { + "module": "customers", + "scenario": null, + "name": "运单记录分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085906232656908290&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a451cd7f-d4ee-47e2-97cd-5a901cd94601, adc8098d-f2d4-4d63-aaf1-4de7bb39b09b", + "traceId": "6d7fff06ac24421e81fa29ff76d01452", + "evidence": "records=0, total=0", + "checkedAt": "2026-08-08T01:49:35.961Z" + }, + { + "module": "customers", + "scenario": null, + "name": "停用客户", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085906232656908290/status" + }, + "http": 200, + "code": "A0409", + "message": "Tenant status must be changed through review / 当前租户状态必须通过审核流程变更", + "requestId": "523dda29-c36f-4292-b9f6-f8ff11252cf8", + "traceId": "d090c5e0512a485bb22b5747efe031c1", + "evidence": "", + "checkedAt": "2026-08-08T01:49:35.989Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户停用状态正确", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085906232656908290/status" + }, + "http": 200, + "code": "A0409", + "message": "Tenant status must be changed through review / 当前租户状态必须通过审核流程变更", + "requestId": "523dda29-c36f-4292-b9f6-f8ff11252cf8", + "traceId": "d090c5e0512a485bb22b5747efe031c1", + "evidence": "status=missing", + "checkedAt": "2026-08-08T01:49:35.989Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015022.json b/reports/admin-test-env-acceptance-20260808015022.json new file mode 100644 index 000000000..235b57148 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015022.json @@ -0,0 +1,813 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015022476", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:50:25.152Z", + "startedAt": "2026-08-08T01:50:22.476Z", + "success": false, + "fatal": null, + "summary": { + "total": 42, + "passed": 41, + "failed": 1 + }, + "modules": [ + { + "name": "system", + "startedAt": "2026-08-08T01:50:22.852Z", + "finishedAt": "2026-08-08T01:50:25.152Z", + "success": false, + "passed": 40, + "failed": 1, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": { + "systemPermission": { + "id": "2085906431492083713", + "code": "platform:acceptance:808015022476" + }, + "systemRole": { + "id": "2085906432268029954", + "code": "ADMIN_ACCEPT_808015022476", + "finalStatus": "DISABLED", + "retainedBecauseAssigned": true + }, + "systemUser": { + "membershipId": "2085906433278857219", + "username": "admin_accept_808015022476", + "finalStatus": "DISABLED" + } + }, + "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": "3862d908-e909-4dcf-b5d6-68c35c601997, 647660f1-adf0-4904-944b-825865155384", + "traceId": "05faac27686a4a039e64d757e0edd8e2", + "evidence": "", + "checkedAt": "2026-08-08T01:50:22.851Z" + }, + { + "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": "bc73da56-d8c6-4615-8925-35bd8c7fa80a, a42ef0ae-7ec7-43a3-855b-6942be136e1e", + "traceId": "2e7511f2161a43768f9657a203c8433b", + "evidence": "", + "checkedAt": "2026-08-08T01:50:22.898Z" + }, + { + "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": "bc73da56-d8c6-4615-8925-35bd8c7fa80a, a42ef0ae-7ec7-43a3-855b-6942be136e1e", + "traceId": "2e7511f2161a43768f9657a203c8433b", + "evidence": "count=117", + "checkedAt": "2026-08-08T01:50:22.898Z" + }, + { + "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": "7ea9f445-9c49-4d4e-aa08-da5a1c43625e, 49dd870b-d91c-4d1c-b331-dfc83546aeb7", + "traceId": "eb56fb23c9894fd0be9ad81c740bbef6", + "evidence": "", + "checkedAt": "2026-08-08T01:50:22.924Z" + }, + { + "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": "7ea9f445-9c49-4d4e-aa08-da5a1c43625e, 49dd870b-d91c-4d1c-b331-dfc83546aeb7", + "traceId": "eb56fb23c9894fd0be9ad81c740bbef6", + "evidence": "permissionId=2085906431492083713", + "checkedAt": "2026-08-08T01:50:22.924Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑自定义权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906431492083713" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "557ae432-4a69-4fbe-aaec-cfb8aa9dad96, eb9bd580-1281-4374-a1f6-11ef3e688a4e", + "traceId": "1750b227fa944d4cb7da19a7ec3f34bd", + "evidence": "", + "checkedAt": "2026-08-08T01:50:22.962Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906431492083713" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "557ae432-4a69-4fbe-aaec-cfb8aa9dad96, eb9bd580-1281-4374-a1f6-11ef3e688a4e", + "traceId": "1750b227fa944d4cb7da19a7ec3f34bd", + "evidence": "permissionId=2085906431492083713", + "checkedAt": "2026-08-08T01:50:22.962Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906431492083713/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "416a1c59-2f93-4a5d-97b0-a74fbd8641f5, f4327630-ab04-4de6-8e67-10c6f79026e1", + "traceId": "ecf8f3f2dccd4aeeb1d44720c6a51fbe", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.001Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906431492083713/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "416a1c59-2f93-4a5d-97b0-a74fbd8641f5, f4327630-ab04-4de6-8e67-10c6f79026e1", + "traceId": "ecf8f3f2dccd4aeeb1d44720c6a51fbe", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:50:23.001Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906431492083713/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b2c70c80-3b83-47b5-836f-34ab2c25e844, 88c210bd-8da4-4918-a4ad-864d3b5f5feb", + "traceId": "b3aa4cb6548f474e81170fa29ee8adfb", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.069Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906431492083713/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b2c70c80-3b83-47b5-836f-34ab2c25e844, 88c210bd-8da4-4918-a4ad-864d3b5f5feb", + "traceId": "b3aa4cb6548f474e81170fa29ee8adfb", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T01:50:23.069Z" + }, + { + "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": "b8cd050d-4490-4e67-a8b1-ae1863ae9a19, 185c5c9e-00f9-4eb2-879e-ef1c6787ed8a", + "traceId": "c4bee06eed6643259949d1b59cae4b58", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.109Z" + }, + { + "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": "b8cd050d-4490-4e67-a8b1-ae1863ae9a19, 185c5c9e-00f9-4eb2-879e-ef1c6787ed8a", + "traceId": "c4bee06eed6643259949d1b59cae4b58", + "evidence": "roleId=2085906432268029954", + "checkedAt": "2026-08-08T01:50:23.109Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "de9e5362-ba53-464a-b075-b5f4a4a1b2f9, a7db41c4-a7a4-4b1d-8da3-82eb84976501", + "traceId": "8bf00a4b81db436f8f8e0d9eb4fc7504", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.143Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "de9e5362-ba53-464a-b075-b5f4a4a1b2f9, a7db41c4-a7a4-4b1d-8da3-82eb84976501", + "traceId": "8bf00a4b81db436f8f8e0d9eb4fc7504", + "evidence": "roleId=2085906432268029954", + "checkedAt": "2026-08-08T01:50:23.143Z" + }, + { + "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": "34652c0f-68e0-409b-a81b-a3fde1b0d5c7, 8098de9a-eb28-45df-ba7e-4fcc9da6a94f", + "traceId": "2d873144d1764ace820c412ef5e066f7", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.173Z" + }, + { + "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": "9c1d3e76-699d-4062-aa05-a829f59f981b, cf50013d-e46a-46fa-8ab8-2f44916365de", + "traceId": "471a3378e73449f9bd7cd364cf348ba8", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.202Z" + }, + { + "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": "9c1d3e76-699d-4062-aa05-a829f59f981b, cf50013d-e46a-46fa-8ab8-2f44916365de", + "traceId": "471a3378e73449f9bd7cd364cf348ba8", + "evidence": "permissionIds=2085906431492083713", + "checkedAt": "2026-08-08T01:50:23.202Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c00aeb09-dfe3-4b2b-86e4-867d6fb6a3da, 04173951-61d9-404e-ba2d-82e280dec6c0", + "traceId": "4a3dd5ce3e6b47ce898a1de3c8db5929", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.234Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c00aeb09-dfe3-4b2b-86e4-867d6fb6a3da, 04173951-61d9-404e-ba2d-82e280dec6c0", + "traceId": "4a3dd5ce3e6b47ce898a1de3c8db5929", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:50:23.234Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90d3d0d3-6278-419d-80dc-8dd8e1871441, 5967fcdb-e915-453e-ad2e-659684c2e5a5", + "traceId": "d26b4ae497674a8a807fa665e299bf66", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.266Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90d3d0d3-6278-419d-80dc-8dd8e1871441, 5967fcdb-e915-453e-ad2e-659684c2e5a5", + "traceId": "d26b4ae497674a8a807fa665e299bf66", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T01:50:23.266Z" + }, + { + "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": "897baa98-b6e3-4342-9663-ae755aae520d, 211f9d91-4ddd-4bcf-b772-79ca675fc7b2", + "traceId": "f18aa7f583a647dfae2e8c48f9a1b489", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.285Z" + }, + { + "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": "897baa98-b6e3-4342-9663-ae755aae520d, 211f9d91-4ddd-4bcf-b772-79ca675fc7b2", + "traceId": "f18aa7f583a647dfae2e8c48f9a1b489", + "evidence": "tenants=1, roles=6", + "checkedAt": "2026-08-08T01:50:23.285Z" + }, + { + "module": "system", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16153823285" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fbf33fe4-75f6-438c-99ba-47549ce8805d, ad6022b9-2efb-473c-8c3e-ae48d7aec604", + "traceId": "c98156b1b6474dfba62afe560033c39d", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T01:50:23.325Z" + }, + { + "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": "05181309-123d-48e7-88b1-d7c1515dfd85, 906d753a-6606-4bf8-a021-3546ac271d68", + "traceId": "ef3b6ac399b04f3ba218a91ddaff4011", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.667Z" + }, + { + "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": "05181309-123d-48e7-88b1-d7c1515dfd85, 906d753a-6606-4bf8-a021-3546ac271d68", + "traceId": "ef3b6ac399b04f3ba218a91ddaff4011", + "evidence": "membershipId=2085906433278857219", + "checkedAt": "2026-08-08T01:50:23.667Z" + }, + { + "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_808015022476" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f7e19766-1a3b-453d-8da7-2ee7c6bb9510, 2d8f661c-adac-4b65-b387-c32fe416cf99", + "traceId": "e9f4feff9de64dda8249da5c4f5c2997", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.706Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户列表包含新账号且字段完整", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=20&keyword=admin_accept_808015022476" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f7e19766-1a3b-453d-8da7-2ee7c6bb9510, 2d8f661c-adac-4b65-b387-c32fe416cf99", + "traceId": "e9f4feff9de64dda8249da5c4f5c2997", + "evidence": "records=1, missing=lastLoginAt", + "checkedAt": "2026-08-08T01:50:23.706Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906433278857219" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dab4bc55-e9b9-43ac-a441-60c5db913e8b, 68579859-a9ec-4c0f-b88a-dfe3c6ecb943", + "traceId": "bf625720e0ed48d7be260c96e3cc52dd", + "evidence": "", + "checkedAt": "2026-08-08T01:50:23.835Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906433278857219" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dab4bc55-e9b9-43ac-a441-60c5db913e8b, 68579859-a9ec-4c0f-b88a-dfe3c6ecb943", + "traceId": "bf625720e0ed48d7be260c96e3cc52dd", + "evidence": "membershipId=2085906433278857219", + "checkedAt": "2026-08-08T01:50:23.835Z" + }, + { + "module": "system", + "scenario": null, + "name": "新建内部用户可使用初始密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2900cbe1-03b4-47b0-8a36-9d35f8b501a5, d9ca3bfd-63a5-4f55-a4f0-23f787c9fad9", + "traceId": "ff4db6c1b70143a0896632987c607028", + "evidence": "username=admin_accept_808015022476", + "checkedAt": "2026-08-08T01:50:24.172Z" + }, + { + "module": "system", + "scenario": null, + "name": "重置平台内部用户密码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906433278857219/password" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5394ac6a-39a7-4cbd-8585-15e5e4b7b5b2, 5a848ca0-e0be-4202-90b8-349ea139b66d", + "traceId": "b7400d39555e4e6882c48fb51881962d", + "evidence": "", + "checkedAt": "2026-08-08T01:50:24.555Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户使用重置密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ef5a94f0-5441-4949-b1b9-a35b13b91171, 0d027de5-7a79-48ea-8e9a-67520119945e", + "traceId": "bdc5956b70af4c07a21d1a920a6a03cb", + "evidence": "username=admin_accept_808015022476", + "checkedAt": "2026-08-08T01:50:24.896Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906433278857219/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c33b0953-838a-4588-a812-3a1562b1a152, 1d240a0b-da43-4022-8448-f665d545a340", + "traceId": "b63b36a345524296b83418827c1e0c74", + "evidence": "", + "checkedAt": "2026-08-08T01:50:25.006Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户停用状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906433278857219/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c33b0953-838a-4588-a812-3a1562b1a152, 1d240a0b-da43-4022-8448-f665d545a340", + "traceId": "b63b36a345524296b83418827c1e0c74", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:50:25.006Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用用户禁止登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "7cdffebc-71dc-4936-af2b-c84587e57d35", + "traceId": "e9e240b4f20648bcb9a3cfaf5b635936", + "evidence": "HTTP=200, code=A0403", + "checkedAt": "2026-08-08T01:50:25.038Z" + }, + { + "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": "ca6af757-c870-4edb-ae7e-b52f66a660f7, 51a8a91f-b0ca-4604-a589-2d96ae867f0b", + "traceId": "715a9dde2e6f4506ae9d119022912fd7", + "evidence": "", + "checkedAt": "2026-08-08T01:50:25.063Z" + }, + { + "module": "system", + "scenario": "system-role-protection", + "name": "已分配成员的角色禁止删除", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/roles/2085906432268029954" + }, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "36ff0f03-e18a-460d-bb4f-74f9840abb0a", + "traceId": "9a3784e25d9e4caf9f5fd5b1a6a6c589", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:50:25.086Z" + }, + { + "module": "system", + "scenario": null, + "name": "清理时停用测试角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9f6fe407-f7f4-48ad-bf20-321b4f51940b, 5122341b-9884-40b1-bd83-efd4aa63ddf7", + "traceId": "2c07306a4f8341c8a50a1b622b0f782d", + "evidence": "", + "checkedAt": "2026-08-08T01:50:25.113Z" + }, + { + "module": "system", + "scenario": null, + "name": "保留测试角色处于停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906432268029954/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9f6fe407-f7f4-48ad-bf20-321b4f51940b, 5122341b-9884-40b1-bd83-efd4aa63ddf7", + "traceId": "2c07306a4f8341c8a50a1b622b0f782d", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:50:25.113Z" + }, + { + "module": "system", + "scenario": null, + "name": "删除临时权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/permissions/2085906431492083713" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9a131c57-5b58-4520-b57b-4ce11b97c6c1, 87535aa2-341f-42d0-bb2f-9d2473e2c2d6", + "traceId": "d38da0cbdff043e2a02941e7c22b5aa7", + "evidence": "", + "checkedAt": "2026-08-08T01:50:25.152Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015100.json b/reports/admin-test-env-acceptance-20260808015100.json new file mode 100644 index 000000000..e3646fc62 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015100.json @@ -0,0 +1,813 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015100919", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:51:03.556Z", + "startedAt": "2026-08-08T01:51:00.919Z", + "success": true, + "fatal": null, + "summary": { + "total": 42, + "passed": 42, + "failed": 0 + }, + "modules": [ + { + "name": "system", + "startedAt": "2026-08-08T01:51:01.288Z", + "finishedAt": "2026-08-08T01:51:03.556Z", + "success": true, + "passed": 41, + "failed": 0, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": { + "systemPermission": { + "id": "2085906592846958593", + "code": "platform:acceptance:808015100919" + }, + "systemRole": { + "id": "2085906593333497857", + "code": "ADMIN_ACCEPT_808015100919", + "finalStatus": "DISABLED", + "retainedBecauseAssigned": true + }, + "systemUser": { + "membershipId": "2085906594386268164", + "username": "admin_accept_808015100919", + "finalStatus": "DISABLED" + } + }, + "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": "c46fca94-1309-46aa-95e9-1b784448858e, ad409e6c-e6cf-4d53-a116-9158de60164d", + "traceId": "7fd072801f5642758e684535cda2a566", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.287Z" + }, + { + "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": "fcb82450-2a21-40f2-9d97-527c3e5a6d3c, 3e8612e4-9644-4124-a1ad-5b73fc0c5583", + "traceId": "eb96c9d48c3044d1a2930934b117397b", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.357Z" + }, + { + "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": "fcb82450-2a21-40f2-9d97-527c3e5a6d3c, 3e8612e4-9644-4124-a1ad-5b73fc0c5583", + "traceId": "eb96c9d48c3044d1a2930934b117397b", + "evidence": "count=117", + "checkedAt": "2026-08-08T01:51:01.357Z" + }, + { + "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": "659e3afe-fa3c-497e-88f2-c2837c98cbb4, d974ee1d-789f-4d85-a526-c983f88ddb50", + "traceId": "0650e78de8a149469f0bad90d49744b4", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.394Z" + }, + { + "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": "659e3afe-fa3c-497e-88f2-c2837c98cbb4, d974ee1d-789f-4d85-a526-c983f88ddb50", + "traceId": "0650e78de8a149469f0bad90d49744b4", + "evidence": "permissionId=2085906592846958593", + "checkedAt": "2026-08-08T01:51:01.394Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑自定义权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906592846958593" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d15875fe-d1a6-49f9-85d5-5eea9cf63784, 47bcb4f1-6e67-40ca-bf51-5c211b201830", + "traceId": "9ec6e12e915d4ee6b25f294ecab3fa04", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.423Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906592846958593" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d15875fe-d1a6-49f9-85d5-5eea9cf63784, 47bcb4f1-6e67-40ca-bf51-5c211b201830", + "traceId": "9ec6e12e915d4ee6b25f294ecab3fa04", + "evidence": "permissionId=2085906592846958593", + "checkedAt": "2026-08-08T01:51:01.423Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906592846958593/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0ffa2ab-b69a-40ba-85a9-d086b04fe728, 93c33865-bcf0-4343-9211-c4a8409dcf2b", + "traceId": "0e02ae7bf28f4a82a345d2b7ed48f0af", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.452Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906592846958593/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0ffa2ab-b69a-40ba-85a9-d086b04fe728, 93c33865-bcf0-4343-9211-c4a8409dcf2b", + "traceId": "0e02ae7bf28f4a82a345d2b7ed48f0af", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:51:01.452Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906592846958593/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d4d761c9-49f0-4ade-84df-0a1e49a35719, 909949c9-bab9-40e3-a55b-f2b1caa70fd7", + "traceId": "310e92cf8eda446680090988b6d445b6", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.483Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085906592846958593/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d4d761c9-49f0-4ade-84df-0a1e49a35719, 909949c9-bab9-40e3-a55b-f2b1caa70fd7", + "traceId": "310e92cf8eda446680090988b6d445b6", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T01:51:01.483Z" + }, + { + "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": "245ccb89-2c4f-4e4b-90e2-b71e56e15853, d676f5fa-865b-4dc9-b41a-6f04fae2d40b", + "traceId": "95d1980bca0b4eebbc29e54ca1f2fb80", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.510Z" + }, + { + "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": "245ccb89-2c4f-4e4b-90e2-b71e56e15853, d676f5fa-865b-4dc9-b41a-6f04fae2d40b", + "traceId": "95d1980bca0b4eebbc29e54ca1f2fb80", + "evidence": "roleId=2085906593333497857", + "checkedAt": "2026-08-08T01:51:01.510Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "99058303-5cc8-4284-b7ea-c600de0ad937, fa5ead52-af51-45a6-bde0-1baa763ad519", + "traceId": "b989dc3a137e4c72b99853b066c1eca4", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.547Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "99058303-5cc8-4284-b7ea-c600de0ad937, fa5ead52-af51-45a6-bde0-1baa763ad519", + "traceId": "b989dc3a137e4c72b99853b066c1eca4", + "evidence": "roleId=2085906593333497857", + "checkedAt": "2026-08-08T01:51:01.547Z" + }, + { + "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": "3a5b503f-d9bc-4dc2-87e8-6bda92f02bb0, b0ec509c-b230-4d27-9c2c-5d40105f3a66", + "traceId": "47e3da73f3bc44e9bcd984ab00e14637", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.579Z" + }, + { + "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": "9858f207-aca4-4ece-b3b3-cea34d3ba860, a4e495b3-9f0a-42dc-98a0-af5fe656b966", + "traceId": "e63feb304286400a8fa373ca7591ad07", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.607Z" + }, + { + "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": "9858f207-aca4-4ece-b3b3-cea34d3ba860, a4e495b3-9f0a-42dc-98a0-af5fe656b966", + "traceId": "e63feb304286400a8fa373ca7591ad07", + "evidence": "permissionIds=2085906592846958593", + "checkedAt": "2026-08-08T01:51:01.607Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec78442e-7ba6-4be6-b69c-8ea64185c5bf, 8eb982bb-61d9-4dc3-9c96-91f92875bda4", + "traceId": "8ab508205d914b2284375d8da6b7970a", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.633Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec78442e-7ba6-4be6-b69c-8ea64185c5bf, 8eb982bb-61d9-4dc3-9c96-91f92875bda4", + "traceId": "8ab508205d914b2284375d8da6b7970a", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:51:01.633Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5c80676b-4394-4961-858c-f497c4b27081, 7ec30864-f9a5-4df0-addc-2c0f840feb17", + "traceId": "c384c297cf864eefa3566b7d09b11fee", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.670Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5c80676b-4394-4961-858c-f497c4b27081, 7ec30864-f9a5-4df0-addc-2c0f840feb17", + "traceId": "c384c297cf864eefa3566b7d09b11fee", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T01:51:01.670Z" + }, + { + "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": "13acee9f-902f-4539-8da0-99f3797b5bc1, 8b394968-d7ff-4258-91b2-c31a5a2d7909", + "traceId": "d1c5595ce5cb4442bf6bd0e1b0e25870", + "evidence": "", + "checkedAt": "2026-08-08T01:51:01.696Z" + }, + { + "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": "13acee9f-902f-4539-8da0-99f3797b5bc1, 8b394968-d7ff-4258-91b2-c31a5a2d7909", + "traceId": "d1c5595ce5cb4442bf6bd0e1b0e25870", + "evidence": "tenants=1, roles=7", + "checkedAt": "2026-08-08T01:51:01.696Z" + }, + { + "module": "system", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16153861696" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d1698183-b833-48f2-9c0d-4505d4378b23, 402a4e7c-72e6-441c-8270-f2b45cb9b513", + "traceId": "f644e76d31f34c8ba554b469333e968a", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T01:51:01.729Z" + }, + { + "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": "cdd4805b-c311-44c9-bf48-06574d45cf22, b3489347-6716-4e7a-a08f-03a4c96b8268", + "traceId": "e0a99588c6354a2a90b29003ace78b98", + "evidence": "", + "checkedAt": "2026-08-08T01:51:02.087Z" + }, + { + "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": "cdd4805b-c311-44c9-bf48-06574d45cf22, b3489347-6716-4e7a-a08f-03a4c96b8268", + "traceId": "e0a99588c6354a2a90b29003ace78b98", + "evidence": "membershipId=2085906594386268164", + "checkedAt": "2026-08-08T01:51:02.088Z" + }, + { + "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_808015100919" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c02a4f1-3c13-4a6e-a4d9-b034b0080015, ddeac472-31bd-4d30-8a7e-d57b8189414d", + "traceId": "ae4a6a1ad8304042b7d736fbd3a065a7", + "evidence": "", + "checkedAt": "2026-08-08T01:51:02.133Z" + }, + { + "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_808015100919" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c02a4f1-3c13-4a6e-a4d9-b034b0080015, ddeac472-31bd-4d30-8a7e-d57b8189414d", + "traceId": "ae4a6a1ad8304042b7d736fbd3a065a7", + "evidence": "records=1, missing=none, lastLoginAt=omitted", + "checkedAt": "2026-08-08T01:51:02.133Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906594386268164" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d578d25c-e92b-4a49-a31d-568814b1eb61, 6e5ba8ec-e4a3-47ca-8b13-7d87c705e965", + "traceId": "cd97d23a1d3f461ca100bf5f12230ca5", + "evidence": "", + "checkedAt": "2026-08-08T01:51:02.243Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906594386268164" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d578d25c-e92b-4a49-a31d-568814b1eb61, 6e5ba8ec-e4a3-47ca-8b13-7d87c705e965", + "traceId": "cd97d23a1d3f461ca100bf5f12230ca5", + "evidence": "membershipId=2085906594386268164", + "checkedAt": "2026-08-08T01:51:02.243Z" + }, + { + "module": "system", + "scenario": null, + "name": "新建内部用户可使用初始密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8571d9e4-f96a-4443-a87c-32eb55f091cb, b784af8d-f8c7-4090-8214-c12baf001725", + "traceId": "144d89ec70de4973978f6c74459281b1", + "evidence": "username=admin_accept_808015100919", + "checkedAt": "2026-08-08T01:51:02.583Z" + }, + { + "module": "system", + "scenario": null, + "name": "重置平台内部用户密码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906594386268164/password" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eb8fd540-afb8-471b-9f07-d4ccc67a4116, 976d8f22-2ead-4d73-8453-29d7bf275026", + "traceId": "4c6f4ce003d34a0c9f8664ba0827d15c", + "evidence": "", + "checkedAt": "2026-08-08T01:51:02.962Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户使用重置密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "124f7055-ac54-477b-a05f-66bfbc99dde8, 382be9db-ccfe-4768-a3bc-1c01488b50dd", + "traceId": "b5997c34877e40fb9e3b537bc0dfc6d9", + "evidence": "username=admin_accept_808015100919", + "checkedAt": "2026-08-08T01:51:03.296Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906594386268164/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af59e590-1033-410a-aa8b-fd8eb16c3dcc, 272075fb-6736-4a83-af07-35984e48208f", + "traceId": "5d1830a60ecd43aab91ebcfd1a5c84c0", + "evidence": "", + "checkedAt": "2026-08-08T01:51:03.397Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户停用状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085906594386268164/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af59e590-1033-410a-aa8b-fd8eb16c3dcc, 272075fb-6736-4a83-af07-35984e48208f", + "traceId": "5d1830a60ecd43aab91ebcfd1a5c84c0", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:51:03.397Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用用户禁止登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "29944df8-91e3-44a1-9fd6-db763cf82590", + "traceId": "ea8ef8687c444375998445cbeb888643", + "evidence": "HTTP=200, code=A0403", + "checkedAt": "2026-08-08T01:51:03.426Z" + }, + { + "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": "d3537c80-d23e-46e8-b18d-3d4447cc4083, e1285a3b-6ae6-47ca-bff3-da2ee98ae697", + "traceId": "6ce1bb2efc2c43bebe413f83096e969c", + "evidence": "", + "checkedAt": "2026-08-08T01:51:03.469Z" + }, + { + "module": "system", + "scenario": "system-role-protection", + "name": "已分配成员的角色禁止删除", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/roles/2085906593333497857" + }, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "b03df360-5159-4d7d-aee6-56b8b17f96aa", + "traceId": "0742aa6eee464fbba7dd2ba3f4551636", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:51:03.491Z" + }, + { + "module": "system", + "scenario": null, + "name": "清理时停用测试角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7cb0f80b-5a00-4c22-9c4f-28b3b67ade9f, 70a6b1f3-1d1d-4646-b099-b26b14d794fd", + "traceId": "e070173b00714448b1e969e4ed63a2a9", + "evidence": "", + "checkedAt": "2026-08-08T01:51:03.527Z" + }, + { + "module": "system", + "scenario": null, + "name": "保留测试角色处于停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085906593333497857/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7cb0f80b-5a00-4c22-9c4f-28b3b67ade9f, 70a6b1f3-1d1d-4646-b099-b26b14d794fd", + "traceId": "e070173b00714448b1e969e4ed63a2a9", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T01:51:03.527Z" + }, + { + "module": "system", + "scenario": null, + "name": "删除临时权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/permissions/2085906592846958593" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1878c927-e1b6-41ef-8c4b-db2c6226fcc2, d6376a43-5105-4ddc-a4fb-e703b59bfcc1", + "traceId": "a9968e4afb2c403aa3956be6624f7fe0", + "evidence": "", + "checkedAt": "2026-08-08T01:51:03.556Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015112.json b/reports/admin-test-env-acceptance-20260808015112.json new file mode 100644 index 000000000..37faffaca --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015112.json @@ -0,0 +1,841 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015112686", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:51:15.306Z", + "startedAt": "2026-08-08T01:51:12.686Z", + "success": true, + "fatal": null, + "summary": { + "total": 43, + "passed": 43, + "failed": 0 + }, + "modules": [ + { + "name": "master-data", + "startedAt": "2026-08-08T01:51:13.053Z", + "finishedAt": "2026-08-08T01:51:15.306Z", + "success": true, + "passed": 42, + "failed": 0, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": { + "warehouse": { + "id": "2085906642714542081", + "code": "AW808015112686", + "finalStatus": "INACTIVE" + }, + "location": { + "id": "2085906643662454786", + "warehouseId": "2085906642714542081", + "deleted": false + }, + "pallet": { + "id": "2085906644723613697", + "warehouseId": "2085906642714542081", + "deleted": true + }, + "expressCompany": { + "id": "2085906645604417538", + "code": "EX808015112686", + "finalStatus": "INACTIVE" + }, + "partner": { + "id": "2085906646594273281", + "code": "PT808015112686", + "finalStatus": "INACTIVE" + } + }, + "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": "1ef641c7-79de-4ed6-a839-c0d7b54d717c, 99bc9d62-a3ad-44ed-b466-e370c97bac9f", + "traceId": "187deb804f5b4f28aa6e0e7c19ba604e", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.052Z" + }, + { + "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": "1ae69a26-fab4-463a-bd0a-f879e5b7f042, 2ecb0dd3-d8df-476c-a3a8-078f7a321ab0", + "traceId": "6b0170d887dd4f84b75cef71c8a1f10b", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.136Z" + }, + { + "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": "1ae69a26-fab4-463a-bd0a-f879e5b7f042, 2ecb0dd3-d8df-476c-a3a8-078f7a321ab0", + "traceId": "6b0170d887dd4f84b75cef71c8a1f10b", + "evidence": "total=266", + "checkedAt": "2026-08-08T01:51:13.136Z" + }, + { + "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": "1fe78ad4-d10c-42f7-93a7-261ca921c160, e1526cc7-30cc-4cef-b55b-0482ade19bcc", + "traceId": "3de321d1858a43ada9fb2b8967ed6658", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.308Z" + }, + { + "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": "1fe78ad4-d10c-42f7-93a7-261ca921c160, e1526cc7-30cc-4cef-b55b-0482ade19bcc", + "traceId": "3de321d1858a43ada9fb2b8967ed6658", + "evidence": "warehouseId=2085906642714542081", + "checkedAt": "2026-08-08T01:51:13.308Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询平台仓库详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085906642714542081?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "802a5696-3011-4321-8e04-ca01d1b9ce73, b98b5f8e-bd09-4a62-bb5a-cf434c76286c", + "traceId": "d47debad2dfa4ebc95ccef7e543513a9", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.339Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库详情、地址和能力正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085906642714542081?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "802a5696-3011-4321-8e04-ca01d1b9ce73, b98b5f8e-bd09-4a62-bb5a-cf434c76286c", + "traceId": "d47debad2dfa4ebc95ccef7e543513a9", + "evidence": "addresses=1, capabilities=1", + "checkedAt": "2026-08-08T01:51:13.339Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/warehouse-admin/2085906642714542081?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7f3b45a4-01ef-47cf-aa46-68381336214a, 3168722f-b184-45c2-be32-05445e6d7184", + "traceId": "5abea76955804f938bd792150e700dba", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.414Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085906642714542081?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "283efed9-6562-4e6e-bc9f-0f469b01c5b3, fc291ee4-c263-422c-8c03-54e7178ecd06", + "traceId": "78b247e6f3f94a8887b57e7a92544b19", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.445Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085906642714542081?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "283efed9-6562-4e6e-bc9f-0f469b01c5b3, fc291ee4-c263-422c-8c03-54e7178ecd06", + "traceId": "78b247e6f3f94a8887b57e7a92544b19", + "evidence": "warehouseId=2085906642714542081", + "checkedAt": "2026-08-08T01:51:13.445Z" + }, + { + "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": "ba671a58-75ac-43fe-bf44-d12b3092957b, ee3d0f31-1d17-4a5a-9585-64d13a96e08a", + "traceId": "7cb020a4ed944d5db972080de5c78204", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.512Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询库位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085906643662454786?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0c11050f-ade1-4bfa-b953-1f19c22afe3e, db448a60-956d-4994-8f47-a6bd9b44ce42", + "traceId": "e14a466068504819b64c8cdf2cd9de69", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.543Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085906643662454786?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0c11050f-ade1-4bfa-b953-1f19c22afe3e, db448a60-956d-4994-8f47-a6bd9b44ce42", + "traceId": "e14a466068504819b64c8cdf2cd9de69", + "evidence": "locationId=2085906643662454786", + "checkedAt": "2026-08-08T01:51:13.543Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/locations/2085906643662454786?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "09909b24-5a09-49a1-8440-b3dc6db25dab, dd165f85-9ba9-4b8a-b8ad-cd38890c6b33", + "traceId": "82ebaf3f05f1458da4d226643bf90ca8", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.599Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085906643662454786?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "48cf9423-205f-4e60-a50f-a5cf2d917ddc, b1e193c6-dae3-45b4-a489-47fb42b18629", + "traceId": "ef46e900c9364dc082a0f5dc4e214940", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.629Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位编辑与版本递增正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085906643662454786?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "48cf9423-205f-4e60-a50f-a5cf2d917ddc, b1e193c6-dae3-45b4-a489-47fb42b18629", + "traceId": "ef46e900c9364dc082a0f5dc4e214940", + "evidence": "version=1", + "checkedAt": "2026-08-08T01:51:13.629Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/locations/2085906643662454786/status?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e1d6ae58-c6ea-4961-b8c7-6d5366f92218, bde78f2c-1629-4c7e-a3ee-a88da44457de", + "traceId": "15cd0ef443b943cba3ff0814e7eaed18", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.667Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未占用测试库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/locations/2085906643662454786?tenantId=0&warehouseId=2085906642714542081&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9be3228a-c600-4f3f-8377-ef51f638f26d, dc648e93-bf03-4816-987a-be105ad9163e", + "traceId": "23726e294a754bb1a201fd0fee6ee8e8", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.703Z" + }, + { + "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": "3d8e81f4-5354-4545-af6f-99cab01bbfd8, ca6733c2-f6b6-43bb-b496-119f856589f6", + "traceId": "09ee75d6fb414c1887f4a548479df789", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.762Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询托盘详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085906644723613697?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "816ef3e3-35ba-40a4-842e-d7b2f6e08c32, cc15e9f1-85c2-4d6b-835e-ed9b355bc6d5", + "traceId": "80bbf30816024e3892436f9b37d80870", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.803Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085906644723613697?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "816ef3e3-35ba-40a4-842e-d7b2f6e08c32, cc15e9f1-85c2-4d6b-835e-ed9b355bc6d5", + "traceId": "80bbf30816024e3892436f9b37d80870", + "evidence": "palletId=2085906644723613697", + "checkedAt": "2026-08-08T01:51:13.803Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/pallets/2085906644723613697?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1e663a9d-4ad5-4067-931c-524c8f684414, 49952e54-7b84-43a2-b4ba-e5cd66a618a5", + "traceId": "a537bb9bf0ec4b2b89c6d5006cd5159a", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.850Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085906644723613697?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6b85ce32-cd57-4969-a7fe-7fa5a73a1d6d, b1ba3cb3-eebc-491a-9e4a-9d71fc43eda6", + "traceId": "712dc29aacfb4621ad11cd93feb22617", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.873Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085906644723613697?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6b85ce32-cd57-4969-a7fe-7fa5a73a1d6d, b1ba3cb3-eebc-491a-9e4a-9d71fc43eda6", + "traceId": "712dc29aacfb4621ad11cd93feb22617", + "evidence": "palletId=2085906644723613697", + "checkedAt": "2026-08-08T01:51:13.873Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未使用测试托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/pallets/2085906644723613697?tenantId=0&warehouseId=2085906642714542081" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bef950ad-0c47-446a-ac22-dfe274c94e9f, 178851f2-542f-4eaa-90ca-7292edeaf2c5", + "traceId": "57a9b30f3b2643428f10e07e04f27514", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.915Z" + }, + { + "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": "d45dac88-ddf2-4fcf-8d1f-32903d3603aa, 06b5cf45-bddc-48eb-8e35-8c37f702a7ca", + "traceId": "39e3e7beddb34ca8a685dacd1ac8bdc8", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.973Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询快递公司详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085906645604417538?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e791401-a620-45cb-8a98-6133ede11869, 9d0c5a8c-d86a-464d-aceb-e6d7302dfb27", + "traceId": "d6c304ef339e4be9ad2e9575c4eff3ea", + "evidence": "", + "checkedAt": "2026-08-08T01:51:13.999Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085906645604417538?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e791401-a620-45cb-8a98-6133ede11869, 9d0c5a8c-d86a-464d-aceb-e6d7302dfb27", + "traceId": "d6c304ef339e4be9ad2e9575c4eff3ea", + "evidence": "expressId=2085906645604417538", + "checkedAt": "2026-08-08T01:51:13.999Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/express-companies/2085906645604417538?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c5a387ec-8b2d-4f92-b9fc-2da20d060feb, 70157926-52be-4e58-9307-59052ae5b78c", + "traceId": "4ecc9cc89233433bb6e5a6f2ddaab2dd", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.038Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/express-companies/2085906645604417538/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "062601e2-5dba-487c-bb19-a428aa763c78, bac5717a-fc6e-4313-bfda-5464f0fcefcc", + "traceId": "fe0d135c3fc04fcd827df6c6908714c6", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.085Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选快递公司列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808015112686" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98298dab-4669-4fce-924e-697302d27af8, a1ae79b5-8300-492c-9bff-0da660607e0b", + "traceId": "d2b00bf84ec6475685c4d5be1c264c62", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.145Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司列表回显停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808015112686" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98298dab-4669-4fce-924e-697302d27af8, a1ae79b5-8300-492c-9bff-0da660607e0b", + "traceId": "d2b00bf84ec6475685c4d5be1c264c62", + "evidence": "records=1", + "checkedAt": "2026-08-08T01:51:14.146Z" + }, + { + "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": "c9af27f3-7013-4d13-a72a-2d6eed35db71, 359738bc-ee6f-48c4-8f85-ab615a070995", + "traceId": "3566029c1c784e91a85c4b9d31eb832d", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.211Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询往来单位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085906646594273281?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1730bb54-5f1c-4f0c-bf13-4ea61e620314, 1e4b9158-35d2-42a7-a7ad-f53e2569fa7a", + "traceId": "52baa99de51647158df9c0f8fe2b63b3", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.248Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085906646594273281?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1730bb54-5f1c-4f0c-bf13-4ea61e620314, 1e4b9158-35d2-42a7-a7ad-f53e2569fa7a", + "traceId": "52baa99de51647158df9c0f8fe2b63b3", + "evidence": "partnerId=2085906646594273281", + "checkedAt": "2026-08-08T01:51:14.248Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/partners/2085906646594273281?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ac0bef92-9d28-4a11-aa2c-5a5dbd33f6a1, fd05b54a-716c-42e3-9434-a0630dd7457c", + "traceId": "e9f7a126a0a14e95bd04bc6b1bc78f3a", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.293Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/partners/2085906646594273281/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d0f760bf-9f17-4eb1-a780-f8820b87a9a1, d2a490be-2378-48e1-a3d0-7ab449e5f951", + "traceId": "a736d8e144f345a2bf4f9c48d1def321", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.332Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选往来单位列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808015112686" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "907f44fe-f8b8-44bf-85ab-a0c69f2478ad, 7e717103-216c-4b38-a994-9531746c2940", + "traceId": "cdf53bd68d3c409c95146f6c7b559124", + "evidence": "", + "checkedAt": "2026-08-08T01:51:14.377Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位列表回显编辑与停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808015112686" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "907f44fe-f8b8-44bf-85ab-a0c69f2478ad, 7e717103-216c-4b38-a994-9531746c2940", + "traceId": "cdf53bd68d3c409c95146f6c7b559124", + "evidence": "records=1", + "checkedAt": "2026-08-08T01:51:14.377Z" + }, + { + "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": "b2f6a827-8145-47f9-9278-3a487a7949dc, bb227b6e-4e7c-4edd-b397-c5688c23a629", + "traceId": "e1a8c949a58c45a2857eb13320a1bd84", + "evidence": "bytes=3852, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T01:51:14.927Z" + }, + { + "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": "ae4dd7e8-09be-45d4-9726-300b6b2825fc, 7a6fb2f3-9d61-4262-890a-1b2b4edd8284", + "traceId": "b8f1e4fdceff484a8f2c8bd33a49bc94", + "evidence": "bytes=3691, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T01:51:15.223Z" + }, + { + "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": "da616cb4-1d1c-4b3f-a425-8a9dd76f79b0, fdf996ea-64b5-4d96-a957-9ce287d5b044", + "traceId": "c1e4777d7d48439990fba23346a450df", + "evidence": "bytes=3829, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T01:51:15.270Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用测试仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/warehouse-admin/2085906642714542081/status?tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e4156701-dfb5-477d-a308-bb5705d6d162, b0134658-c2ba-493c-ab64-8fb10c10b25d", + "traceId": "ff955ad956bc49e384fb9435aa3f8ab9", + "evidence": "", + "checkedAt": "2026-08-08T01:51:15.306Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015123.json b/reports/admin-test-env-acceptance-20260808015123.json new file mode 100644 index 000000000..38115bf22 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015123.json @@ -0,0 +1,207 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015123816", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:51:28.649Z", + "startedAt": "2026-08-08T01:51:23.816Z", + "success": true, + "fatal": null, + "summary": { + "total": 9, + "passed": 9, + "failed": 0 + }, + "modules": [ + { + "name": "downloads", + "startedAt": "2026-08-08T01:51:24.193Z", + "finishedAt": "2026-08-08T01:51:28.649Z", + "success": true, + "passed": 8, + "failed": 0, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": { + "exportTask": { + "id": "2085906689023344642" + } + }, + "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": "f224e2f6-ed1e-4ce9-9269-9809e39b9c24, 44b6a750-78af-4f48-b492-53014903ebcc", + "traceId": "091531d115f0450c897615089b74c4e8", + "evidence": "", + "checkedAt": "2026-08-08T01:51:24.192Z" + }, + { + "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": "6a036de6-e397-42af-85d5-982b86363291, 6aad9d95-aafa-429d-8a31-3d1e96838613", + "traceId": "b6c05bc1c62e4e41af77f633473386b4", + "evidence": "", + "checkedAt": "2026-08-08T01:51:24.339Z" + }, + { + "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": "6a036de6-e397-42af-85d5-982b86363291, 6aad9d95-aafa-429d-8a31-3d1e96838613", + "traceId": "b6c05bc1c62e4e41af77f633473386b4", + "evidence": "taskId=2085906689023344642, status=PENDING", + "checkedAt": "2026-08-08T01:51:24.339Z" + }, + { + "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": "1b323f47-c5b7-4d9d-869f-d4dbf3e750fe, 1b7f8e83-9958-44c4-940f-ad4079d85fb7", + "traceId": "3dbbff1c6e4140eba6b61a8a14eea612", + "evidence": "", + "checkedAt": "2026-08-08T01:51:24.458Z" + }, + { + "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": "1b323f47-c5b7-4d9d-869f-d4dbf3e750fe, 1b7f8e83-9958-44c4-940f-ad4079d85fb7", + "traceId": "3dbbff1c6e4140eba6b61a8a14eea612", + "evidence": "records=3", + "checkedAt": "2026-08-08T01:51:24.459Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "轮询导出任务直到终态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085906689023344642" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c5e6c1cb-4ebd-4200-8b1a-b79c1f3c660d, 8d593d8c-ee47-408c-a228-8f978834d7c1", + "traceId": "641aafb4f4664fa38853cf1a44a9ca88", + "evidence": "status=SUCCEEDED, processedRows=0", + "checkedAt": "2026-08-08T01:51:28.568Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "查询导出任务详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085906689023344642" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af467347-8049-47b4-8033-46630f9dedf9, c6c058a8-03bb-48ec-b196-f873055f4039", + "traceId": "c6111c38b3ad4b2fa1da5730e282a42a", + "evidence": "", + "checkedAt": "2026-08-08T01:51:28.608Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "导出详情行数和文件元数据正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085906689023344642" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af467347-8049-47b4-8033-46630f9dedf9, c6c058a8-03bb-48ec-b196-f873055f4039", + "traceId": "c6111c38b3ad4b2fa1da5730e282a42a", + "evidence": "processedRows=0, sizeBytes=4066", + "checkedAt": "2026-08-08T01:51:28.608Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "下载并校验客户列表 XLSX", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085906689023344642/download" + }, + "http": 200, + "code": null, + "message": "4066 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "575144ab-472a-4aab-9014-2645a5481aa0, a889d47e-0771-4203-9299-a72ccc2717b6", + "traceId": "377bd4490a2b479cb5c27366ca3eb215", + "evidence": "bytes=4066, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T01:51:28.649Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015217.json b/reports/admin-test-env-acceptance-20260808015217.json new file mode 100644 index 000000000..74508190a --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015217.json @@ -0,0 +1,351 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015217256", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:52:21.122Z", + "startedAt": "2026-08-08T01:52:17.256Z", + "success": false, + "fatal": null, + "summary": { + "total": 16, + "passed": 15, + "failed": 1 + }, + "modules": [ + { + "name": "pricing", + "startedAt": "2026-08-08T01:52:17.700Z", + "finishedAt": "2026-08-08T01:52:21.122Z", + "success": false, + "passed": 14, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "price-book-lifecycle", + "module": "pricing", + "success": false, + "deploymentBlocked": true, + "passed": 14, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "国内起运仓和目的海外仓均精确映射", + "evidence": "origins=none, overseas=none, missing=CN-DONGGUAN-01:0,CN-YIWU-01:0,纽约仓/US-NYC-01:0,洛杉矶仓/US-LAX-01:0", + "code": "200", + "requestId": "cc81fcc4-8273-43a6-b4c8-3e5f130b54d3, a277860d-2568-4a2b-aaad-ff7e9ea37a03", + "traceId": "565abde8751743338bffd42e3b4574ee" + } + ], + "createdResources": { + "priceBookVersion": { + "versionId": "2085906913647177729", + "marker": "ADMIN-API-20260808015217256", + "sourceSha256": "3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab" + } + }, + "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": "f9c60930-f70d-4b01-8bee-98dd018b439d, 531a52ec-c085-4f9c-9edf-6d5928ef1468", + "traceId": "5d1f869c92b1410080fe35c8eff721af", + "evidence": "", + "checkedAt": "2026-08-08T01:52:17.699Z" + }, + { + "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": "e2a75598-bb18-4337-8fe0-9b59e0ad8aa0, 11c63498-91f8-4886-9e10-aab751fd2e13", + "traceId": "ae8a30fa81fd46a089174f91b00958df", + "evidence": "", + "checkedAt": "2026-08-08T01:52:17.738Z" + }, + { + "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": "e2a75598-bb18-4337-8fe0-9b59e0ad8aa0, 11c63498-91f8-4886-9e10-aab751fd2e13", + "traceId": "ae8a30fa81fd46a089174f91b00958df", + "evidence": "versions=6, active=1", + "checkedAt": "2026-08-08T01:52:17.738Z" + }, + { + "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-20260808015217256-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T01:52:17.741Z" + }, + { + "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": "3cc44632-978c-4738-bcaf-3f01bddefda8, 5e08671c-f7d4-471a-9b01-133551c1b489", + "traceId": "005da6c1da3b42b082f7f5a2834e1b6a", + "evidence": "fileName=ADMIN-API-20260808015217256-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T01:52:20.865Z" + }, + { + "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": "3cc44632-978c-4738-bcaf-3f01bddefda8, 5e08671c-f7d4-471a-9b01-133551c1b489", + "traceId": "005da6c1da3b42b082f7f5a2834e1b6a", + "evidence": "versionId=2085906913647177729, status=PENDING_CONFIRMATION, fileName=ADMIN-API-20260808015217256-2026.08.03柏悦价格表 船期2026.08.12.xlsx, shaMatched=true", + "checkedAt": "2026-08-08T01:52:20.866Z" + }, + { + "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": "3cc44632-978c-4738-bcaf-3f01bddefda8, 5e08671c-f7d4-471a-9b01-133551c1b489", + "traceId": "005da6c1da3b42b082f7f5a2834e1b6a", + "evidence": "channelCount=15, unique=15, missing=none", + "checkedAt": "2026-08-08T01:52:20.866Z" + }, + { + "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": "3cc44632-978c-4738-bcaf-3f01bddefda8, 5e08671c-f7d4-471a-9b01-133551c1b489", + "traceId": "005da6c1da3b42b082f7f5a2834e1b6a", + "evidence": "rateCount=2157, declared=2157, valid=true", + "checkedAt": "2026-08-08T01:52:20.866Z" + }, + { + "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": "3cc44632-978c-4738-bcaf-3f01bddefda8, 5e08671c-f7d4-471a-9b01-133551c1b489", + "traceId": "005da6c1da3b42b082f7f5a2834e1b6a", + "evidence": "blocking=0, unexpected=none, infrastructure=none", + "checkedAt": "2026-08-08T01:52:20.866Z" + }, + { + "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": "346c77b6-f7cd-48de-90e6-28bf71e0df6e, 44b4f4ed-461e-456a-b2f8-a002dc79a2fe", + "traceId": "e4b0d45964f24590a6f775b8095c8cea", + "evidence": "", + "checkedAt": "2026-08-08T01:52:20.891Z" + }, + { + "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": "346c77b6-f7cd-48de-90e6-28bf71e0df6e, 44b4f4ed-461e-456a-b2f8-a002dc79a2fe", + "traceId": "e4b0d45964f24590a6f775b8095c8cea", + "evidence": "pending=PENDING_CONFIRMATION, activeBefore=2085661426268549121, activeAfterUpload=2085661426268549121", + "checkedAt": "2026-08-08T01:52:20.891Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询待确认版本渠道和价格预览", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085906913647177729" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "01d816ed-813f-446f-b48b-68d9a06b7214, 4c1182b5-e14b-466d-bbc0-23dff4231773", + "traceId": "ec62c42ad48c404c92ba76991b7050d2", + "evidence": "", + "checkedAt": "2026-08-08T01:52:20.978Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "详情与上传解析结果一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085906913647177729" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "01d816ed-813f-446f-b48b-68d9a06b7214, 4c1182b5-e14b-466d-bbc0-23dff4231773", + "traceId": "ec62c42ad48c404c92ba76991b7050d2", + "evidence": "versionId=2085906913647177729, channels=15, rates=2157, issues=2", + "checkedAt": "2026-08-08T01:52:20.978Z" + }, + { + "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/2085906913647177729/source" + }, + "http": 200, + "code": null, + "message": "1343413 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "483c4175-e0c6-4546-8881-56867d597bfb, c7e835e6-b14f-4b69-923a-8ffe94fb1454, bdd9f7e1-27ad-410c-9b46-8c43115d5a17", + "traceId": "00d9415284fe452ca76e65907aa804a8, d826c60003f0415abc9328759fa51537", + "evidence": "bytes=1343413, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, zipMagic=true, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T01:52:21.084Z" + }, + { + "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" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cc81fcc4-8273-43a6-b4c8-3e5f130b54d3, a277860d-2568-4a2b-aaad-ff7e9ea37a03", + "traceId": "565abde8751743338bffd42e3b4574ee", + "evidence": "", + "checkedAt": "2026-08-08T01:52:21.121Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "国内起运仓和目的海外仓均精确映射", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cc81fcc4-8273-43a6-b4c8-3e5f130b54d3, a277860d-2568-4a2b-aaad-ff7e9ea37a03", + "traceId": "565abde8751743338bffd42e3b4574ee", + "evidence": "origins=none, overseas=none, missing=CN-DONGGUAN-01:0,CN-YIWU-01:0,纽约仓/US-NYC-01:0,洛杉矶仓/US-LAX-01:0", + "checkedAt": "2026-08-08T01:52:21.121Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015313.json b/reports/admin-test-env-acceptance-20260808015313.json new file mode 100644 index 000000000..ab139d218 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015313.json @@ -0,0 +1,318 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015313253", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:53:13.958Z", + "startedAt": "2026-08-08T01:53:13.253Z", + "success": false, + "fatal": null, + "summary": { + "total": 14, + "passed": 13, + "failed": 1 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T01:53:13.665Z", + "finishedAt": "2026-08-08T01:53:13.955Z", + "success": true, + "passed": 12, + "failed": 0, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T01:53:13.957Z", + "finishedAt": "2026-08-08T01:53:13.958Z", + "success": false, + "passed": 0, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 0, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "取得隔离的待测量入库单", + "evidence": "orders 模块未提供 marker=ADMIN-API-20260808015313253 的 inboundId/tenantId;为避免修改随机历史订单,本模块停止写入", + "code": null, + "requestId": null, + "traceId": null + } + ], + "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": "86e3206d-1691-432c-9a99-b015db7f8f97, 973c647e-a637-400e-8bb9-5b9ad35079fd", + "traceId": "9f8e6191cbcf4d28a8bc1adb7f8d458f", + "evidence": "", + "checkedAt": "2026-08-08T01:53:13.663Z" + }, + { + "module": "orders", + "scenario": null, + "name": "查询统一订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "13bf6838-66e2-42cf-985a-5a87b5d2fbb4, 3c93f152-23ef-481b-95a0-3ff83c8f81c0", + "traceId": "8e199a8800064fa3bd7d1d04423bad43", + "evidence": "", + "checkedAt": "2026-08-08T01:53:13.750Z" + }, + { + "module": "orders", + "scenario": null, + "name": "统一订单分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "13bf6838-66e2-42cf-985a-5a87b5d2fbb4, 3c93f152-23ef-481b-95a0-3ff83c8f81c0", + "traceId": "8e199a8800064fa3bd7d1d04423bad43", + "evidence": "records=20, total=348", + "checkedAt": "2026-08-08T01:53:13.750Z" + }, + { + "module": "orders", + "scenario": null, + "name": "查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085906673965793281?tenantId=2085906649595891713" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4d1c88c9-e5d6-4ce4-aa3c-006604edc15f, 50489bb2-25fd-45c8-ba70-7f3b14dc5fb1", + "traceId": "de649f51c8884eaf979c74908b191558", + "evidence": "", + "checkedAt": "2026-08-08T01:53:13.789Z" + }, + { + "module": "orders", + "scenario": null, + "name": "统一订单详情与列表身份一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085906673965793281?tenantId=2085906649595891713" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4d1c88c9-e5d6-4ce4-aa3c-006604edc15f, 50489bb2-25fd-45c8-ba70-7f3b14dc5fb1", + "traceId": "de649f51c8884eaf979c74908b191558", + "evidence": "tenantId=2085906649595891713, orderId=2085906673965793281, timeline=3", + "checkedAt": "2026-08-08T01:53:13.789Z" + }, + { + "module": "orders", + "scenario": null, + "name": "查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e02edcaa-3950-4f19-b4cb-a97f62e179ef, 9bbd217c-eb50-427e-a8e5-3917deeb17bf", + "traceId": "fcb8427cce6243d2b100a906627e2b94", + "evidence": "", + "checkedAt": "2026-08-08T01:53:13.838Z" + }, + { + "module": "orders", + "scenario": null, + "name": "头程订单分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e02edcaa-3950-4f19-b4cb-a97f62e179ef, 9bbd217c-eb50-427e-a8e5-3917deeb17bf", + "traceId": "fcb8427cce6243d2b100a906627e2b94", + "evidence": "records=20, total=474", + "checkedAt": "2026-08-08T01:53:13.839Z" + }, + { + "module": "orders", + "scenario": null, + "name": "查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085906676373323777?tenantId=2085906649595891713" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ff604e75-e48e-4478-83e4-73552521ab4b, 15776b66-94cb-4dda-a3be-f90baebfca36", + "traceId": "64264f2946a441ec9c3637a3ded6aabd", + "evidence": "", + "checkedAt": "2026-08-08T01:53:13.879Z" + }, + { + "module": "orders", + "scenario": null, + "name": "头程订单详情包含货物、地址、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085906676373323777?tenantId=2085906649595891713" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ff604e75-e48e-4478-83e4-73552521ab4b, 15776b66-94cb-4dda-a3be-f90baebfca36", + "traceId": "64264f2946a441ec9c3637a3ded6aabd", + "evidence": "orderId=2085906676373323777, cargoes=1, history=2", + "checkedAt": "2026-08-08T01:53:13.879Z" + }, + { + "module": "orders", + "scenario": null, + "name": "查询平台入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad2936d7-8f63-4afd-b04f-9afcd956c63b, 4c8f2435-1a24-4524-86a7-83db13d230a0", + "traceId": "02518a2fe0fc4987855ff4c28d943689", + "evidence": "", + "checkedAt": "2026-08-08T01:53:13.922Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad2936d7-8f63-4afd-b04f-9afcd956c63b, 4c8f2435-1a24-4524-86a7-83db13d230a0", + "traceId": "02518a2fe0fc4987855ff4c28d943689", + "evidence": "records=20, total=244", + "checkedAt": "2026-08-08T01:53:13.922Z" + }, + { + "module": "orders", + "scenario": null, + "name": "查询平台入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085905439760363522?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1ffa560d-6466-4e55-b66b-12fbb715a8c4, 3e6c3fa5-3b61-4886-aad0-25433133ce3e", + "traceId": "c952a2b76780471187a9b223df9b243f", + "evidence": "", + "checkedAt": "2026-08-08T01:53:13.955Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085905439760363522?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1ffa560d-6466-4e55-b66b-12fbb715a8c4, 3e6c3fa5-3b61-4886-aad0-25433133ce3e", + "traceId": "c952a2b76780471187a9b223df9b243f", + "evidence": "inboundId=2085905439760363522, status=WAIT_SPLIT", + "checkedAt": "2026-08-08T01:53:13.955Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "取得隔离的待测量入库单", + "passed": false, + "deploymentBlocker": true, + "request": null, + "http": null, + "code": null, + "message": null, + "requestId": null, + "traceId": null, + "evidence": "orders 模块未提供 marker=ADMIN-API-20260808015313253 的 inboundId/tenantId;为避免修改随机历史订单,本模块停止写入", + "checkedAt": "2026-08-08T01:53:13.957Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015323.json b/reports/admin-test-env-acceptance-20260808015323.json new file mode 100644 index 000000000..43496a027 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015323.json @@ -0,0 +1,539 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015323030", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:53:28.059Z", + "startedAt": "2026-08-08T01:53:23.030Z", + "success": true, + "fatal": null, + "summary": { + "total": 27, + "passed": 27, + "failed": 0 + }, + "modules": [ + { + "name": "pricing", + "startedAt": "2026-08-08T01:53:23.467Z", + "finishedAt": "2026-08-08T01:53:28.059Z", + "success": true, + "passed": 26, + "failed": 0, + "fatal": null + } + ], + "scenarios": [ + { + "name": "price-book-lifecycle", + "module": "pricing", + "success": true, + "deploymentBlocked": false, + "passed": 26, + "failed": 0 + } + ], + "deploymentBlockers": [], + "createdResources": { + "priceBookVersion": { + "versionId": "2085907189707878402", + "marker": "ADMIN-API-20260808015323030", + "sourceSha256": "3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab" + } + }, + "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": "ffd1a415-9a05-484f-80bf-3d560ed20a20, bafe323a-38a8-4b50-8215-4720276f5f5a", + "traceId": "aefcc866fdaa4398834019d8c90945c6", + "evidence": "", + "checkedAt": "2026-08-08T01:53:23.464Z" + }, + { + "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": "19ba7a2d-8e69-4638-ac35-c9d73681c8a2, fea311a9-9a0f-41f1-b6df-a0ac829420ea", + "traceId": "8813930e89d44b1ca390cd0e6e7c36e1", + "evidence": "", + "checkedAt": "2026-08-08T01:53:23.521Z" + }, + { + "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": "19ba7a2d-8e69-4638-ac35-c9d73681c8a2, fea311a9-9a0f-41f1-b6df-a0ac829420ea", + "traceId": "8813930e89d44b1ca390cd0e6e7c36e1", + "evidence": "versions=7, active=1", + "checkedAt": "2026-08-08T01:53:23.521Z" + }, + { + "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-20260808015323030-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T01:53:23.530Z" + }, + { + "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": "950d0386-ac27-4dfe-a89c-ca96b582d659, 6d5e1be0-30fc-4ca8-a18b-a9c8ca7d51a9", + "traceId": "99f605ff4563477da81996d4d7d9d24c", + "evidence": "fileName=ADMIN-API-20260808015323030-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T01:53:25.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": "950d0386-ac27-4dfe-a89c-ca96b582d659, 6d5e1be0-30fc-4ca8-a18b-a9c8ca7d51a9", + "traceId": "99f605ff4563477da81996d4d7d9d24c", + "evidence": "versionId=2085907189707878402, status=PENDING_CONFIRMATION, fileName=ADMIN-API-20260808015323030-2026.08.03柏悦价格表 船期2026.08.12.xlsx, shaMatched=true", + "checkedAt": "2026-08-08T01:53:25.409Z" + }, + { + "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": "950d0386-ac27-4dfe-a89c-ca96b582d659, 6d5e1be0-30fc-4ca8-a18b-a9c8ca7d51a9", + "traceId": "99f605ff4563477da81996d4d7d9d24c", + "evidence": "channelCount=15, unique=15, missing=none", + "checkedAt": "2026-08-08T01:53:25.409Z" + }, + { + "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": "950d0386-ac27-4dfe-a89c-ca96b582d659, 6d5e1be0-30fc-4ca8-a18b-a9c8ca7d51a9", + "traceId": "99f605ff4563477da81996d4d7d9d24c", + "evidence": "rateCount=2157, declared=2157, valid=true", + "checkedAt": "2026-08-08T01:53:25.410Z" + }, + { + "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": "950d0386-ac27-4dfe-a89c-ca96b582d659, 6d5e1be0-30fc-4ca8-a18b-a9c8ca7d51a9", + "traceId": "99f605ff4563477da81996d4d7d9d24c", + "evidence": "blocking=0, unexpected=none, infrastructure=none", + "checkedAt": "2026-08-08T01:53:25.410Z" + }, + { + "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": "85ae312c-18e0-4a27-bcfc-d97e8e98f149, ac831c7e-d205-426b-a122-35073893ac7b", + "traceId": "810f528e025c44aaa7518cddc54faf07", + "evidence": "", + "checkedAt": "2026-08-08T01:53:25.434Z" + }, + { + "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": "85ae312c-18e0-4a27-bcfc-d97e8e98f149, ac831c7e-d205-426b-a122-35073893ac7b", + "traceId": "810f528e025c44aaa7518cddc54faf07", + "evidence": "pending=PENDING_CONFIRMATION, activeBefore=2085661426268549121, activeAfterUpload=2085661426268549121", + "checkedAt": "2026-08-08T01:53:25.435Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询待确认版本渠道和价格预览", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085907189707878402" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "deffed17-5367-4cd8-a3c1-7ab6ad14f78a, 047c53de-2cec-4dd7-80ea-a63b46805c1b", + "traceId": "987e92da473444b981bb8d49807b4fe2", + "evidence": "", + "checkedAt": "2026-08-08T01:53:25.541Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "详情与上传解析结果一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085907189707878402" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "deffed17-5367-4cd8-a3c1-7ab6ad14f78a, 047c53de-2cec-4dd7-80ea-a63b46805c1b", + "traceId": "987e92da473444b981bb8d49807b4fe2", + "evidence": "versionId=2085907189707878402, channels=15, rates=2157, issues=2", + "checkedAt": "2026-08-08T01:53:25.541Z" + }, + { + "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/2085907189707878402/source" + }, + "http": 200, + "code": null, + "message": "1343413 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "a87afbfa-e2a8-4716-ad3e-0b9f81bd7e6d, ee2fca00-55ec-406d-b39a-9cdc27cb34c8, 3c9cffc2-06eb-4beb-9213-74289ae5b87d", + "traceId": "8adf5a4db38f4a789d4bf6431d6f4c97, 490c5fe289b24a99a28af29a2afe4fb3", + "evidence": "bytes=1343413, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, zipMagic=true, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T01:53:25.679Z" + }, + { + "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": "ef2feb3c-a719-4369-86e9-21a7c9ca5df2, 3f35d758-6b6b-468f-80d5-eda98207ca04", + "traceId": "a7864a481e09470cb23c5ac2f5d1364d", + "evidence": "", + "checkedAt": "2026-08-08T01:53:25.715Z" + }, + { + "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": "e00f34ba-ace4-4586-a8dd-3a53030cbc21, 44446dc8-10c5-4cdb-afc3-8450010efc4f", + "traceId": "ce9fc0584ba8445ca468f9e5ca2f630b", + "evidence": "", + "checkedAt": "2026-08-08T01:53:25.764Z" + }, + { + "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": "e00f34ba-ace4-4586-a8dd-3a53030cbc21, 44446dc8-10c5-4cdb-afc3-8450010efc4f", + "traceId": "ce9fc0584ba8445ca468f9e5ca2f630b", + "evidence": "origins=CN-DONGGUAN-01->193000000000200002,CN-YIWU-01->193000000000200001, overseas=纽约仓->193000000000200004,洛杉矶仓->193000000000200003, missing=none", + "checkedAt": "2026-08-08T01:53:25.765Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "确认仓库映射并立即生效", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085907189707878402/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "292ac8b9-c619-4b88-9c0a-d8a6a99acc78, d51d8c16-cca7-4a10-966c-93f30cb8da71", + "traceId": "19cb4f1200434041a6bb2dd12324bbec", + "evidence": "versionId=2085907189707878402, originMappings=2, overseasMappings=2", + "checkedAt": "2026-08-08T01:53:27.865Z" + }, + { + "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/2085907189707878402/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "292ac8b9-c619-4b88-9c0a-d8a6a99acc78, d51d8c16-cca7-4a10-966c-93f30cb8da71", + "traceId": "19cb4f1200434041a6bb2dd12324bbec", + "evidence": "status=ACTIVE, blocking=0, publishedAt=2026-08-08T09:53:26.781, channels=15, rates=2157", + "checkedAt": "2026-08-08T01:53:27.865Z" + }, + { + "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": "0e715e18-3b4e-413e-9f2c-299a7aa37350, a3d54336-5c33-4458-b234-082298026520", + "traceId": "da1deab503934499b576ebeedacd785b", + "evidence": "", + "checkedAt": "2026-08-08T01:53:27.900Z" + }, + { + "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": "0e715e18-3b4e-413e-9f2c-299a7aa37350, a3d54336-5c33-4458-b234-082298026520", + "traceId": "da1deab503934499b576ebeedacd785b", + "evidence": "active=2085907189707878402", + "checkedAt": "2026-08-08T01:53:27.901Z" + }, + { + "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": "0e715e18-3b4e-413e-9f2c-299a7aa37350, a3d54336-5c33-4458-b234-082298026520", + "traceId": "da1deab503934499b576ebeedacd785b", + "evidence": "previous=2085661426268549121, superseded=true", + "checkedAt": "2026-08-08T01:53:27.901Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询当前生效价格版本详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085907189707878402" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "75c1590f-8d33-43f6-bd24-2dd29436c45f, e5944f65-f645-4694-8ced-aef3f3c8b36d", + "traceId": "becb11887ecd41d6b81c441c807cdc8d", + "evidence": "", + "checkedAt": "2026-08-08T01:53:27.990Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "当前生效版本预览数据完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085907189707878402" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "75c1590f-8d33-43f6-bd24-2dd29436c45f, e5944f65-f645-4694-8ced-aef3f3c8b36d", + "traceId": "becb11887ecd41d6b81c441c807cdc8d", + "evidence": "status=ACTIVE, channels=15, rates=2157", + "checkedAt": "2026-08-08T01:53:27.990Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "已生效版本禁止重复发布", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085907189707878402/publish" + }, + "http": 200, + "code": "A0409", + "message": "只有待确认上传记录可以确认并生效", + "requestId": "af0d78af-caac-4095-9164-6de76bf07c33", + "traceId": "00bbbdf631374c56ad0d965c6fdae0a3", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:53:28.027Z" + }, + { + "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": "162da644-9186-445c-980f-6bd59800e362, 4cbd2911-2dfd-45e5-848d-50a574bc457a", + "traceId": "a1a2ed53cd2345e5a3150c577dd38693", + "evidence": "", + "checkedAt": "2026-08-08T01:53:28.059Z" + }, + { + "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": "162da644-9186-445c-980f-6bd59800e362, 4cbd2911-2dfd-45e5-848d-50a574bc457a", + "traceId": "a1a2ed53cd2345e5a3150c577dd38693", + "evidence": "active=2085907189707878402", + "checkedAt": "2026-08-08T01:53:28.059Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015325.json b/reports/admin-test-env-acceptance-20260808015325.json new file mode 100644 index 000000000..b51089a7b --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015325.json @@ -0,0 +1,740 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015325966", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:53:27.032Z", + "startedAt": "2026-08-08T01:53:25.966Z", + "success": false, + "fatal": null, + "summary": { + "total": 38, + "passed": 36, + "failed": 2 + }, + "modules": [ + { + "name": "customers", + "startedAt": "2026-08-08T01:53:26.382Z", + "finishedAt": "2026-08-08T01:53:27.032Z", + "success": false, + "passed": 35, + "failed": 2, + "fatal": null + } + ], + "scenarios": [ + { + "name": "customer-dimension-rules", + "module": "customers", + "success": true, + "deploymentBlocked": false, + "passed": 13, + "failed": 0 + } + ], + "deploymentBlockers": [], + "createdResources": { + "customer": { + "tenantId": "2085907201314639874", + "marker": "ADMIN-API-20260808015325966", + "contactPhone": "16154006382" + } + }, + "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": "db634c73-67af-4c33-b3a7-69c7198b7e5c, f3c2e482-059b-49e1-b260-67caf7c7bcd5", + "traceId": "ba2aee8dce5c4fb380d3fed7297f9b15", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.381Z" + }, + { + "module": "customers", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16154006382" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "24e85948-fd9a-4f46-9e9f-1fc93b9a874e, d962cc30-8abe-4f40-9444-67665eaba6ab", + "traceId": "fc06afaa3d564789a5588244d4c7898c", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T01:53:26.431Z" + }, + { + "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": "d3cbed21-b931-46ad-a48e-172162068cdd, a7962dde-3790-4391-a910-2ea5f3651443", + "traceId": "b5fc9f51280f412d8d9423e2bee3fb07", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.486Z" + }, + { + "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": "d3cbed21-b931-46ad-a48e-172162068cdd, a7962dde-3790-4391-a910-2ea5f3651443", + "traceId": "b5fc9f51280f412d8d9423e2bee3fb07", + "evidence": "missing=none", + "checkedAt": "2026-08-08T01:53:26.486Z" + }, + { + "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": "d3cbed21-b931-46ad-a48e-172162068cdd, a7962dde-3790-4391-a910-2ea5f3651443", + "traceId": "b5fc9f51280f412d8d9423e2bee3fb07", + "evidence": "tenantId=2085907201314639874, status=PROFILE_REQUIRED", + "checkedAt": "2026-08-08T01:53:26.486Z" + }, + { + "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": "d3cbed21-b931-46ad-a48e-172162068cdd, a7962dde-3790-4391-a910-2ea5f3651443", + "traceId": "b5fc9f51280f412d8d9423e2bee3fb07", + "evidence": "temporaryPassword=omitted, administratorUsername=omitted", + "checkedAt": "2026-08-08T01:53:26.486Z" + }, + { + "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": "d3cbed21-b931-46ad-a48e-172162068cdd, a7962dde-3790-4391-a910-2ea5f3651443", + "traceId": "b5fc9f51280f412d8d9423e2bee3fb07", + "evidence": "creditCode=omitted, approvedAt=omitted", + "checkedAt": "2026-08-08T01:53:26.486Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "新客户尺寸规则可查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c1e457-9f56-4bb8-ae5c-8921241530f4, afbf4496-ce98-42f7-8cfa-41845c360584", + "traceId": "4b76edbbac0444959b26be3748f77618", + "evidence": "tenantId=2085907201314639874", + "checkedAt": "2026-08-08T01:53:26.518Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "固定四箱规顺序完整且无重复", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c1e457-9f56-4bb8-ae5c-8921241530f4, afbf4496-ce98-42f7-8cfa-41845c360584", + "traceId": "4b76edbbac0444959b26be3748f77618", + "evidence": "count=4, order=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T01:53:26.518Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "四箱规默认内径、加边和备注正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c1e457-9f56-4bb8-ae5c-8921241530f4, afbf4496-ce98-42f7-8cfa-41845c360584", + "traceId": "4b76edbbac0444959b26be3748f77618", + "evidence": "defaults=matched", + "checkedAt": "2026-08-08T01:53:26.518Z" + }, + { + "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=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c1e457-9f56-4bb8-ae5c-8921241530f4, afbf4496-ce98-42f7-8cfa-41845c360584", + "traceId": "4b76edbbac0444959b26be3748f77618", + "evidence": "groupTenantIdType=string, rows=string/v0,string/v0,string/v0,string/v0", + "checkedAt": "2026-08-08T01:53:26.518Z" + }, + { + "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=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c1e457-9f56-4bb8-ae5c-8921241530f4, afbf4496-ce98-42f7-8cfa-41845c360584", + "traceId": "4b76edbbac0444959b26be3748f77618", + "evidence": "derivedRows=4", + "checkedAt": "2026-08-08T01:53:26.518Z" + }, + { + "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=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c1e457-9f56-4bb8-ae5c-8921241530f4, afbf4496-ce98-42f7-8cfa-41845c360584", + "traceId": "4b76edbbac0444959b26be3748f77618", + "evidence": "fields=boxType,innerLengthCm,innerWidthCm,innerHeightCm,edgeAdditionCm,remark,version", + "checkedAt": "2026-08-08T01:53:26.519Z" + }, + { + "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=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0c34bdcc-dbea-40c0-9f45-5fca1655ab13, b6a24c2e-f7f1-4a8c-9c5b-66ad69d982ef", + "traceId": "60653a35cef34af5b7a136ff0d8456e3", + "evidence": "rows=4", + "checkedAt": "2026-08-08T01:53:26.552Z" + }, + { + "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=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0c34bdcc-dbea-40c0-9f45-5fca1655ab13, b6a24c2e-f7f1-4a8c-9c5b-66ad69d982ef", + "traceId": "60653a35cef34af5b7a136ff0d8456e3", + "evidence": "versions=1,1,1,1", + "checkedAt": "2026-08-08T01:53:26.553Z" + }, + { + "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=2085907201314639874" + }, + "http": 200, + "code": "A0409", + "message": "箱规尺寸配置已被修改,请刷新后重试", + "requestId": "0b861ca5-a2a4-4e85-b6ea-5dbe4f944db0", + "traceId": "46a446fe831e4c969e8c1ce3c02ea313", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:53:26.585Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突后重新查询四条规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6c5f6611-d7c7-4a3c-a969-f7b5275bfea3, 55881a79-9266-4727-bf33-efbf77fcc3fb", + "traceId": "0f17b1e9109f4838a4696e789fec7072", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.617Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突请求未造成四行部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6c5f6611-d7c7-4a3c-a969-f7b5275bfea3, 55881a79-9266-4727-bf33-efbf77fcc3fb", + "traceId": "0f17b1e9109f4838a4696e789fec7072", + "evidence": "unchangedRows=4", + "checkedAt": "2026-08-08T01:53:26.617Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "恢复本轮修改前的四箱规配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "65b35a20-b9de-4b29-abf8-05f4e2bde0e3, 5d75f480-c97d-4cae-a6c3-a031570fa7f6", + "traceId": "7604a277ba2a4d3dbaf453b4491983bc", + "evidence": "restore=original-values", + "checkedAt": "2026-08-08T01:53:26.669Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "尺寸规则恢复后回显与初始值一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "65b35a20-b9de-4b29-abf8-05f4e2bde0e3, 5d75f480-c97d-4cae-a6c3-a031570fa7f6", + "traceId": "7604a277ba2a4d3dbaf453b4491983bc", + "evidence": "restoredRows=4", + "checkedAt": "2026-08-08T01:53:26.669Z" + }, + { + "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-808015325966" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3d89c7c-60aa-466e-8427-df5023fc9be1, 9d2528ed-3b66-44b6-9312-fd825c0f6c7b", + "traceId": "0791dc3ecbd74e5ea570583924d43914", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.707Z" + }, + { + "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-808015325966" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3d89c7c-60aa-466e-8427-df5023fc9be1, 9d2528ed-3b66-44b6-9312-fd825c0f6c7b", + "traceId": "0791dc3ecbd74e5ea570583924d43914", + "evidence": "found=true, missing=none", + "checkedAt": "2026-08-08T01:53:26.707Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b214e1-d5fd-4df1-85e5-dcb2604fca29, a5cc615b-ae7e-44eb-a394-d80cc215788f", + "traceId": "58f87b8dad654f34a253ca6169a63268", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.755Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户详情基本信息正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b214e1-d5fd-4df1-85e5-dcb2604fca29, a5cc615b-ae7e-44eb-a394-d80cc215788f", + "traceId": "58f87b8dad654f34a253ca6169a63268", + "evidence": "tenantId=2085907201314639874", + "checkedAt": "2026-08-08T01:53:26.756Z" + }, + { + "module": "customers", + "scenario": null, + "name": "编辑客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2c6d2069-c5ae-4227-a88b-825130a052e8, 60cfcb3c-a8c8-4fe0-8168-0ff601c94e42", + "traceId": "56cb0abf70d747eaa7ef0d77b2bcfa39", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.802Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2c6d2069-c5ae-4227-a88b-825130a052e8, 60cfcb3c-a8c8-4fe0-8168-0ff601c94e42", + "traceId": "56cb0abf70d747eaa7ef0d77b2bcfa39", + "evidence": "tenantId=2085907201314639874", + "checkedAt": "2026-08-08T01:53:26.802Z" + }, + { + "module": "customers", + "scenario": null, + "name": "回查客户编辑结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cc7f4674-b902-4f71-8f33-a5afdf1c1744, ca7a07c2-ba52-4996-a09c-6208704de74b", + "traceId": "af1b6e53c8aa43ac98028aa314a2f6e9", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.826Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cc7f4674-b902-4f71-8f33-a5afdf1c1744, ca7a07c2-ba52-4996-a09c-6208704de74b", + "traceId": "af1b6e53c8aa43ac98028aa314a2f6e9", + "evidence": "tenantId=2085907201314639874", + "checkedAt": "2026-08-08T01:53:26.826Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询资质", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "124f0e8b-c64d-42f1-a697-ab385d852aed, 195e34f3-1253-4d72-87b6-d38c23652de1", + "traceId": "7c7fa61561f84f0d9d5d415a72202849", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.849Z" + }, + { + "module": "customers", + "scenario": null, + "name": "资质概况结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "124f0e8b-c64d-42f1-a697-ab385d852aed, 195e34f3-1253-4d72-87b6-d38c23652de1", + "traceId": "7c7fa61561f84f0d9d5d415a72202849", + "evidence": "count=0", + "checkedAt": "2026-08-08T01:53:26.849Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询成员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3748f7f8-766a-4746-a9d9-9340e7737bb2, 4b0269c1-29de-4a08-9f18-e0daacafbceb", + "traceId": "75a180aa950f4c96963dd0527ad5c073", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.893Z" + }, + { + "module": "customers", + "scenario": null, + "name": "待完善客户尚未生成企业管理员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085907201314639874/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3748f7f8-766a-4746-a9d9-9340e7737bb2, 4b0269c1-29de-4a08-9f18-e0daacafbceb", + "traceId": "75a180aa950f4c96963dd0527ad5c073", + "evidence": "members=0", + "checkedAt": "2026-08-08T01:53:26.894Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询运单数量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "57045150-9185-4fbe-bdfb-eb25f0b910c0, 8ac72add-0902-4975-a7af-bf98772f8117", + "traceId": "2aac73b5c3fa48d18a2a9bbaf46f2d40", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.933Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况返回当前客户运单数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085907201314639874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "57045150-9185-4fbe-bdfb-eb25f0b910c0, 8ac72add-0902-4975-a7af-bf98772f8117", + "traceId": "2aac73b5c3fa48d18a2a9bbaf46f2d40", + "evidence": "orderCount=0", + "checkedAt": "2026-08-08T01:53:26.933Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户运单记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085907201314639874&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d48f448d-352d-43bd-89b0-51d8372ea9b6, ad3eb7be-0a5a-436d-95a1-d7795713eef6", + "traceId": "6056d078fa394c18a3e2c7fec4bfadca", + "evidence": "", + "checkedAt": "2026-08-08T01:53:26.973Z" + }, + { + "module": "customers", + "scenario": null, + "name": "运单记录分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085907201314639874&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d48f448d-352d-43bd-89b0-51d8372ea9b6, ad3eb7be-0a5a-436d-95a1-d7795713eef6", + "traceId": "6056d078fa394c18a3e2c7fec4bfadca", + "evidence": "records=0, total=0", + "checkedAt": "2026-08-08T01:53:26.973Z" + }, + { + "module": "customers", + "scenario": null, + "name": "归档测试客户", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085907201314639874/archive" + }, + "http": 200, + "code": "S0500", + "message": "Internal server error", + "requestId": "e35a256c-67a2-4146-87b4-294e0ad6a872", + "traceId": "135e1ad7b73d4d669db31ac1738dd3a2", + "evidence": "", + "checkedAt": "2026-08-08T01:53:27.032Z" + }, + { + "module": "customers", + "scenario": null, + "name": "测试客户归档后处于停用状态", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085907201314639874/archive" + }, + "http": 200, + "code": "S0500", + "message": "Internal server error", + "requestId": "e35a256c-67a2-4146-87b4-294e0ad6a872", + "traceId": "135e1ad7b73d4d669db31ac1738dd3a2", + "evidence": "status=missing", + "checkedAt": "2026-08-08T01:53:27.032Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015327.json b/reports/admin-test-env-acceptance-20260808015327.json new file mode 100644 index 000000000..61df4bf24 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015327.json @@ -0,0 +1,83 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015327235", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:53:27.783Z", + "startedAt": "2026-08-08T01:53:27.235Z", + "success": false, + "fatal": null, + "summary": { + "total": 2, + "passed": 1, + "failed": 1 + }, + "modules": [ + { + "name": "inbound-weight-ocr", + "startedAt": "2026-08-08T01:53:27.684Z", + "finishedAt": "2026-08-08T01:53:27.783Z", + "success": false, + "passed": 0, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "weight-image-recognition-and-confirmation", + "module": "inbound-weight-ocr", + "success": false, + "deploymentBlocked": false, + "passed": 0, + "failed": 1 + } + ], + "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": "b97739c1-555c-45a8-a9df-a11fac175b3d, 5d5a2199-d959-442e-8267-b277285b38b3", + "traceId": "0dc9c24b611a4a67b04e478be3171572", + "evidence": "", + "checkedAt": "2026-08-08T01:53:27.681Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅选择带本轮测试标记的可编辑入库单", + "passed": false, + "deploymentBlocker": false, + "request": null, + "http": null, + "code": null, + "message": null, + "requestId": null, + "traceId": null, + "evidence": "marker=ADMIN-API-20260808015327235, 未找到本轮创建且状态为 WAIT_MEASURE/MEASURING/MEASURE_REJECTED 的入库单", + "checkedAt": "2026-08-08T01:53:27.783Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015845.json b/reports/admin-test-env-acceptance-20260808015845.json new file mode 100644 index 000000000..d3233c30a --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015845.json @@ -0,0 +1,932 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015845602", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:58:48.416Z", + "startedAt": "2026-08-08T01:58:45.602Z", + "success": false, + "fatal": null, + "summary": { + "total": 48, + "passed": 46, + "failed": 2 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T01:58:45.972Z", + "finishedAt": "2026-08-08T01:58:48.416Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808015845602", + "tenantId": "10001", + "orderId": "2085908544302415874", + "productImageFileId": "2085908543895568386", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085908549518012417", + "orderNo": "FL2085908544302415874", + "inboundCode": "RK-2085908544302415874", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085908549518012417", + "marker": "ADMIN-API-20260808015845602" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085908549518012417", + "marker": "ADMIN-API-20260808015845602" + } + }, + "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": "2df00281-3bc2-448b-a0e7-7b2d8a3686c0, 29ecd91d-f58f-4816-9571-5bc9316016f7", + "traceId": "e964f0bee2dc41a9b2819394c7a40869", + "evidence": "", + "checkedAt": "2026-08-08T01:58:45.971Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9bafe061-2875-4edf-b88e-2b07a9f1dd5c, 88a6b4cc-15bb-42ca-84e2-155d3dd02a59", + "traceId": "32698d4d352b43b8b33385327d62459b", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T01:58:46.317Z" + }, + { + "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": "f0319880-b18c-4c74-a8aa-d9b4ebfd3139, 2949ef4f-8049-4b02-bed6-9c85be09abdb", + "traceId": "0d4f1aef979043feb4fa7e12ed33d8e0", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.344Z" + }, + { + "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": "f0319880-b18c-4c74-a8aa-d9b4ebfd3139, 2949ef4f-8049-4b02-bed6-9c85be09abdb", + "traceId": "0d4f1aef979043feb4fa7e12ed33d8e0", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T01:58:46.344Z" + }, + { + "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": "f5b956ab-635f-4d5a-b5f4-c6e06a99ea11, f3855650-244a-42a6-b738-cd302bb9ce65", + "traceId": "c918eedc616c4d9ebd1e1f8f3ece807f", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T01:58:46.378Z" + }, + { + "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": "f5b956ab-635f-4d5a-b5f4-c6e06a99ea11, f3855650-244a-42a6-b738-cd302bb9ce65", + "traceId": "c918eedc616c4d9ebd1e1f8f3ece807f", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T01:58:46.378Z" + }, + { + "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": "2b7b22b6-705b-4e6d-8ffb-e3ae3bea9e86, d0fb6ae1-e618-4432-b9d4-a58a09da32c7", + "traceId": "56f1f1300a144c7b9c90c8824eff5899", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.412Z" + }, + { + "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": "2b7b22b6-705b-4e6d-8ffb-e3ae3bea9e86, d0fb6ae1-e618-4432-b9d4-a58a09da32c7", + "traceId": "56f1f1300a144c7b9c90c8824eff5899", + "evidence": "count=2", + "checkedAt": "2026-08-08T01:58:46.412Z" + }, + { + "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": "45045704-2cd0-4403-be53-293bc5f26e72, 5bfc6053-ac43-4c9c-83ad-b326b083ebd2", + "traceId": "b5775339f5cf44549606038c716326bb", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.464Z" + }, + { + "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": "45045704-2cd0-4403-be53-293bc5f26e72, 5bfc6053-ac43-4c9c-83ad-b326b083ebd2", + "traceId": "b5775339f5cf44549606038c716326bb", + "evidence": "count=200", + "checkedAt": "2026-08-08T01:58:46.464Z" + }, + { + "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": "79f6d7f0-f634-4282-b9c0-a0167dba8d8d, e9a9e0a1-a9e3-4fe7-8dda-321b25706f74", + "traceId": "4d91cee3c9a546489ca856683c1e3866", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.500Z" + }, + { + "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": "79f6d7f0-f634-4282-b9c0-a0167dba8d8d, e9a9e0a1-a9e3-4fe7-8dda-321b25706f74", + "traceId": "4d91cee3c9a546489ca856683c1e3866", + "evidence": "count=15", + "checkedAt": "2026-08-08T01:58:46.501Z" + }, + { + "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": "151cabba-06d0-47c1-ae7a-e9c04a53bb99, df6dc290-eb32-4e1a-871e-24b997e3be8e", + "traceId": "3d56dc4845224ed6a960d0941afa2437", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.532Z" + }, + { + "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": "84e5df0a-1165-4616-9fea-e126b773b012, e5625c74-fae1-4156-843c-b302789abd8d", + "traceId": "f4dc865591b74b50b2fb216a3a6eb7e8", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T01:58:46.563Z" + }, + { + "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": "84e5df0a-1165-4616-9fea-e126b773b012, e5625c74-fae1-4156-843c-b302789abd8d", + "traceId": "f4dc865591b74b50b2fb216a3a6eb7e8", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T01:58:46.563Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085908543895568386" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "6fb2eb7d-e6c0-465e-85ba-80ceee864afe, 9064fb39-dd42-4a98-acd6-17f395903625", + "traceId": "647a5fda1fcd4efba4b597718e8b6577", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T01:58:46.595Z" + }, + { + "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": "45a345d8-d836-47ec-af79-03da6448ddb3, ae795305-805a-4361-b15f-769f02211433", + "traceId": "6a6671c65031457885d3140d9ddea7b0", + "evidence": "marker=ADMIN-API-20260808015845602", + "checkedAt": "2026-08-08T01:58:46.665Z" + }, + { + "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": "1cbf94cf-898c-450c-bda1-aff27188791a, fdf7c425-ac45-495c-afc2-f3c0af3c2e64", + "traceId": "e4fc664072c449f5bcdd3091b9e0826c", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.711Z" + }, + { + "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": "1cbf94cf-898c-450c-bda1-aff27188791a, fdf7c425-ac45-495c-afc2-f3c0af3c2e64", + "traceId": "e4fc664072c449f5bcdd3091b9e0826c", + "evidence": "orderId=2085908544302415874, replayedId=2085908544302415874", + "checkedAt": "2026-08-08T01:58:46.711Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908544302415874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9a744a35-40ac-4f27-b0b6-e88a05148da7, 307ebeb3-91ea-4d0a-aced-6d1a8c54f2e5", + "traceId": "5ca1918bae824baf8a5e9f4c941b1187", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.750Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908544302415874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9a744a35-40ac-4f27-b0b6-e88a05148da7, 307ebeb3-91ea-4d0a-aced-6d1a8c54f2e5", + "traceId": "5ca1918bae824baf8a5e9f4c941b1187", + "evidence": "orderNo=FL2085908544302415874, status=DRAFT", + "checkedAt": "2026-08-08T01:58:46.751Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908544302415874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9a744a35-40ac-4f27-b0b6-e88a05148da7, 307ebeb3-91ea-4d0a-aced-6d1a8c54f2e5", + "traceId": "5ca1918bae824baf8a5e9f4c941b1187", + "evidence": "cargoes=4, imageFileId=2085908543895568386", + "checkedAt": "2026-08-08T01:58:46.751Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085908544302415874/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2ddeae60-09f4-46f4-ba95-0da918cae5a1, 1c99eaa3-59c8-44c4-be1f-d8032cd7a5c8", + "traceId": "77a5f60280ca457f8342b0bcd69f9b3c", + "evidence": "orderId=2085908544302415874", + "checkedAt": "2026-08-08T01:58:46.815Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908544302415874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2a7d9c8a-e5e3-4e0f-9ad1-38d8448f7ba7, f719ea5c-96ee-43ae-a7e0-b7bbec868a91", + "traceId": "3ad7ca4193654a048d4b7176bb940316", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.844Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908544302415874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2a7d9c8a-e5e3-4e0f-9ad1-38d8448f7ba7, f719ea5c-96ee-43ae-a7e0-b7bbec868a91", + "traceId": "3ad7ca4193654a048d4b7176bb940316", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T01:58:46.844Z" + }, + { + "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=FL2085908544302415874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90b72878-5370-4bda-93a7-fad6b786f9a1, 94f8b715-4da1-481f-9e33-0e68b0164d4e", + "traceId": "142e51a32c114f25a5bb5bc2f27e20e4", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.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=FL2085908544302415874" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90b72878-5370-4bda-93a7-fad6b786f9a1, 94f8b715-4da1-481f-9e33-0e68b0164d4e", + "traceId": "142e51a32c114f25a5bb5bc2f27e20e4", + "evidence": "orderId=2085908544302415874, found=true", + "checkedAt": "2026-08-08T01:58:46.884Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ab453fcc-d6dc-4692-aac7-71aa232700ed, 16fe95a7-1ea1-4505-b3a5-1dfd5a5ffe07", + "traceId": "9dcddfefa35d4f7f91cd6d6f274a8e3f", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.927Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ab453fcc-d6dc-4692-aac7-71aa232700ed, 16fe95a7-1ea1-4505-b3a5-1dfd5a5ffe07", + "traceId": "9dcddfefa35d4f7f91cd6d6f274a8e3f", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T01:58:46.927Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085908544302415874&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9fe027f9-daf9-4524-b630-15c8e33f8f5a, 1650d83d-e4b4-4b5a-8712-3f896b0a40bc", + "traceId": "b6832bb6eae644ad976303bd062b778f", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.957Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085908544302415874&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9fe027f9-daf9-4524-b630-15c8e33f8f5a, 1650d83d-e4b4-4b5a-8712-3f896b0a40bc", + "traceId": "b6832bb6eae644ad976303bd062b778f", + "evidence": "orderId=2085908544302415874, found=true", + "checkedAt": "2026-08-08T01:58:46.957Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc22ec0a-1b44-4407-abd4-02b0998ce3c4, bcb367cf-09ee-4856-ae76-e6c8a04ad0a5", + "traceId": "9a683d10e9b0495f8229336e44874e38", + "evidence": "", + "checkedAt": "2026-08-08T01:58:46.985Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc22ec0a-1b44-4407-abd4-02b0998ce3c4, bcb367cf-09ee-4856-ae76-e6c8a04ad0a5", + "traceId": "9a683d10e9b0495f8229336e44874e38", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T01:58:46.985Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc22ec0a-1b44-4407-abd4-02b0998ce3c4, bcb367cf-09ee-4856-ae76-e6c8a04ad0a5", + "traceId": "9a683d10e9b0495f8229336e44874e38", + "evidence": "cargoes=4, imageFileId=2085908543895568386", + "checkedAt": "2026-08-08T01:58:46.985Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c93d3ee3-bf0f-411b-846f-667cccd1a99a, cc8111a2-41fb-487d-bd6d-1ab0293f45f1", + "traceId": "2761a0f12b804b97b422df9ce2296e25", + "evidence": "", + "checkedAt": "2026-08-08T01:58:47.021Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3786268b-5995-4700-a25e-5d9ec2d76028, d6ff05db-ba34-4479-b74a-3938b5c560ac", + "traceId": "8f34aa7fc14045eaa94d672d1a77addd", + "evidence": "orderId=2085908544302415874", + "checkedAt": "2026-08-08T01:58:47.068Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "23f20a88-9f4c-4580-9522-346a525f61a0, 3bb76bd9-c6f1-4319-b2e3-006f3e7b6933", + "traceId": "2020d9c73ccd4e8ea1c22dc1a66d5af4", + "evidence": "inboundId=2085908549518012417", + "checkedAt": "2026-08-08T01:58:48.176Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085908549518012417?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3bf50e55-ab10-4da5-84f1-ed4c6a8218f3, 1bb3971c-1ca4-43fd-bf4f-df29c69daf29", + "traceId": "8df76fb788f44bcaa521ca3623caf22c", + "evidence": "inboundId=2085908549518012417", + "checkedAt": "2026-08-08T01:58:48.212Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085908549518012417?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3bf50e55-ab10-4da5-84f1-ed4c6a8218f3, 1bb3971c-1ca4-43fd-bf4f-df29c69daf29", + "traceId": "8df76fb788f44bcaa521ca3623caf22c", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T01:58:48.212Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085908549518012417?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3bf50e55-ab10-4da5-84f1-ed4c6a8218f3, 1bb3971c-1ca4-43fd-bf4f-df29c69daf29", + "traceId": "8df76fb788f44bcaa521ca3623caf22c", + "evidence": "inboundId=2085908549518012417, history=1", + "checkedAt": "2026-08-08T01:58:48.212Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085908544302415874&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "77756604-d418-4061-8bb0-4c3e9f1ff147, 05844fd5-68b6-41bc-b63d-f238c7a6fa50", + "traceId": "c356efe5a4b349fa8624a956bb4a545f", + "evidence": "", + "checkedAt": "2026-08-08T01:58:48.250Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085908544302415874&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "77756604-d418-4061-8bb0-4c3e9f1ff147, 05844fd5-68b6-41bc-b63d-f238c7a6fa50", + "traceId": "c356efe5a4b349fa8624a956bb4a545f", + "evidence": "inboundId=2085908549518012417, total=1", + "checkedAt": "2026-08-08T01:58:48.251Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "dcede4ed-e6e3-4037-a5b3-8b5a2b41b447", + "traceId": "689fe50d1c4140debc77cb9c358dff84", + "evidence": "", + "checkedAt": "2026-08-08T01:58:48.287Z" + }, + { + "module": "orders", + "scenario": null, + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "dcede4ed-e6e3-4037-a5b3-8b5a2b41b447", + "traceId": "689fe50d1c4140debc77cb9c358dff84", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T01:58:48.287Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fcaf6403-0b07-45ab-aea0-0060bef0d8a1, 56cb5483-3a9b-4cc2-b36f-941caf68892c", + "traceId": "c807bc35c9d548de905c0fb365d43f8a", + "evidence": "", + "checkedAt": "2026-08-08T01:58:48.328Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8fc7773f-c7fa-45b1-94e9-214d456cd01b, 50b6afb8-5586-4d33-993c-f5d4914c591b", + "traceId": "3e4a441b3683484e80228080f3b3aa53", + "evidence": "", + "checkedAt": "2026-08-08T01:58:48.374Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "be32f8d8-9186-4350-a025-e7acd0ba707b, 3fc8db0b-dc64-40fe-a67c-e82b5103dd28", + "traceId": "7cdaeb99beb64aec8290800701610733", + "evidence": "", + "checkedAt": "2026-08-08T01:58:48.416Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908544302415874?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "be32f8d8-9186-4350-a025-e7acd0ba707b, 3fc8db0b-dc64-40fe-a67c-e82b5103dd28", + "traceId": "7cdaeb99beb64aec8290800701610733", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T01:58:48.416Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808015948.json b/reports/admin-test-env-acceptance-20260808015948.json new file mode 100644 index 000000000..523be1024 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808015948.json @@ -0,0 +1,1950 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808015948034", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:59:57.500Z", + "startedAt": "2026-08-08T01:59:48.034Z", + "success": false, + "fatal": null, + "summary": { + "total": 100, + "passed": 91, + "failed": 9 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T01:59:48.409Z", + "finishedAt": "2026-08-08T01:59:51.796Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "inbound-weight-ocr", + "startedAt": "2026-08-08T01:59:51.797Z", + "finishedAt": "2026-08-08T01:59:57.499Z", + "success": false, + "passed": 45, + "failed": 7, + "fatal": null + } + ], + "scenarios": [ + { + "name": "weight-image-recognition-and-confirmation", + "module": "inbound-weight-ocr", + "success": false, + "deploymentBlocked": true, + "passed": 45, + "failed": 7 + } + ], + "deploymentBlockers": [ + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "c32a4059-5eb7-48c9-99e5-171bd751e4be", + "traceId": "0bd5b3ea3d014ea9bebaea1b555f344f" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "c32a4059-5eb7-48c9-99e5-171bd751e4be", + "traceId": "0bd5b3ea3d014ea9bebaea1b555f344f" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "code": "200", + "requestId": "b2460681-4e1d-4eaa-8fd8-d8b9e5d64a13, 47eb02a5-e279-444d-8400-3ca11978a4f3", + "traceId": "85498889e3754dfe887ddc798c3dea70" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "LB 人工改重保留输入并正确换算最终KG", + "evidence": "adjusted=10.125 LB, finalKg=4.593, expectedKg=4.593", + "code": "200", + "requestId": "3c1b82fe-586a-4645-87f5-4d0443112e08, efcb2b2b-daf0-4a26-844c-b477087ee2d7", + "traceId": "99e78fb88ca14ee98198179dc2282d1f" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "code": "200", + "requestId": "ce901155-28cf-4d63-a096-9921185cc529, c7015cb3-a7b0-475b-9052-0843349fd63f", + "traceId": "836c255e76b146728d22e38197ca2f49" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "code": "200", + "requestId": "d1a55ae4-bd52-4141-a02a-adc6f1119b05, 51a068b0-f80a-4be4-810c-42c807c80479", + "traceId": "09e3a85d5a6746539da23348e8b78311" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808015948034", + "tenantId": "10001", + "orderId": "2085908806056345601", + "productImageFileId": "2085908805720801282", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085908813977268225", + "orderNo": "FL2085908806056345601", + "inboundCode": "RK-2085908806056345601", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085908813977268225", + "marker": "ADMIN-API-20260808015948034" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085908813977268225", + "marker": "ADMIN-API-20260808015948034" + }, + "inboundWeightOcr": { + "tenantId": "10001", + "inboundId": "2085908813977268225", + "resultIds": [ + "2085908829433278466", + "2085908839419916289" + ], + "cleaned": false + } + }, + "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": "52591e7f-e933-4ba3-b6de-d9d94f89a0aa, 49c73e52-0ac7-49df-b8fc-b247cce189c5", + "traceId": "2f4ff1ec348949409d6cec21fda62a38", + "evidence": "", + "checkedAt": "2026-08-08T01:59:48.407Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88c45888-5a1f-48d5-a39d-7ef5a970fc14, 2942f6d7-3106-4b61-8676-3ca877722449", + "traceId": "087120501abe4777a0dcc1740418afb9", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T01:59:48.753Z" + }, + { + "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": "6e02b401-a830-4c41-9676-878fae049635, e4b037e0-5aba-4857-ae75-b1c23cd7cc39", + "traceId": "5ef8a1feb5174ed89dee76111930f029", + "evidence": "", + "checkedAt": "2026-08-08T01:59:48.778Z" + }, + { + "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": "6e02b401-a830-4c41-9676-878fae049635, e4b037e0-5aba-4857-ae75-b1c23cd7cc39", + "traceId": "5ef8a1feb5174ed89dee76111930f029", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T01:59:48.778Z" + }, + { + "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": "c096a35e-bc68-44a4-93cc-e03a3efe9a9a, 38460e0a-9081-4a32-b065-181367df5caa", + "traceId": "20dbd7c10610430385085397bd931546", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T01:59:48.803Z" + }, + { + "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": "c096a35e-bc68-44a4-93cc-e03a3efe9a9a, 38460e0a-9081-4a32-b065-181367df5caa", + "traceId": "20dbd7c10610430385085397bd931546", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T01:59:48.803Z" + }, + { + "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": "6734a556-be27-40e2-b7c9-e21627219795, 98d80287-db56-4d12-8b10-57a0eb61c717", + "traceId": "9744245955ff4059ad632cbdfcc5aa72", + "evidence": "", + "checkedAt": "2026-08-08T01:59:48.828Z" + }, + { + "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": "6734a556-be27-40e2-b7c9-e21627219795, 98d80287-db56-4d12-8b10-57a0eb61c717", + "traceId": "9744245955ff4059ad632cbdfcc5aa72", + "evidence": "count=2", + "checkedAt": "2026-08-08T01:59:48.828Z" + }, + { + "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": "9df04a13-c806-459a-82c7-4355e0deded2, d47e0b07-412c-43b0-a550-beee04bc284a", + "traceId": "9f44cb604f9a4c8793e039e245108e9a", + "evidence": "", + "checkedAt": "2026-08-08T01:59:48.887Z" + }, + { + "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": "9df04a13-c806-459a-82c7-4355e0deded2, d47e0b07-412c-43b0-a550-beee04bc284a", + "traceId": "9f44cb604f9a4c8793e039e245108e9a", + "evidence": "count=200", + "checkedAt": "2026-08-08T01:59:48.887Z" + }, + { + "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": "5241d1e4-1446-4b83-a345-8eab4dcb4427, 769a783a-092f-43f0-bf2b-d6232692cf0f", + "traceId": "086659196ad64be6beb33f9c4dca2a8e", + "evidence": "", + "checkedAt": "2026-08-08T01:59:48.920Z" + }, + { + "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": "5241d1e4-1446-4b83-a345-8eab4dcb4427, 769a783a-092f-43f0-bf2b-d6232692cf0f", + "traceId": "086659196ad64be6beb33f9c4dca2a8e", + "evidence": "count=15", + "checkedAt": "2026-08-08T01:59:48.920Z" + }, + { + "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": "ff756639-addf-47e2-8f47-afd47edce86d, 287234c8-a8a3-47f6-b5c6-3cf3409577e5", + "traceId": "aeefbc3187ad4a119b7bd653c176c444", + "evidence": "", + "checkedAt": "2026-08-08T01:59:48.953Z" + }, + { + "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": "f8d30e5e-b7c8-4fde-949f-580aee78f711, 63585110-0ae8-4906-acd4-c33713bb3d37", + "traceId": "79b23ec8844e433f9ab9fd6ce907ecda", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T01:59:48.985Z" + }, + { + "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": "f8d30e5e-b7c8-4fde-949f-580aee78f711, 63585110-0ae8-4906-acd4-c33713bb3d37", + "traceId": "79b23ec8844e433f9ab9fd6ce907ecda", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T01:59:48.985Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085908805720801282" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "7be1701c-629b-49a5-8fa2-ab2f4c9acf94, 71d31c2d-ac8f-4c7f-96ac-53069b17835c", + "traceId": "ef6131a5ba7e49fba2184c3c23f50581", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T01:59:49.012Z" + }, + { + "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": "2518ad65-7dc0-49c5-a9d8-d408fcea3eb6, 1bbed5d4-52e4-42f4-bd6d-c0dcf457df70", + "traceId": "4b8478584c0346e380dd395ac6eeff79", + "evidence": "marker=ADMIN-API-20260808015948034", + "checkedAt": "2026-08-08T01:59:49.073Z" + }, + { + "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": "7a197f4d-8c22-4380-b09b-e05476a1f747, addca130-9b1c-4db4-bd70-99769eccc1b5", + "traceId": "47c7ce8779f645c8bbd4e681f1411450", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.110Z" + }, + { + "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": "7a197f4d-8c22-4380-b09b-e05476a1f747, addca130-9b1c-4db4-bd70-99769eccc1b5", + "traceId": "47c7ce8779f645c8bbd4e681f1411450", + "evidence": "orderId=2085908806056345601, replayedId=2085908806056345601", + "checkedAt": "2026-08-08T01:59:49.110Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908806056345601" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7e887805-9830-44f2-b5c0-0b6284203e38, 2ad376fe-35e9-47e3-9e9b-99e2e5d0b932", + "traceId": "20d963bffb5a4598bd21fbb60b6fb1d8", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.137Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908806056345601" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7e887805-9830-44f2-b5c0-0b6284203e38, 2ad376fe-35e9-47e3-9e9b-99e2e5d0b932", + "traceId": "20d963bffb5a4598bd21fbb60b6fb1d8", + "evidence": "orderNo=FL2085908806056345601, status=DRAFT", + "checkedAt": "2026-08-08T01:59:49.137Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908806056345601" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7e887805-9830-44f2-b5c0-0b6284203e38, 2ad376fe-35e9-47e3-9e9b-99e2e5d0b932", + "traceId": "20d963bffb5a4598bd21fbb60b6fb1d8", + "evidence": "cargoes=4, imageFileId=2085908805720801282", + "checkedAt": "2026-08-08T01:59:49.137Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085908806056345601/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "303ae93b-ddad-4f66-ad96-f3fd1051fdc4, 67bae358-4041-41c6-8fe5-704645de2b47", + "traceId": "6391d0e4df184e6f83f95e4984439e84", + "evidence": "orderId=2085908806056345601", + "checkedAt": "2026-08-08T01:59:49.201Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908806056345601" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "02867274-c137-4aa5-9ce0-1c98e9a933bc, 69c7ea5e-e361-4d8f-86ee-db8b71a25a44", + "traceId": "8131712a8d2947188c14911912660fba", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.238Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085908806056345601" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "02867274-c137-4aa5-9ce0-1c98e9a933bc, 69c7ea5e-e361-4d8f-86ee-db8b71a25a44", + "traceId": "8131712a8d2947188c14911912660fba", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T01:59:49.238Z" + }, + { + "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=FL2085908806056345601" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0d5ee3a8-a4fa-4d3a-8936-af4b02d323a3, 2f9498af-e994-4ab0-a45c-e0ec94cf8e5a", + "traceId": "6542befd50ff4415b088f100904c3662", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.270Z" + }, + { + "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=FL2085908806056345601" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0d5ee3a8-a4fa-4d3a-8936-af4b02d323a3, 2f9498af-e994-4ab0-a45c-e0ec94cf8e5a", + "traceId": "6542befd50ff4415b088f100904c3662", + "evidence": "orderId=2085908806056345601, found=true", + "checkedAt": "2026-08-08T01:59:49.270Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "30794dc1-d830-472f-aabc-8cea2cff6ad3, 5abc3592-7272-461d-914c-1628a14acc06", + "traceId": "106fe0a323944191b41fe0c31be9713f", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.309Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "30794dc1-d830-472f-aabc-8cea2cff6ad3, 5abc3592-7272-461d-914c-1628a14acc06", + "traceId": "106fe0a323944191b41fe0c31be9713f", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T01:59:49.309Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085908806056345601&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a7ca9f12-9159-4248-8c43-ffdb7d938b1b, 04fe887d-c394-4a58-9c00-138998638585", + "traceId": "bff230f6a40149bebeb50b68d22271fd", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.342Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085908806056345601&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a7ca9f12-9159-4248-8c43-ffdb7d938b1b, 04fe887d-c394-4a58-9c00-138998638585", + "traceId": "bff230f6a40149bebeb50b68d22271fd", + "evidence": "orderId=2085908806056345601, found=true", + "checkedAt": "2026-08-08T01:59:49.342Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ea926a59-f067-4ffa-ab28-7bed57d800d1, 6b4d12a7-7a2f-450d-bbf1-ff90ebbe97ac", + "traceId": "c6ed5b52c3fb4d6da098f99889d4bd36", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.366Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ea926a59-f067-4ffa-ab28-7bed57d800d1, 6b4d12a7-7a2f-450d-bbf1-ff90ebbe97ac", + "traceId": "c6ed5b52c3fb4d6da098f99889d4bd36", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T01:59:49.366Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ea926a59-f067-4ffa-ab28-7bed57d800d1, 6b4d12a7-7a2f-450d-bbf1-ff90ebbe97ac", + "traceId": "c6ed5b52c3fb4d6da098f99889d4bd36", + "evidence": "cargoes=4, imageFileId=2085908805720801282", + "checkedAt": "2026-08-08T01:59:49.366Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1af17013-f7c0-4d2d-976a-385da4c042e8, dee674d1-2586-4e19-8836-d50a6e88b00e", + "traceId": "0c52b4a5356042b8a485a964e3dbd057", + "evidence": "", + "checkedAt": "2026-08-08T01:59:49.408Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b95eb1c6-6429-4c0a-af08-640e83d1f23c, dae9160b-0e15-4b2c-9213-822229187d67", + "traceId": "257b63e13b664c38af77a1cd11c06def", + "evidence": "orderId=2085908806056345601", + "checkedAt": "2026-08-08T01:59:49.452Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7274d22a-5da6-4226-a1f6-028c3ef88193, 07f659d7-bc48-42c4-bb22-a4869a568919", + "traceId": "0b7f1f0b2e0b4aa39f88e92fc3c28d47", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:51.610Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085908813977268225?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "220a0825-0100-4fc7-b665-9d2de333de70, b835f1b5-bcf3-480d-83af-980218c5e8f5", + "traceId": "78102f7f9cb549d0a1d61c73c795220b", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:51.646Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085908813977268225?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "220a0825-0100-4fc7-b665-9d2de333de70, b835f1b5-bcf3-480d-83af-980218c5e8f5", + "traceId": "78102f7f9cb549d0a1d61c73c795220b", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T01:59:51.646Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085908813977268225?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "220a0825-0100-4fc7-b665-9d2de333de70, b835f1b5-bcf3-480d-83af-980218c5e8f5", + "traceId": "78102f7f9cb549d0a1d61c73c795220b", + "evidence": "inboundId=2085908813977268225, history=1", + "checkedAt": "2026-08-08T01:59:51.646Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085908806056345601&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5797e804-bf87-47f3-a434-091ba404bbdc, c0ae6b82-e472-4b80-a5ff-900d6706f7ca", + "traceId": "f461863d3755474499f383d35bbf003d", + "evidence": "", + "checkedAt": "2026-08-08T01:59:51.678Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085908806056345601&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5797e804-bf87-47f3-a434-091ba404bbdc, c0ae6b82-e472-4b80-a5ff-900d6706f7ca", + "traceId": "f461863d3755474499f383d35bbf003d", + "evidence": "inboundId=2085908813977268225, total=1", + "checkedAt": "2026-08-08T01:59:51.678Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "c32a4059-5eb7-48c9-99e5-171bd751e4be", + "traceId": "0bd5b3ea3d014ea9bebaea1b555f344f", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T01:59:51.704Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "c32a4059-5eb7-48c9-99e5-171bd751e4be", + "traceId": "0bd5b3ea3d014ea9bebaea1b555f344f", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T01:59:51.704Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "150be647-4252-46e8-a30b-e0bba2488431, 5ea6b34a-0c65-4b9f-8857-390179fd38bd", + "traceId": "68683d4c9ac540f69fb95e5e94aeb7de", + "evidence": "", + "checkedAt": "2026-08-08T01:59:51.740Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7c118cc1-9522-434d-b172-cd9b18464fdc, 2c609ba4-5f27-4b44-9245-22a2eb194f69", + "traceId": "d8c9154f7eb843a89fef438c3a97ab92", + "evidence": "", + "checkedAt": "2026-08-08T01:59:51.773Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "476cfdab-2ed5-4972-8ad1-48636d317626, a91a23f7-2000-4b8a-87cc-68295c1fb9bd", + "traceId": "c3cda0560e0640a885207d44e2fd8c13", + "evidence": "", + "checkedAt": "2026-08-08T01:59:51.796Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085908806056345601?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "476cfdab-2ed5-4972-8ad1-48636d317626, a91a23f7-2000-4b8a-87cc-68295c1fb9bd", + "traceId": "c3cda0560e0640a885207d44e2fd8c13", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T01:59:51.796Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅选择带本轮测试标记的可编辑入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085908813977268225?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fdc75f03-72b1-4b7c-b652-9a1611fdb78c, 9c1e6c5e-b08c-4cfb-8db0-90f733743814", + "traceId": "01d1640520b246938c0fd141904033b8", + "evidence": "tenantId=10001, inboundId=2085908813977268225, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T01:59:51.830Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aa040079-5a35-419d-ad9e-6d8572560335, 35b08d2f-f21e-417f-9ae8-974889983835", + "traceId": "d5acc5ac914d4b3ea8e123eff23a027c", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:51.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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aa040079-5a35-419d-ad9e-6d8572560335, 35b08d2f-f21e-417f-9ae8-974889983835", + "traceId": "d5acc5ac914d4b3ea8e123eff23a027c", + "evidence": "existingResults=0, baselineWeight=null", + "checkedAt": "2026-08-08T01:59:51.857Z" + }, + { + "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/2085908813977268225" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "6ffa7fe0-1201", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T01:59:51.880Z" + }, + { + "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/2085908813977268225" + }, + "http": 200, + "code": "A0400", + "message": "称重图片仅支持JPG、PNG、BMP", + "requestId": "1bf3da27-5ff7-4fd9-b0c3-344fd8348239", + "traceId": "93da85b066754273bf8ec9fe76d5e9b0", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T01:59:51.905Z" + }, + { + "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/2085908813977268225" + }, + "http": 200, + "code": "A0400", + "message": "称重图片不能超过5MB", + "requestId": "60df4b7f-5a69-494b-ab92-c3f9018137c3", + "traceId": "536e0bfd060347a480fcb736014db8ba", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T01:59:52.203Z" + }, + { + "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/2085908813977268225" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "35724dda-c470-48cf-b9e6-4aa6af9dad1f, 4d10072c-1e0e-465c-b2af-26aa25910ce8", + "traceId": "df04550be62048a69f222773f1a541d7", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T01:59:53.695Z" + }, + { + "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/2085908813977268225" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "35724dda-c470-48cf-b9e6-4aa6af9dad1f, 4d10072c-1e0e-465c-b2af-26aa25910ce8", + "traceId": "df04550be62048a69f222773f1a541d7", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T01:59:53.695Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "OCR 上传响应字段完整且置信度受限", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085908813977268225" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "35724dda-c470-48cf-b9e6-4aa6af9dad1f, 4d10072c-1e0e-465c-b2af-26aa25910ce8", + "traceId": "df04550be62048a69f222773f1a541d7", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T01:59:53.695Z" + }, + { + "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/2085908813977268225/2085908821277474817/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "214aff6d-dfc7-430f-84b4-55ede38893a5, 13baf6c6-2dc6-4873-bda2-cc4d6f1275e1", + "traceId": "3046804cb8504b2e9cd30ae0664b2e8a", + "evidence": "fileId=2085908821277474817", + "checkedAt": "2026-08-08T01:59:54.606Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "OCR 重试保持文件身份并返回识别契约", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085908813977268225/2085908821277474817/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "214aff6d-dfc7-430f-84b4-55ede38893a5, 13baf6c6-2dc6-4873-bda2-cc4d6f1275e1", + "traceId": "3046804cb8504b2e9cd30ae0664b2e8a", + "evidence": "sameFile=true, status=RECOGNIZED", + "checkedAt": "2026-08-08T01:59:54.606Z" + }, + { + "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/2085908813977268225/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f3d6ad0e-e021-416c-a136-d28966dc3abe, fef6ddee-3618-486b-b925-a364ef43896b", + "traceId": "53e78680998349969226377eef4b5f96", + "evidence": "fileId=2085908821277474817", + "checkedAt": "2026-08-08T01:59:54.639Z" + }, + { + "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/2085908813977268225/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f3d6ad0e-e021-416c-a136-d28966dc3abe, fef6ddee-3618-486b-b925-a364ef43896b", + "traceId": "53e78680998349969226377eef4b5f96", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T01:59:54.639Z" + }, + { + "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/2085908813977268225/2085908821277474817" + }, + "http": 200, + "code": null, + "message": "3701469 bytes (image/jpeg)", + "requestId": "5cb11ec1-01c9-45d3-ad8f-6ac9f8601ca3, b8a44b34-6b65-4c38-a983-aefc8d33f794", + "traceId": "a8571ad8dbb64e0caef92d29798dc47d", + "evidence": "contentType=image/jpeg, bytes=3701469", + "checkedAt": "2026-08-08T01:59:54.829Z" + }, + { + "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/2085908813977268225/2085908821277474817/thumbnail" + }, + "http": 200, + "code": null, + "message": "18677 bytes (image/jpeg)", + "requestId": "e1e78383-d342-472a-add2-0b272c9a9417, f7bd4357-abe5-4600-bb17-15548b844c57", + "traceId": "48ce9075d56c4d51817919150a22211a", + "evidence": "contentType=image/jpeg, bytes=18677, dimensions=240x320", + "checkedAt": "2026-08-08T01:59:55.234Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0b8bd3f-1adb-41ab-8304-07da14c58feb, da61ce0b-8418-4ddf-af27-d143a29bed07", + "traceId": "90441a881b2f48f3bcefd2792332752c", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:55.274Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0b8bd3f-1adb-41ab-8304-07da14c58feb, da61ce0b-8418-4ddf-af27-d143a29bed07", + "traceId": "90441a881b2f48f3bcefd2792332752c", + "evidence": "resultFound=true, baselineCount=0, currentCount=1", + "checkedAt": "2026-08-08T01:59:55.274Z" + }, + { + "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/2085908813977268225/weight-results/2085908829433278466/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "544238fa-87d3-4fa5-973a-16ba4c4d9f05", + "traceId": "93884144a2674b2197ea6c21f0dd11c6", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:59:55.303Z" + }, + { + "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/2085908813977268225/weight-results/2085908829433278466/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8e056c12-e367-4d55-9fc2-5f4b38663080, 1cc130a4-d262-44c1-a912-dcedc555d9ac", + "traceId": "2b166aa6ebe845c39f12e6df9b3f4abf", + "evidence": "usedOriginal=true", + "checkedAt": "2026-08-08T01:59:55.357Z" + }, + { + "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/2085908813977268225/weight-results/2085908829433278466/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8e056c12-e367-4d55-9fc2-5f4b38663080, 1cc130a4-d262-44c1-a912-dcedc555d9ac", + "traceId": "2b166aa6ebe845c39f12e6df9b3f4abf", + "evidence": "status=CONFIRMED, version=1, finalKg=285.5", + "checkedAt": "2026-08-08T01:59:55.357Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "26deb4d4-3a81-4497-9438-358ef98a81d1, 82a8d332-6cd6-406e-a82d-bda8209216e9", + "traceId": "de36c8e8b92f442ea0e0e707eaa1fa30", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:55.377Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "26deb4d4-3a81-4497-9438-358ef98a81d1, 82a8d332-6cd6-406e-a82d-bda8209216e9", + "traceId": "de36c8e8b92f442ea0e0e707eaa1fa30", + "evidence": "baseline=null, added=285.5, actual=285.5", + "checkedAt": "2026-08-08T01:59:55.377Z" + }, + { + "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/2085908813977268225/weight-results/2085908829433278466?tenantId=10001&version=0" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "e7902b91-b7d8-4a1b-97e4-850e199d5840", + "traceId": "1739ad11ca1d4bba8e8f3679e4381cd4", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T01:59:55.414Z" + }, + { + "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/2085908813977268225/weight-results/2085908829433278466?tenantId=10001&version=1" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "29cf87fe-1d52-4494-aac1-7d6015da6fb6, e3f96492-6a21-452b-969a-99e64cd48bad", + "traceId": "1f729a27ddc5431aab37b3728d06e4eb", + "evidence": "resultId=2085908829433278466, version=1", + "checkedAt": "2026-08-08T01:59:55.471Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b2460681-4e1d-4eaa-8fd8-d8b9e5d64a13, 47eb02a5-e279-444d-8400-3ca11978a4f3", + "traceId": "85498889e3754dfe887ddc798c3dea70", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:55.504Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b2460681-4e1d-4eaa-8fd8-d8b9e5d64a13, 47eb02a5-e279-444d-8400-3ca11978a4f3", + "traceId": "85498889e3754dfe887ddc798c3dea70", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "checkedAt": "2026-08-08T01:59:55.504Z" + }, + { + "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/2085908813977268225/2085908821277474817" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "3a94a05e-5881-4149-ba90-bf8e9d751429", + "traceId": "3536cb61d7d74f86b90a208d5b1fc4fe", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T01:59:55.532Z" + }, + { + "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/2085908813977268225" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fb5fde0e-74f9-444f-8d98-bc5a6786c6d8, 876ba2e7-eaf5-4732-af6b-0646d5a5468b", + "traceId": "37ff7a2e95054b83a2b1afcd349a4d5b", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T01:59:56.987Z" + }, + { + "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/2085908813977268225" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fb5fde0e-74f9-444f-8d98-bc5a6786c6d8, 876ba2e7-eaf5-4732-af6b-0646d5a5468b", + "traceId": "37ff7a2e95054b83a2b1afcd349a4d5b", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T01:59:56.987Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "OCR 上传响应字段完整且置信度受限", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085908813977268225" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fb5fde0e-74f9-444f-8d98-bc5a6786c6d8, 876ba2e7-eaf5-4732-af6b-0646d5a5468b", + "traceId": "37ff7a2e95054b83a2b1afcd349a4d5b", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T01:59:56.987Z" + }, + { + "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/2085908813977268225/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df005ff3-ab2f-4977-85d1-f0fc4d4f7dee, b45c6707-eb9b-4930-b435-37e0c346ee51", + "traceId": "99339c73dc4849cab82db4c6a75aff35", + "evidence": "fileId=2085908835441639426", + "checkedAt": "2026-08-08T01:59:57.020Z" + }, + { + "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/2085908813977268225/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df005ff3-ab2f-4977-85d1-f0fc4d4f7dee, b45c6707-eb9b-4930-b435-37e0c346ee51", + "traceId": "99339c73dc4849cab82db4c6a75aff35", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T01:59:57.020Z" + }, + { + "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/2085908813977268225/weight-results/2085908839419916289/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "4ece4d25-492b-4dac-bb2d-41202e549ab3", + "traceId": "8248f21a69454d01bd91e98cbbf9fe97", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T01:59:57.098Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad9df95e-cfc4-4c86-ac0c-b9831552abcb, a5de595a-3660-4a84-a474-3caea7e61892", + "traceId": "8a2c7b369c184648a1685bf138a494c3", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:57.124Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad9df95e-cfc4-4c86-ac0c-b9831552abcb, a5de595a-3660-4a84-a474-3caea7e61892", + "traceId": "8a2c7b369c184648a1685bf138a494c3", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T01:59:57.124Z" + }, + { + "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/2085908813977268225/weight-results/2085908839419916289/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "9736e753-2f87-48da-b32a-a0a115565fa8", + "traceId": "5a26e0cebd5b47aa9b947c62f63a7b9e", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T01:59:57.147Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c4f091da-4639-4d92-b975-d5130da224ed, 1bb04256-dab1-42d8-83c6-95724ad24303", + "traceId": "9c521303a38d4978adfed04abcf7aee9", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:57.168Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c4f091da-4639-4d92-b975-d5130da224ed, 1bb04256-dab1-42d8-83c6-95724ad24303", + "traceId": "9c521303a38d4978adfed04abcf7aee9", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T01:59:57.168Z" + }, + { + "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/2085908813977268225/weight-results/2085908839419916289/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "换算后重量不能小于 0.001 KG", + "requestId": "c4ca157e-9416-4d3a-b167-0b8d10d775a7", + "traceId": "69d1ba223fbf4bcb843d155df3f8ed95", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T01:59:57.234Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "55cf3dbb-e7f7-4463-9bd6-d39b3f349344, 157842f2-c436-4f4b-bdf0-d93b1abc4a39", + "traceId": "0265f25b753b4728ad5b93fb6b3500e5", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:57.264Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "55cf3dbb-e7f7-4463-9bd6-d39b3f349344, 157842f2-c436-4f4b-bdf0-d93b1abc4a39", + "traceId": "0265f25b753b4728ad5b93fb6b3500e5", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T01:59:57.264Z" + }, + { + "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/2085908813977268225/weight-results/2085908839419916289/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: numeric value out of bounds (<15 digits>.<3 digits> expected)", + "requestId": "55a4e76c-a2df-44c6-84dd-931ff272be2f", + "traceId": "2564d41fca52418c80d6487324b4a4da", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T01:59:57.295Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e7724baa-f906-4e37-9b3d-e33a5a7bfced, 725e57fe-24ff-43ac-a195-8868d694fbcf", + "traceId": "0b58b005067c448f849a735acd47da99", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:57.317Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e7724baa-f906-4e37-9b3d-e33a5a7bfced, 725e57fe-24ff-43ac-a195-8868d694fbcf", + "traceId": "0b58b005067c448f849a735acd47da99", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T01:59:57.317Z" + }, + { + "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/2085908813977268225/weight-results/2085908839419916289/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c1b82fe-586a-4645-87f5-4d0443112e08, efcb2b2b-daf0-4a26-844c-b477087ee2d7", + "traceId": "99e78fb88ca14ee98198179dc2282d1f", + "evidence": "adjusted=10.125 LB", + "checkedAt": "2026-08-08T01:59:57.350Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "LB 人工改重保留输入并正确换算最终KG", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085908813977268225/weight-results/2085908839419916289/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c1b82fe-586a-4645-87f5-4d0443112e08, efcb2b2b-daf0-4a26-844c-b477087ee2d7", + "traceId": "99e78fb88ca14ee98198179dc2282d1f", + "evidence": "adjusted=10.125 LB, finalKg=4.593, expectedKg=4.593", + "checkedAt": "2026-08-08T01:59:57.350Z" + }, + { + "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/2085908813977268225/weight-results/2085908839419916289?tenantId=10001&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "874a4b67-4100-429f-8051-5569685499d6, 27d08a81-9768-4314-bf78-9566a22b2d75", + "traceId": "476797805e5c481d9dba35559b95f958", + "evidence": "resultId=2085908839419916289, version=2", + "checkedAt": "2026-08-08T01:59:57.404Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ce901155-28cf-4d63-a096-9921185cc529, c7015cb3-a7b0-475b-9052-0843349fd63f", + "traceId": "836c255e76b146728d22e38197ca2f49", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:57.436Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ce901155-28cf-4d63-a096-9921185cc529, c7015cb3-a7b0-475b-9052-0843349fd63f", + "traceId": "836c255e76b146728d22e38197ca2f49", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T01:59:57.436Z" + }, + { + "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/2085908813977268225/2085908835441639426" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "846d31ba-ca0a-4249-bc06-c4bed81b1a72", + "traceId": "1a3704ac1beb4b7da9d832b2c7b1df14", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T01:59:57.465Z" + }, + { + "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/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d1a55ae4-bd52-4141-a02a-adc6f1119b05, 51a068b0-f80a-4be4-810c-42c807c80479", + "traceId": "09e3a85d5a6746539da23348e8b78311", + "evidence": "inboundId=2085908813977268225", + "checkedAt": "2026-08-08T01:59:57.499Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085908813977268225/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d1a55ae4-bd52-4141-a02a-adc6f1119b05, 51a068b0-f80a-4be4-810c-42c807c80479", + "traceId": "09e3a85d5a6746539da23348e8b78311", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T01:59:57.499Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020135.json b/reports/admin-test-env-acceptance-20260808020135.json new file mode 100644 index 000000000..46d57199e --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020135.json @@ -0,0 +1,1941 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020135441", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:01:45.359Z", + "startedAt": "2026-08-08T02:01:35.441Z", + "success": false, + "fatal": null, + "summary": { + "total": 100, + "passed": 95, + "failed": 5 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T02:01:35.807Z", + "finishedAt": "2026-08-08T02:01:39.386Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "inbound-weight-ocr", + "startedAt": "2026-08-08T02:01:39.388Z", + "finishedAt": "2026-08-08T02:01:45.359Z", + "success": false, + "passed": 49, + "failed": 3, + "fatal": null + } + ], + "scenarios": [ + { + "name": "weight-image-recognition-and-confirmation", + "module": "inbound-weight-ocr", + "success": false, + "deploymentBlocked": true, + "passed": 49, + "failed": 3 + } + ], + "deploymentBlockers": [ + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "b772cf44-12dd-418a-a7b4-d1488f952513", + "traceId": "ec59e968af8045f3b62a00b77b68591c" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "b772cf44-12dd-418a-a7b4-d1488f952513", + "traceId": "ec59e968af8045f3b62a00b77b68591c" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "code": "200", + "requestId": "e228680c-ebfa-417b-9dc0-287f170f6633, 7b83cada-4e8a-4c3d-9abd-8283f28904d0", + "traceId": "6482fe2dd1df40f19bba4c234891b4dd" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "code": "200", + "requestId": "921ae840-bdf1-4765-a3f3-b8e450ceeea9, 33f37f4a-3c62-4df4-a1dc-f5376a762b4c", + "traceId": "0cb7437e798d4302ae20a5ac9c58409a" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "code": "200", + "requestId": "dcddbc98-2529-41cc-8528-8bba0faedbaa, 76363165-801a-49a3-962f-70d9311947a3", + "traceId": "600e4c27fac74ed7a08022a69601c782" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808020135441", + "tenantId": "10001", + "orderId": "2085909257275375617", + "productImageFileId": "2085909256948219905", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085909267327004674", + "orderNo": "FL2085909257275375617", + "inboundCode": "RK-2085909257275375617", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085909267327004674", + "marker": "ADMIN-API-20260808020135441" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085909267327004674", + "marker": "ADMIN-API-20260808020135441" + }, + "inboundWeightOcr": { + "tenantId": "10001", + "inboundId": "2085909267327004674", + "resultIds": [ + "2085909280094466049", + "2085909292161478657" + ], + "cleaned": false + } + }, + "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": "bc22266b-ce89-45f2-9c74-6f770e422659, f4d81053-01ba-44c1-b5c7-0db04dfbb704", + "traceId": "502f1df694c9451c9ab96fc7127317f8", + "evidence": "", + "checkedAt": "2026-08-08T02:01:35.806Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a59a59a6-10a0-4a1a-98d4-be35ed78dd64, 75b1dd85-b969-4faf-93f5-6b138a7bc716", + "traceId": "3df1568e8b8f4ec4bf359fb123a48ed9", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:01:36.146Z" + }, + { + "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": "2b0b5763-c5da-4728-9550-0ed49eedf16e, 051dcc88-5e47-4928-824d-f3ba70f91f90", + "traceId": "3b2d7188b419441fbd378f66266074d5", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.173Z" + }, + { + "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": "2b0b5763-c5da-4728-9550-0ed49eedf16e, 051dcc88-5e47-4928-824d-f3ba70f91f90", + "traceId": "3b2d7188b419441fbd378f66266074d5", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:01:36.173Z" + }, + { + "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": "ec780ec3-b51d-4e4d-89e4-1a35ea5ce986, 0c028314-93cf-42d4-9108-e55eb59c7c47", + "traceId": "cacb23d688f84754aa02458ec64ebf07", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:01:36.206Z" + }, + { + "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": "ec780ec3-b51d-4e4d-89e4-1a35ea5ce986, 0c028314-93cf-42d4-9108-e55eb59c7c47", + "traceId": "cacb23d688f84754aa02458ec64ebf07", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:01:36.206Z" + }, + { + "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": "c50f6705-bd7a-4ccd-87e2-0b29c9ddeed0, 40053bc7-f729-4f68-94d8-891de2ae00a2", + "traceId": "4953acf98cc34270ab43bd2115ea54df", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.238Z" + }, + { + "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": "c50f6705-bd7a-4ccd-87e2-0b29c9ddeed0, 40053bc7-f729-4f68-94d8-891de2ae00a2", + "traceId": "4953acf98cc34270ab43bd2115ea54df", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:01:36.238Z" + }, + { + "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": "a0ac198f-4dc0-4ed0-9693-a43fb7bf9a1d, 60ef2bd1-ac70-4a8f-b07d-f66ed75e57b1", + "traceId": "2dc65355f7694669bf8b346e5430ad5d", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.285Z" + }, + { + "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": "a0ac198f-4dc0-4ed0-9693-a43fb7bf9a1d, 60ef2bd1-ac70-4a8f-b07d-f66ed75e57b1", + "traceId": "2dc65355f7694669bf8b346e5430ad5d", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:01:36.285Z" + }, + { + "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": "76d8b312-c286-4083-800d-0c744773e019, 4ae9809a-cbad-4627-8a37-4aa800d042ea", + "traceId": "693599dd412b4111aa221434ed5ce4c2", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.320Z" + }, + { + "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": "76d8b312-c286-4083-800d-0c744773e019, 4ae9809a-cbad-4627-8a37-4aa800d042ea", + "traceId": "693599dd412b4111aa221434ed5ce4c2", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:01:36.320Z" + }, + { + "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": "64955684-ba3d-4ca6-b6e3-09b058d9d37b, 9edc396e-5214-4bbb-adb0-589eb171968e", + "traceId": "6b9203f444104539a07dd532f0bfe3e1", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.537Z" + }, + { + "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": "5100996c-5bd9-48ef-b032-aa73fdecea73, 8c75425f-6843-416d-ba32-0231e2099f27", + "traceId": "c00d9d22422c4c9abe0a65a1d14d1d17", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:01:36.566Z" + }, + { + "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": "5100996c-5bd9-48ef-b032-aa73fdecea73, 8c75425f-6843-416d-ba32-0231e2099f27", + "traceId": "c00d9d22422c4c9abe0a65a1d14d1d17", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:01:36.566Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085909256948219905" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "a483a863-0c12-45af-962b-6f0d8c8e15c4, dbc32e10-6ef8-4393-be8b-8c80b884d415", + "traceId": "53f3571b0ed74259acb48a79bb62d4f9", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:01:36.592Z" + }, + { + "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": "fa79e737-cc84-4fc3-8215-09406f9da007, 23496d08-0b14-484e-833a-411857958e23", + "traceId": "5ee21226daab491cb4b28d2b4ee5543d", + "evidence": "marker=ADMIN-API-20260808020135441", + "checkedAt": "2026-08-08T02:01:36.670Z" + }, + { + "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": "e1a88508-384e-4c4b-a6e1-d7cd4c519231, 7e3f3292-992c-430a-9da1-58bfe52e6088", + "traceId": "e542fbad795f4e13ad5eb15380fd8d14", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.704Z" + }, + { + "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": "e1a88508-384e-4c4b-a6e1-d7cd4c519231, 7e3f3292-992c-430a-9da1-58bfe52e6088", + "traceId": "e542fbad795f4e13ad5eb15380fd8d14", + "evidence": "orderId=2085909257275375617, replayedId=2085909257275375617", + "checkedAt": "2026-08-08T02:01:36.704Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909257275375617" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "59924f83-3c73-411b-bf8c-d5dac1879591, 392cf0c0-b13b-4c3f-aacf-6162472af89e", + "traceId": "b736bec091d64488ade93cb860167a74", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.736Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909257275375617" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "59924f83-3c73-411b-bf8c-d5dac1879591, 392cf0c0-b13b-4c3f-aacf-6162472af89e", + "traceId": "b736bec091d64488ade93cb860167a74", + "evidence": "orderNo=FL2085909257275375617, status=DRAFT", + "checkedAt": "2026-08-08T02:01:36.737Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909257275375617" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "59924f83-3c73-411b-bf8c-d5dac1879591, 392cf0c0-b13b-4c3f-aacf-6162472af89e", + "traceId": "b736bec091d64488ade93cb860167a74", + "evidence": "cargoes=4, imageFileId=2085909256948219905", + "checkedAt": "2026-08-08T02:01:36.737Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085909257275375617/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6f642ade-1a95-42d7-876a-f9c105e108b0, edb982e4-957d-423d-a3e7-0113ffdee6f4", + "traceId": "532b082475ac452399cd119fc3e60987", + "evidence": "orderId=2085909257275375617", + "checkedAt": "2026-08-08T02:01:36.793Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909257275375617" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b02d7341-5162-4c3e-b396-6f58da6578a0, 4d47aef9-bb4b-4bc5-8108-86ec409b7a4e", + "traceId": "6e88ca1f178442129caaff689f055c07", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.827Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909257275375617" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b02d7341-5162-4c3e-b396-6f58da6578a0, 4d47aef9-bb4b-4bc5-8108-86ec409b7a4e", + "traceId": "6e88ca1f178442129caaff689f055c07", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:01:36.827Z" + }, + { + "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=FL2085909257275375617" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4ad025f3-e283-4f76-8477-c9d986f74555, d7ad9724-c834-436c-af43-05ab646efe05", + "traceId": "2607ab6974604914a5f8a548b6331094", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.863Z" + }, + { + "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=FL2085909257275375617" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4ad025f3-e283-4f76-8477-c9d986f74555, d7ad9724-c834-436c-af43-05ab646efe05", + "traceId": "2607ab6974604914a5f8a548b6331094", + "evidence": "orderId=2085909257275375617, found=true", + "checkedAt": "2026-08-08T02:01:36.863Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b191162b-200e-420c-b727-f04d3624f1ca, 02244139-2bc9-4fe2-a44a-4e2d0288f924", + "traceId": "80898570e34747a2bcf8894da1cf26ef", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.889Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b191162b-200e-420c-b727-f04d3624f1ca, 02244139-2bc9-4fe2-a44a-4e2d0288f924", + "traceId": "80898570e34747a2bcf8894da1cf26ef", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:01:36.889Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085909257275375617&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e834de17-4b8d-428f-9f88-b410cbec3f80, 469277c1-c107-4da9-82ea-58dba8693d96", + "traceId": "8b719856fe3c45b6b6355ac0da74f586", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.922Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085909257275375617&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e834de17-4b8d-428f-9f88-b410cbec3f80, 469277c1-c107-4da9-82ea-58dba8693d96", + "traceId": "8b719856fe3c45b6b6355ac0da74f586", + "evidence": "orderId=2085909257275375617, found=true", + "checkedAt": "2026-08-08T02:01:36.922Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "327c0eff-60de-485e-ac25-4c681ea9cd8d, 47332014-e20f-41cf-a7eb-8bd02e9f4d19", + "traceId": "53b0e94d364e45aaa6fb17317514b5d7", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.953Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "327c0eff-60de-485e-ac25-4c681ea9cd8d, 47332014-e20f-41cf-a7eb-8bd02e9f4d19", + "traceId": "53b0e94d364e45aaa6fb17317514b5d7", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:01:36.953Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "327c0eff-60de-485e-ac25-4c681ea9cd8d, 47332014-e20f-41cf-a7eb-8bd02e9f4d19", + "traceId": "53b0e94d364e45aaa6fb17317514b5d7", + "evidence": "cargoes=4, imageFileId=2085909256948219905", + "checkedAt": "2026-08-08T02:01:36.953Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1e888043-39c0-460e-af0c-8e0137e96002, 44fed01b-6b60-4107-9795-78abf08635bd", + "traceId": "b2e91ab4ecdf405787888441006559c2", + "evidence": "", + "checkedAt": "2026-08-08T02:01:36.984Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "341fefa6-7d1d-47b4-af06-45991d93e7b0, e373438b-4d8c-4197-b74b-84e755214a38", + "traceId": "c95bcbbdb68c4454bab97d6b4af4d8fd", + "evidence": "orderId=2085909257275375617", + "checkedAt": "2026-08-08T02:01:37.021Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ed870ab9-37c4-49b1-b937-e8bb00e0adec, 6f1c9ecc-e59f-4603-be46-04f35014b0d3", + "traceId": "55cc2ab44df04e70bf6c84f303c864e4", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:39.180Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909267327004674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ef2eddcf-4e62-44aa-93ae-6205b7cf6c41, 5a65a024-488c-472c-aa13-5338a0f71f29", + "traceId": "97a8b233903d4bdca696b407b6610310", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:39.205Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909267327004674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ef2eddcf-4e62-44aa-93ae-6205b7cf6c41, 5a65a024-488c-472c-aa13-5338a0f71f29", + "traceId": "97a8b233903d4bdca696b407b6610310", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:01:39.205Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909267327004674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ef2eddcf-4e62-44aa-93ae-6205b7cf6c41, 5a65a024-488c-472c-aa13-5338a0f71f29", + "traceId": "97a8b233903d4bdca696b407b6610310", + "evidence": "inboundId=2085909267327004674, history=1", + "checkedAt": "2026-08-08T02:01:39.205Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085909257275375617&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "437cb408-6279-47c6-a0c3-6b1047868179, 19d17017-396d-4ef4-9fb9-55058f34cebe", + "traceId": "c9faa9e764fb4e3c9cc808dd4c8ae645", + "evidence": "", + "checkedAt": "2026-08-08T02:01:39.233Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085909257275375617&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "437cb408-6279-47c6-a0c3-6b1047868179, 19d17017-396d-4ef4-9fb9-55058f34cebe", + "traceId": "c9faa9e764fb4e3c9cc808dd4c8ae645", + "evidence": "inboundId=2085909267327004674, total=1", + "checkedAt": "2026-08-08T02:01:39.234Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "b772cf44-12dd-418a-a7b4-d1488f952513", + "traceId": "ec59e968af8045f3b62a00b77b68591c", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:01:39.258Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "b772cf44-12dd-418a-a7b4-d1488f952513", + "traceId": "ec59e968af8045f3b62a00b77b68591c", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:01:39.258Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9481aaea-386b-4246-b224-0c3ed18433e2, e30e4007-0fbd-4045-a919-fe844611d067", + "traceId": "a1f1a893e04142e4be86b4d21cd411cd", + "evidence": "", + "checkedAt": "2026-08-08T02:01:39.299Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0958a895-875d-4eb2-8f29-5516edac2f0f, 73bc10a3-b58f-4faf-b855-e980b73327ec", + "traceId": "92e79d74352f4a839d290960c8ca57f9", + "evidence": "", + "checkedAt": "2026-08-08T02:01:39.348Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e359d12f-75d2-422a-94ba-41ccc7930e11, db9a41e5-1efb-4b13-b531-8d00fc9b00d1", + "traceId": "584a1ec803804cba87fe2349218b748c", + "evidence": "", + "checkedAt": "2026-08-08T02:01:39.386Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909257275375617?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e359d12f-75d2-422a-94ba-41ccc7930e11, db9a41e5-1efb-4b13-b531-8d00fc9b00d1", + "traceId": "584a1ec803804cba87fe2349218b748c", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:01:39.386Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅选择带本轮测试标记的可编辑入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909267327004674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "68cbaf71-0c12-487b-9197-a1ba2a31329c, 233c41c4-42f3-45a0-beaf-07a4db9bec81", + "traceId": "5a18cc9a20884007bbdcbb6b2844e6a2", + "evidence": "tenantId=10001, inboundId=2085909267327004674, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:01:39.422Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7fef0f3f-93ca-4733-b063-c9009272f2cd, 195b8c7e-f825-41a2-bd53-4db450dd939d", + "traceId": "36ed281eb1874515b35990f1e7c1d4ad", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:39.449Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7fef0f3f-93ca-4733-b063-c9009272f2cd, 195b8c7e-f825-41a2-bd53-4db450dd939d", + "traceId": "36ed281eb1874515b35990f1e7c1d4ad", + "evidence": "existingResults=0, baselineWeight=null", + "checkedAt": "2026-08-08T02:01:39.449Z" + }, + { + "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/2085909267327004674" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "9404e106-1298", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T02:01:39.467Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "A0400", + "message": "称重图片仅支持JPG、PNG、BMP", + "requestId": "0a4aebf9-df90-401f-9355-3d7a4e946445", + "traceId": "b417ad2715474d69bdd6e2040fa95d16", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:01:39.499Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "A0400", + "message": "称重图片不能超过5MB", + "requestId": "34a55397-9aca-4cc5-a1da-e74ec9a56adb", + "traceId": "73a396522319494b9a2e2f0585ae389e", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:01:39.847Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e065245f-4597-4f26-83e4-81f8f41330e4, 2cb62030-6d4a-4e6f-85e9-e1ccd5d40a70", + "traceId": "c497a6376ee4431f8aeb38274cb533ae", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:01:41.235Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e065245f-4597-4f26-83e4-81f8f41330e4, 2cb62030-6d4a-4e6f-85e9-e1ccd5d40a70", + "traceId": "c497a6376ee4431f8aeb38274cb533ae", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:01:41.235Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e065245f-4597-4f26-83e4-81f8f41330e4, 2cb62030-6d4a-4e6f-85e9-e1ccd5d40a70", + "traceId": "c497a6376ee4431f8aeb38274cb533ae", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:01:41.235Z" + }, + { + "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/2085909267327004674/2085909272936906754/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "608990b2-7fb4-4a02-912f-8f60ecd852e2, 69891a0b-516c-4bd6-92af-b813168c3155", + "traceId": "96a0e4db14924d04a3c416501d0999e9", + "evidence": "fileId=2085909272936906754", + "checkedAt": "2026-08-08T02:01:42.055Z" + }, + { + "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/2085909267327004674/2085909272936906754/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "608990b2-7fb4-4a02-912f-8f60ecd852e2, 69891a0b-516c-4bd6-92af-b813168c3155", + "traceId": "96a0e4db14924d04a3c416501d0999e9", + "evidence": "sameFile=true, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:01:42.055Z" + }, + { + "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/2085909267327004674/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "27e6e44a-10d9-4bf6-8e4e-ba174aee6aab, f1670b2b-e3ca-4306-a3de-1d22884cd7e7", + "traceId": "fe9afa99d8ff4d1baa4685fc01849f1d", + "evidence": "fileId=2085909272936906754", + "checkedAt": "2026-08-08T02:01:42.084Z" + }, + { + "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/2085909267327004674/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "27e6e44a-10d9-4bf6-8e4e-ba174aee6aab, f1670b2b-e3ca-4306-a3de-1d22884cd7e7", + "traceId": "fe9afa99d8ff4d1baa4685fc01849f1d", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:01:42.084Z" + }, + { + "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/2085909267327004674/2085909272936906754" + }, + "http": 200, + "code": null, + "message": "3701469 bytes (image/jpeg)", + "requestId": "1b01d477-91b5-44e8-b1d3-89eca69fc751, 95a8257c-6e93-4988-a19c-db5c63995637", + "traceId": "fa0c6447d0ff4f71a455c6b0d883c149", + "evidence": "contentType=image/jpeg, bytes=3701469", + "checkedAt": "2026-08-08T02:01:42.939Z" + }, + { + "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/2085909267327004674/2085909272936906754/thumbnail" + }, + "http": 200, + "code": null, + "message": "18677 bytes (image/jpeg)", + "requestId": "1efeb992-79b2-4252-8985-fec1e7960f53, 5f2aaf31-b98a-4951-8a40-1af953cc1ffb", + "traceId": "fbbe7f526bec449b8833f10033567bf8", + "evidence": "contentType=image/jpeg, bytes=18677, dimensions=240x320", + "checkedAt": "2026-08-08T02:01:43.323Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d42b3985-52bf-4e42-a6c6-feba148c03c4, 2b0638dd-bf5e-4bea-9167-562aa64d52d7", + "traceId": "22591e6dd454424aaaec6788c503c28c", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:43.359Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d42b3985-52bf-4e42-a6c6-feba148c03c4, 2b0638dd-bf5e-4bea-9167-562aa64d52d7", + "traceId": "22591e6dd454424aaaec6788c503c28c", + "evidence": "resultFound=true, baselineCount=0, currentCount=1", + "checkedAt": "2026-08-08T02:01:43.359Z" + }, + { + "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/2085909267327004674/weight-results/2085909280094466049/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "74502046-da25-440a-81dc-f0f18fb8e0e4", + "traceId": "0b52d73df2794159bfef8f241f7355e1", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:01:43.392Z" + }, + { + "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/2085909267327004674/weight-results/2085909280094466049/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5a67008a-0902-4672-8e2b-dc630a7683e3, c82d74a1-09ba-4be3-8938-ed3d04e49dbf", + "traceId": "1ae6667f7ffa4bee90e034612eaa2b6e", + "evidence": "usedOriginal=true", + "checkedAt": "2026-08-08T02:01:43.428Z" + }, + { + "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/2085909267327004674/weight-results/2085909280094466049/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5a67008a-0902-4672-8e2b-dc630a7683e3, c82d74a1-09ba-4be3-8938-ed3d04e49dbf", + "traceId": "1ae6667f7ffa4bee90e034612eaa2b6e", + "evidence": "status=CONFIRMED, version=1, finalKg=285.5", + "checkedAt": "2026-08-08T02:01:43.428Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c36e1738-e444-4f36-9c37-c22aefd6b700, 076020bb-3a86-4631-bdf9-c4619dd269c8", + "traceId": "65d014fbaaa34d04ba04cbb4c19c9d68", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:43.450Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c36e1738-e444-4f36-9c37-c22aefd6b700, 076020bb-3a86-4631-bdf9-c4619dd269c8", + "traceId": "65d014fbaaa34d04ba04cbb4c19c9d68", + "evidence": "baseline=null, added=285.5, actual=285.5", + "checkedAt": "2026-08-08T02:01:43.451Z" + }, + { + "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/2085909267327004674/weight-results/2085909280094466049?tenantId=10001&version=0" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "6eed9fc6-e3a9-4e1f-aba9-2710cb6c457f", + "traceId": "c055c22f1dbb48c88c173698e7c35070", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:01:43.483Z" + }, + { + "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/2085909267327004674/weight-results/2085909280094466049?tenantId=10001&version=1" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a25892e8-0ae1-4127-89e8-69bbb80bd2e4, 2bbcf9d3-f069-41cb-854c-d80bbedf3de0", + "traceId": "48512ce9e45a46e78b16fa2ba9b576c8", + "evidence": "resultId=2085909280094466049, version=1", + "checkedAt": "2026-08-08T02:01:43.532Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e228680c-ebfa-417b-9dc0-287f170f6633, 7b83cada-4e8a-4c3d-9abd-8283f28904d0", + "traceId": "6482fe2dd1df40f19bba4c234891b4dd", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:43.554Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e228680c-ebfa-417b-9dc0-287f170f6633, 7b83cada-4e8a-4c3d-9abd-8283f28904d0", + "traceId": "6482fe2dd1df40f19bba4c234891b4dd", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "checkedAt": "2026-08-08T02:01:43.554Z" + }, + { + "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/2085909267327004674/2085909272936906754" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "d8b3598c-2ec3-462a-984a-4ff94827482a", + "traceId": "be3464c7e55a474597fddc5d7b1a3c38", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:01:43.575Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "353ce77f-fdf2-4afa-a400-7e426bcd5a5c, 839d0580-2ae5-4cf5-b936-5e244074d4bc", + "traceId": "57c05393e673447598a960db9501fc74", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:01:44.933Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "353ce77f-fdf2-4afa-a400-7e426bcd5a5c, 839d0580-2ae5-4cf5-b936-5e244074d4bc", + "traceId": "57c05393e673447598a960db9501fc74", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:01:44.933Z" + }, + { + "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/2085909267327004674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "353ce77f-fdf2-4afa-a400-7e426bcd5a5c, 839d0580-2ae5-4cf5-b936-5e244074d4bc", + "traceId": "57c05393e673447598a960db9501fc74", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:01:44.933Z" + }, + { + "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/2085909267327004674/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90c858f8-7807-4b6b-9726-2ca07c89a5e6, 7bf22e54-60b6-482b-b82c-669264bd5fa1", + "traceId": "13d8bce738914b86bab5be6da8fb9bf3", + "evidence": "fileId=2085909288434860034", + "checkedAt": "2026-08-08T02:01:44.962Z" + }, + { + "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/2085909267327004674/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90c858f8-7807-4b6b-9726-2ca07c89a5e6, 7bf22e54-60b6-482b-b82c-669264bd5fa1", + "traceId": "13d8bce738914b86bab5be6da8fb9bf3", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:01:44.962Z" + }, + { + "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/2085909267327004674/weight-results/2085909292161478657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "988a0b39-f569-464c-87b6-575374dfaf99", + "traceId": "a15a918f264a4014b7c757b046169d4c", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:01:44.984Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dba7452b-e4ea-478e-a2cc-091a7328ee50, 31d601d1-2469-4424-9fca-deedea9c2ed3", + "traceId": "726c00f1956c44f088dd552bbd4ef496", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:45.017Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dba7452b-e4ea-478e-a2cc-091a7328ee50, 31d601d1-2469-4424-9fca-deedea9c2ed3", + "traceId": "726c00f1956c44f088dd552bbd4ef496", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:01:45.017Z" + }, + { + "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/2085909267327004674/weight-results/2085909292161478657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "2764a773-835a-49a5-8c26-b82d1aef232a", + "traceId": "5de15a59efc6480dab89afea530b7df0", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:01:45.045Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "07a68106-b91e-4b89-8b81-fb8d7bed42aa, de6da68f-cb3a-4bb7-b608-8da0e3c7a171", + "traceId": "3b6e5565e46643c89aa6487222979fb5", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:45.080Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "07a68106-b91e-4b89-8b81-fb8d7bed42aa, de6da68f-cb3a-4bb7-b608-8da0e3c7a171", + "traceId": "3b6e5565e46643c89aa6487222979fb5", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:01:45.080Z" + }, + { + "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/2085909267327004674/weight-results/2085909292161478657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "换算后重量不能小于 0.001 KG", + "requestId": "7e2dce20-7179-4bc8-833b-97a0b93191df", + "traceId": "4a73ed64173448d1b445046ded37bb71", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:01:45.110Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9960cf24-75a5-417e-89ed-08104e8d7534, a3ae67ff-f9aa-4cb0-9dbb-27fb641ba8df", + "traceId": "35b0d359c2fc4930a1cf9ceff15258b8", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:45.140Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9960cf24-75a5-417e-89ed-08104e8d7534, a3ae67ff-f9aa-4cb0-9dbb-27fb641ba8df", + "traceId": "35b0d359c2fc4930a1cf9ceff15258b8", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:01:45.141Z" + }, + { + "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/2085909267327004674/weight-results/2085909292161478657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: numeric value out of bounds (<15 digits>.<3 digits> expected)", + "requestId": "192c109f-312d-4ea4-b982-0967d3e55be4", + "traceId": "31d08ff762c241de9d56dbacb31c13c1", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:01:45.168Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e32b5f84-4980-4d2d-8462-07c6da317595, 37d251cc-9b4a-4e02-aa06-aaa5a0ec5888", + "traceId": "b29a0d67b57948ff99f623e059d733b9", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:45.207Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e32b5f84-4980-4d2d-8462-07c6da317595, 37d251cc-9b4a-4e02-aa06-aaa5a0ec5888", + "traceId": "b29a0d67b57948ff99f623e059d733b9", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:01:45.207Z" + }, + { + "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/2085909267327004674/weight-results/2085909292161478657/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "57a9fcde-a75f-40cb-bf11-bb07b38928fb, d03c44e1-2cc0-4b56-9379-a44d34e1869f", + "traceId": "1976d3cc6413427caeb83f3951560828", + "evidence": "adjusted=10.125 LB", + "checkedAt": "2026-08-08T02:01:45.243Z" + }, + { + "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/2085909267327004674/weight-results/2085909292161478657/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "57a9fcde-a75f-40cb-bf11-bb07b38928fb, d03c44e1-2cc0-4b56-9379-a44d34e1869f", + "traceId": "1976d3cc6413427caeb83f3951560828", + "evidence": "adjusted=10.125 LB, finalKg=4.593, expectedKg=4.593", + "checkedAt": "2026-08-08T02:01:45.243Z" + }, + { + "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/2085909267327004674/weight-results/2085909292161478657?tenantId=10001&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "abcd4af6-2322-4d45-b910-0af0b521f67f, 3bd1c2fe-b8e4-453a-a84a-c0784a0fafea", + "traceId": "8a9c2c36fd0f4f8585195573eec86e53", + "evidence": "resultId=2085909292161478657, version=2", + "checkedAt": "2026-08-08T02:01:45.281Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "921ae840-bdf1-4765-a3f3-b8e450ceeea9, 33f37f4a-3c62-4df4-a1dc-f5376a762b4c", + "traceId": "0cb7437e798d4302ae20a5ac9c58409a", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:45.312Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "921ae840-bdf1-4765-a3f3-b8e450ceeea9, 33f37f4a-3c62-4df4-a1dc-f5376a762b4c", + "traceId": "0cb7437e798d4302ae20a5ac9c58409a", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:01:45.312Z" + }, + { + "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/2085909267327004674/2085909288434860034" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "f1ce8c5a-90a5-4278-a0cb-c3585d7b5d0f", + "traceId": "11160a44755a415289ca53a2e048d90b", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:01:45.334Z" + }, + { + "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/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dcddbc98-2529-41cc-8528-8bba0faedbaa, 76363165-801a-49a3-962f-70d9311947a3", + "traceId": "600e4c27fac74ed7a08022a69601c782", + "evidence": "inboundId=2085909267327004674", + "checkedAt": "2026-08-08T02:01:45.359Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909267327004674/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dcddbc98-2529-41cc-8528-8bba0faedbaa, 76363165-801a-49a3-962f-70d9311947a3", + "traceId": "600e4c27fac74ed7a08022a69601c782", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:01:45.359Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020248.json b/reports/admin-test-env-acceptance-20260808020248.json new file mode 100644 index 000000000..641f480de --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020248.json @@ -0,0 +1,2021 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020248134", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:02:57.311Z", + "startedAt": "2026-08-08T02:02:48.134Z", + "success": false, + "fatal": null, + "summary": { + "total": 103, + "passed": 97, + "failed": 6 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T02:02:48.501Z", + "finishedAt": "2026-08-08T02:02:51.901Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "inbound-weight-ocr", + "startedAt": "2026-08-08T02:02:51.902Z", + "finishedAt": "2026-08-08T02:02:57.279Z", + "success": false, + "passed": 49, + "failed": 3, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T02:02:57.281Z", + "finishedAt": "2026-08-08T02:02:57.311Z", + "success": false, + "passed": 2, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "weight-image-recognition-and-confirmation", + "module": "inbound-weight-ocr", + "success": false, + "deploymentBlocked": true, + "passed": 49, + "failed": 3 + }, + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 2, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "a1870ca6-58a5-478d-9a70-39b49b52f00a", + "traceId": "a99e0dfb07a247bdb657140866e86e20" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "a1870ca6-58a5-478d-9a70-39b49b52f00a", + "traceId": "a99e0dfb07a247bdb657140866e86e20" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "code": "200", + "requestId": "5e62d684-8cb9-41d6-934c-6f8c80ca94a1, 0f85ebf7-45a9-48f1-81d5-152a691078b0", + "traceId": "aaa72d13aab4474b9026f99ff9b3af1d" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "code": "200", + "requestId": "968ae317-5b07-414c-ad87-88411e70c0ba, 801324f6-822b-4f3a-b037-e4464c6c8482", + "traceId": "528589395a5a4e28915674d0b3b28590" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "code": "200", + "requestId": "504932ad-b6a6-4c79-a915-c01b879c8191, a91eb144-29a1-4ff5-b942-9dae63fc89d7", + "traceId": "737daca5744e4194810a4a95f7cf8328" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "evidence": "inboundCode=present, totalPackageCount=missing", + "code": "200", + "requestId": "dbdaf18c-32f1-4dd5-85ce-62931ed8982c, ba483fd5-d4ac-412c-813b-0abd8621c183", + "traceId": "6368629dc4a346d88d6032c87eb594db" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808020248134", + "tenantId": "10001", + "orderId": "2085909561572130818", + "productImageFileId": "2085909561219809281", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085909569526607873", + "orderNo": "FL2085909561572130818", + "inboundCode": "RK-2085909561572130818", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085909569526607873", + "marker": "ADMIN-API-20260808020248134" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085909569526607873", + "marker": "ADMIN-API-20260808020248134" + }, + "inboundWeightOcr": { + "tenantId": "10001", + "inboundId": "2085909569526607873", + "resultIds": [ + "2085909584361861121", + "2085909593765490690" + ], + "cleaned": false + } + }, + "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": "88264044-b0b6-4d73-a3f9-a24cf15434cc, e4ee8c69-9e49-46e1-ba95-6ae35eef5e4b", + "traceId": "cc3dab6c00a543b19288fc916ffbd3a4", + "evidence": "", + "checkedAt": "2026-08-08T02:02:48.500Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ae71cc29-9670-4a03-a2ba-8ad30044c62b, 595c592c-668a-4c21-8a8a-b31db61d2518", + "traceId": "134574117a794f69a6cb9ea7d52a16f5", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:02:48.840Z" + }, + { + "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": "82083346-82b5-4db4-b293-dcc6c250e53d, a501e151-7654-4937-b29d-c7ff9e714e78", + "traceId": "99db9851d7914315a847edba14975f84", + "evidence": "", + "checkedAt": "2026-08-08T02:02:48.870Z" + }, + { + "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": "82083346-82b5-4db4-b293-dcc6c250e53d, a501e151-7654-4937-b29d-c7ff9e714e78", + "traceId": "99db9851d7914315a847edba14975f84", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:02:48.871Z" + }, + { + "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": "60530418-6d61-4f35-9c57-983641ff974c, 9c641c0b-cd4a-4c60-85de-9cdd3faccc05", + "traceId": "f57962e736a74f4e9c97f1016d22aafc", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:02:48.892Z" + }, + { + "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": "60530418-6d61-4f35-9c57-983641ff974c, 9c641c0b-cd4a-4c60-85de-9cdd3faccc05", + "traceId": "f57962e736a74f4e9c97f1016d22aafc", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:02:48.893Z" + }, + { + "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": "54aabae1-d0c8-4f4c-86a1-232864e19b2a, 89856632-4cc8-41d5-82e0-ca0491dca40c", + "traceId": "722d5376411d4b4597e15a4d7df75ab3", + "evidence": "", + "checkedAt": "2026-08-08T02:02:48.920Z" + }, + { + "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": "54aabae1-d0c8-4f4c-86a1-232864e19b2a, 89856632-4cc8-41d5-82e0-ca0491dca40c", + "traceId": "722d5376411d4b4597e15a4d7df75ab3", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:02:48.920Z" + }, + { + "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": "389bde10-1f45-4fb7-b229-4a8273c30a40, b1da1635-830a-41c1-a0b6-d4152bc9e3a1", + "traceId": "8699d91af40649c0b3f901c45d6d48e2", + "evidence": "", + "checkedAt": "2026-08-08T02:02:48.984Z" + }, + { + "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": "389bde10-1f45-4fb7-b229-4a8273c30a40, b1da1635-830a-41c1-a0b6-d4152bc9e3a1", + "traceId": "8699d91af40649c0b3f901c45d6d48e2", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:02:48.984Z" + }, + { + "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": "3a92506c-bf7c-4cf3-9e41-aa6b31e8738e, 57a897a2-e561-42e1-9aea-77622096c205", + "traceId": "ffc051967ebb4217a8e1e6cca62063e2", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.043Z" + }, + { + "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": "3a92506c-bf7c-4cf3-9e41-aa6b31e8738e, 57a897a2-e561-42e1-9aea-77622096c205", + "traceId": "ffc051967ebb4217a8e1e6cca62063e2", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:02:49.043Z" + }, + { + "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": "b10efa1f-46de-41ab-ad4b-729cbde9d6cd, 0d640915-6227-4f7c-96b0-8a22c58515d4", + "traceId": "32222b39f761486c8a12fd14ec9cdc6d", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.069Z" + }, + { + "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": "f6d9259a-2bc9-44cd-9737-e3771f28aa13, 91c591a9-bebb-43d0-9983-d0baf380dbcc", + "traceId": "c9cec149230f4b86abf3309742086beb", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:02:49.110Z" + }, + { + "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": "f6d9259a-2bc9-44cd-9737-e3771f28aa13, 91c591a9-bebb-43d0-9983-d0baf380dbcc", + "traceId": "c9cec149230f4b86abf3309742086beb", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:02:49.110Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085909561219809281" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "99cd9f23-c53d-42b8-9788-d548176a12fa, bfd7c97a-1d9f-4efe-8cc2-f4e9b20d7f3d", + "traceId": "3b6a86cd30d744c790f43df737f15148", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:02:49.135Z" + }, + { + "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": "9088286a-803e-411f-8e98-85b6b01ce364, c55a5eb3-05af-4da3-9707-8cfd97a4040c", + "traceId": "eca00b086c0a40ea820c390c255b45fe", + "evidence": "marker=ADMIN-API-20260808020248134", + "checkedAt": "2026-08-08T02:02:49.207Z" + }, + { + "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": "1404bfad-ab2e-4176-a11e-a4165d1cd861, dd52a0b8-2257-497a-b620-84fd432891a1", + "traceId": "b9757f1345844060ab9536785180a215", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.236Z" + }, + { + "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": "1404bfad-ab2e-4176-a11e-a4165d1cd861, dd52a0b8-2257-497a-b620-84fd432891a1", + "traceId": "b9757f1345844060ab9536785180a215", + "evidence": "orderId=2085909561572130818, replayedId=2085909561572130818", + "checkedAt": "2026-08-08T02:02:49.236Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909561572130818" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e51666ff-93b4-411e-ae8d-3b5728f8e9dc, fa404db1-89d6-418c-aa2d-696a448ef984", + "traceId": "f34e91f5a47948bcb8b64da0fe0613ea", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.265Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909561572130818" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e51666ff-93b4-411e-ae8d-3b5728f8e9dc, fa404db1-89d6-418c-aa2d-696a448ef984", + "traceId": "f34e91f5a47948bcb8b64da0fe0613ea", + "evidence": "orderNo=FL2085909561572130818, status=DRAFT", + "checkedAt": "2026-08-08T02:02:49.265Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909561572130818" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e51666ff-93b4-411e-ae8d-3b5728f8e9dc, fa404db1-89d6-418c-aa2d-696a448ef984", + "traceId": "f34e91f5a47948bcb8b64da0fe0613ea", + "evidence": "cargoes=4, imageFileId=2085909561219809281", + "checkedAt": "2026-08-08T02:02:49.266Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085909561572130818/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0b320c63-0208-4715-b6f1-3d7fdfd5650d, 35079852-29c6-4d02-9786-304bb162908e", + "traceId": "6d6f76382d994c7c83388245a743bc24", + "evidence": "orderId=2085909561572130818", + "checkedAt": "2026-08-08T02:02:49.332Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909561572130818" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "84c236d4-c093-439b-b2cd-7cc60ab0b39a, e53b1969-aee0-4882-9ae1-306595c1eb5d", + "traceId": "ceca6324231b4e9e95d8829cb4435d8c", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.377Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909561572130818" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "84c236d4-c093-439b-b2cd-7cc60ab0b39a, e53b1969-aee0-4882-9ae1-306595c1eb5d", + "traceId": "ceca6324231b4e9e95d8829cb4435d8c", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:02:49.377Z" + }, + { + "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=FL2085909561572130818" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a559d83c-0045-4ecc-9c3c-108839105477, 721f42df-d5d3-4eca-9a8c-172f6dd8c34b", + "traceId": "4c45ba572b7143e7b72d2615a48567a9", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.412Z" + }, + { + "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=FL2085909561572130818" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a559d83c-0045-4ecc-9c3c-108839105477, 721f42df-d5d3-4eca-9a8c-172f6dd8c34b", + "traceId": "4c45ba572b7143e7b72d2615a48567a9", + "evidence": "orderId=2085909561572130818, found=true", + "checkedAt": "2026-08-08T02:02:49.412Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7537e199-0dc1-4bec-b9e3-ec95bd0afe1d, 9f76f302-98e6-473c-b05d-5252fb98a162", + "traceId": "9e220f71803e4d2fa93c6d2f8cb5c8e0", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.450Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7537e199-0dc1-4bec-b9e3-ec95bd0afe1d, 9f76f302-98e6-473c-b05d-5252fb98a162", + "traceId": "9e220f71803e4d2fa93c6d2f8cb5c8e0", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:02:49.450Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085909561572130818&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "35fee816-d271-4a84-980f-cb78178fc65d, 9a75e491-2a3e-44bc-91b8-fe3713b1ca9b", + "traceId": "b9c75bb3b9614a19b640e0e94d7eaa27", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.480Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085909561572130818&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "35fee816-d271-4a84-980f-cb78178fc65d, 9a75e491-2a3e-44bc-91b8-fe3713b1ca9b", + "traceId": "b9c75bb3b9614a19b640e0e94d7eaa27", + "evidence": "orderId=2085909561572130818, found=true", + "checkedAt": "2026-08-08T02:02:49.481Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fe0fb667-50f6-4042-9c9b-cca1337f2ee4, de58931e-7f86-4d14-a875-2a0d4e2cd828", + "traceId": "e611ec99b9924e179b77e3b43008db27", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.512Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fe0fb667-50f6-4042-9c9b-cca1337f2ee4, de58931e-7f86-4d14-a875-2a0d4e2cd828", + "traceId": "e611ec99b9924e179b77e3b43008db27", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:02:49.513Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fe0fb667-50f6-4042-9c9b-cca1337f2ee4, de58931e-7f86-4d14-a875-2a0d4e2cd828", + "traceId": "e611ec99b9924e179b77e3b43008db27", + "evidence": "cargoes=4, imageFileId=2085909561219809281", + "checkedAt": "2026-08-08T02:02:49.513Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d98b5e71-04e0-411c-a4b4-80e171afcfc0, cdf2bc9b-e3c0-48b1-ab81-033bab83a71f", + "traceId": "025d799f3b9d40188d5fad58dc6d7d82", + "evidence": "", + "checkedAt": "2026-08-08T02:02:49.545Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "350f195c-0a94-4cdc-97b4-4d7a3a665a8e, 27439fa6-2ad2-426d-b1fb-fe0c257fec37", + "traceId": "b8ac682f55dd4f2ba91a063962f56545", + "evidence": "orderId=2085909561572130818", + "checkedAt": "2026-08-08T02:02:49.577Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2228bce6-05c2-44f3-9a7c-c3f18a3782dd, f46ea541-b9c7-433a-95cf-6535b5608e67", + "traceId": "af2f6b44857a4292a0885ada1ad77427", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:51.713Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909569526607873?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df4a7a4c-df5c-4169-913a-c4890a7aba84, 165697c1-f1b6-46b0-ba50-eed4b726059f", + "traceId": "819ae18f99464ee9a3cde294dc2e637f", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:51.747Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909569526607873?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df4a7a4c-df5c-4169-913a-c4890a7aba84, 165697c1-f1b6-46b0-ba50-eed4b726059f", + "traceId": "819ae18f99464ee9a3cde294dc2e637f", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:02:51.747Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909569526607873?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df4a7a4c-df5c-4169-913a-c4890a7aba84, 165697c1-f1b6-46b0-ba50-eed4b726059f", + "traceId": "819ae18f99464ee9a3cde294dc2e637f", + "evidence": "inboundId=2085909569526607873, history=1", + "checkedAt": "2026-08-08T02:02:51.747Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085909561572130818&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "991669b8-2eb6-4fab-8e8a-b21650088140, d5374436-dbfb-455b-b311-7609526d5398", + "traceId": "9c602df24fdf41bd89c7cc780f8b70c8", + "evidence": "", + "checkedAt": "2026-08-08T02:02:51.786Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085909561572130818&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "991669b8-2eb6-4fab-8e8a-b21650088140, d5374436-dbfb-455b-b311-7609526d5398", + "traceId": "9c602df24fdf41bd89c7cc780f8b70c8", + "evidence": "inboundId=2085909569526607873, total=1", + "checkedAt": "2026-08-08T02:02:51.786Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "a1870ca6-58a5-478d-9a70-39b49b52f00a", + "traceId": "a99e0dfb07a247bdb657140866e86e20", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:02:51.810Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "a1870ca6-58a5-478d-9a70-39b49b52f00a", + "traceId": "a99e0dfb07a247bdb657140866e86e20", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:02:51.810Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa237396-0cd1-4378-8256-378409f95011, d990d410-a1be-404e-8909-6b2d4571a62f", + "traceId": "d56795d6b5024c0abddd5e770c9e769b", + "evidence": "", + "checkedAt": "2026-08-08T02:02:51.837Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6ef995f1-cf8a-4b2e-b77d-d9fc6f867fe2, 4aee1cd4-ee2b-4c74-8700-fe4ecc893227", + "traceId": "16d7ca4aeae144c4bde946b6626d51aa", + "evidence": "", + "checkedAt": "2026-08-08T02:02:51.877Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "93f59df1-9f2f-4f8c-ada4-1a162611f194, 7e6d6262-feff-487d-8ccf-bcb1a42c8703", + "traceId": "d63238d19fe144598a5921d68384e4a2", + "evidence": "", + "checkedAt": "2026-08-08T02:02:51.901Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909561572130818?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "93f59df1-9f2f-4f8c-ada4-1a162611f194, 7e6d6262-feff-487d-8ccf-bcb1a42c8703", + "traceId": "d63238d19fe144598a5921d68384e4a2", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:02:51.901Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅选择带本轮测试标记的可编辑入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909569526607873?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7314c2ce-bfa9-42dd-a844-f7472fc5f916, 6f71917b-9529-48da-af47-24ca42a3a57a", + "traceId": "d60ae761629e4f02a57c5c175ffdc896", + "evidence": "tenantId=10001, inboundId=2085909569526607873, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:02:51.936Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d198a1e0-0db4-45dd-89b6-3e6d48be0c08, c412be6d-ece8-4405-a61e-80caba0fcfe5", + "traceId": "6c0bdcedfd88466ea9a5d2eacc299135", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:51.979Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d198a1e0-0db4-45dd-89b6-3e6d48be0c08, c412be6d-ece8-4405-a61e-80caba0fcfe5", + "traceId": "6c0bdcedfd88466ea9a5d2eacc299135", + "evidence": "existingResults=0, baselineWeight=null", + "checkedAt": "2026-08-08T02:02:51.979Z" + }, + { + "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/2085909569526607873" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "f3ccfe95-1363", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T02:02:52.001Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "A0400", + "message": "称重图片仅支持JPG、PNG、BMP", + "requestId": "d258fda4-d664-4af2-a3c9-6c1e20686085", + "traceId": "36fb6fd931bc4e998872da2e4b735353", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:02:52.030Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "A0400", + "message": "称重图片不能超过5MB", + "requestId": "622bf868-1987-49c5-b132-d69c9345d8e8", + "traceId": "61a31ac345c24291978105cf1881c9c0", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:02:52.389Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9ba4d3b4-1e89-4cb5-a564-11e41d9a805e, 3b499fc6-023c-4f27-b770-3e1d0a83be2c", + "traceId": "a1458b44bd0c4f5c98dda223fc4f22e4", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:02:53.729Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9ba4d3b4-1e89-4cb5-a564-11e41d9a805e, 3b499fc6-023c-4f27-b770-3e1d0a83be2c", + "traceId": "a1458b44bd0c4f5c98dda223fc4f22e4", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:02:53.729Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9ba4d3b4-1e89-4cb5-a564-11e41d9a805e, 3b499fc6-023c-4f27-b770-3e1d0a83be2c", + "traceId": "a1458b44bd0c4f5c98dda223fc4f22e4", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:02:53.729Z" + }, + { + "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/2085909569526607873/2085909577179136002/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "87e18025-1614-489f-8917-58b3d99fb78e, f2b83904-e7ff-4801-86d3-370a040ed9be", + "traceId": "2372147f2d8a43fc85aa568f7a4baad8", + "evidence": "fileId=2085909577179136002", + "checkedAt": "2026-08-08T02:02:54.594Z" + }, + { + "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/2085909569526607873/2085909577179136002/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "87e18025-1614-489f-8917-58b3d99fb78e, f2b83904-e7ff-4801-86d3-370a040ed9be", + "traceId": "2372147f2d8a43fc85aa568f7a4baad8", + "evidence": "sameFile=true, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:02:54.595Z" + }, + { + "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/2085909569526607873/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6a4c770-be5c-4e71-9821-41b407d1d0fd, 4dafe3c2-ea92-4bcf-9ac0-7de578263dc1", + "traceId": "0223ff9d87864a7a96ed563c95a91d74", + "evidence": "fileId=2085909577179136002", + "checkedAt": "2026-08-08T02:02:54.628Z" + }, + { + "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/2085909569526607873/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6a4c770-be5c-4e71-9821-41b407d1d0fd, 4dafe3c2-ea92-4bcf-9ac0-7de578263dc1", + "traceId": "0223ff9d87864a7a96ed563c95a91d74", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:02:54.628Z" + }, + { + "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/2085909569526607873/2085909577179136002" + }, + "http": 200, + "code": null, + "message": "3701469 bytes (image/jpeg)", + "requestId": "6260cf3c-d060-4dba-9f0b-dc5d868a5f76, f01b9293-eaf4-4683-bf97-dea79d9cfeba", + "traceId": "3d435b066de5405f859fd944bc1f39cb", + "evidence": "contentType=image/jpeg, bytes=3701469", + "checkedAt": "2026-08-08T02:02:54.811Z" + }, + { + "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/2085909569526607873/2085909577179136002/thumbnail" + }, + "http": 200, + "code": null, + "message": "18677 bytes (image/jpeg)", + "requestId": "3215efef-1e09-41d4-8286-d45b915120d4, 01d104fe-3e13-4b66-8bdc-5b3c56001bc1", + "traceId": "9127a5d89a35497186b2529765b7c73d", + "evidence": "contentType=image/jpeg, bytes=18677, dimensions=240x320", + "checkedAt": "2026-08-08T02:02:55.175Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3d9f7b3-d47f-484b-8cdd-c7bb4cdcd8e2, 108c962f-59c9-4940-9327-3abfa9ec160e", + "traceId": "105b7345cd094512a4b8b08e67caaa01", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:55.198Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3d9f7b3-d47f-484b-8cdd-c7bb4cdcd8e2, 108c962f-59c9-4940-9327-3abfa9ec160e", + "traceId": "105b7345cd094512a4b8b08e67caaa01", + "evidence": "resultFound=true, baselineCount=0, currentCount=1", + "checkedAt": "2026-08-08T02:02:55.198Z" + }, + { + "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/2085909569526607873/weight-results/2085909584361861121/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "1076760b-292d-4b07-b25c-2fdaa097e866", + "traceId": "a34da91bd4d642cdb9bfeb4159c0c7b7", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:02:55.229Z" + }, + { + "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/2085909569526607873/weight-results/2085909584361861121/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e11a47f0-9b0c-4932-a5a4-c2565b3e8b1a, d433c0ee-e6d7-4abb-a06e-7ce6394572d3", + "traceId": "aad52202cf58403088b8191f99f4d68b", + "evidence": "usedOriginal=true", + "checkedAt": "2026-08-08T02:02:55.268Z" + }, + { + "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/2085909569526607873/weight-results/2085909584361861121/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e11a47f0-9b0c-4932-a5a4-c2565b3e8b1a, d433c0ee-e6d7-4abb-a06e-7ce6394572d3", + "traceId": "aad52202cf58403088b8191f99f4d68b", + "evidence": "status=CONFIRMED, version=1, finalKg=285.5", + "checkedAt": "2026-08-08T02:02:55.268Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f83c2f5a-f03e-4a3d-8037-e7cdbe2202a6, d143cb2a-4006-4f88-9694-e4dbc30e8e52", + "traceId": "74193a8f82b64daf976da360f695105a", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:55.305Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f83c2f5a-f03e-4a3d-8037-e7cdbe2202a6, d143cb2a-4006-4f88-9694-e4dbc30e8e52", + "traceId": "74193a8f82b64daf976da360f695105a", + "evidence": "baseline=null, added=285.5, actual=285.5", + "checkedAt": "2026-08-08T02:02:55.306Z" + }, + { + "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/2085909569526607873/weight-results/2085909584361861121?tenantId=10001&version=0" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "e72fcf97-7c44-4381-afc5-fb89a439a62e", + "traceId": "1ac7f65dae314e0e8106cfdcf20da492", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:02:55.336Z" + }, + { + "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/2085909569526607873/weight-results/2085909584361861121?tenantId=10001&version=1" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eefc030a-583a-4c72-b584-8d106527effb, 41a20932-b100-4422-b0bb-65c4cc03515c", + "traceId": "77ec7506353f44698515cb3f6af7bc40", + "evidence": "resultId=2085909584361861121, version=1", + "checkedAt": "2026-08-08T02:02:55.454Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5e62d684-8cb9-41d6-934c-6f8c80ca94a1, 0f85ebf7-45a9-48f1-81d5-152a691078b0", + "traceId": "aaa72d13aab4474b9026f99ff9b3af1d", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:55.490Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5e62d684-8cb9-41d6-934c-6f8c80ca94a1, 0f85ebf7-45a9-48f1-81d5-152a691078b0", + "traceId": "aaa72d13aab4474b9026f99ff9b3af1d", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "checkedAt": "2026-08-08T02:02:55.491Z" + }, + { + "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/2085909569526607873/2085909577179136002" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "5d24fa2a-d4e6-4b16-8da4-bb6649e91475", + "traceId": "94c8792014c14c2db13d569b95ddf42a", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:02:55.522Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7a3ea039-77d5-444b-91b7-c850b9097724, b006f08d-38fc-4a23-adf4-778a2b4b752b", + "traceId": "f463cdab1cad428eb49f9b11d2a46a35", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:02:56.835Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7a3ea039-77d5-444b-91b7-c850b9097724, b006f08d-38fc-4a23-adf4-778a2b4b752b", + "traceId": "f463cdab1cad428eb49f9b11d2a46a35", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:02:56.835Z" + }, + { + "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/2085909569526607873" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7a3ea039-77d5-444b-91b7-c850b9097724, b006f08d-38fc-4a23-adf4-778a2b4b752b", + "traceId": "f463cdab1cad428eb49f9b11d2a46a35", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:02:56.835Z" + }, + { + "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/2085909569526607873/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "311711aa-ef07-4697-aaa2-57e2088dd31d, d7a764ab-e30d-4125-8413-38e4ef36d88b", + "traceId": "993c3931e38d42f7aba483a8c1c06ff2", + "evidence": "fileId=2085909590173089794", + "checkedAt": "2026-08-08T02:02:56.870Z" + }, + { + "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/2085909569526607873/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "311711aa-ef07-4697-aaa2-57e2088dd31d, d7a764ab-e30d-4125-8413-38e4ef36d88b", + "traceId": "993c3931e38d42f7aba483a8c1c06ff2", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:02:56.870Z" + }, + { + "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/2085909569526607873/weight-results/2085909593765490690/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "63e910f3-35d3-4b46-9999-e13a43241050", + "traceId": "73a9567775e5406b8da336c8c432ed94", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:02:56.893Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cb006518-eeca-46c1-a0b7-6c99d24ffed1, 58ed7a50-58ef-4109-aba0-1c176264f7e1", + "traceId": "717863f899644369ae047b7689d85219", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:56.924Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cb006518-eeca-46c1-a0b7-6c99d24ffed1, 58ed7a50-58ef-4109-aba0-1c176264f7e1", + "traceId": "717863f899644369ae047b7689d85219", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:02:56.924Z" + }, + { + "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/2085909569526607873/weight-results/2085909593765490690/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "abc5d541-948f-494c-95ca-1151ddefdc2e", + "traceId": "b8c33286f68c4631844bf37c8895669c", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:02:56.954Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ee3b7ad8-d3cf-4326-8688-a2c418c16c7c, 89454eb5-a16b-448d-beb3-3e8135e1ac1d", + "traceId": "821c0524c9a8410d89efdcda106fe4ec", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:56.985Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ee3b7ad8-d3cf-4326-8688-a2c418c16c7c, 89454eb5-a16b-448d-beb3-3e8135e1ac1d", + "traceId": "821c0524c9a8410d89efdcda106fe4ec", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:02:56.985Z" + }, + { + "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/2085909569526607873/weight-results/2085909593765490690/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "换算后重量不能小于 0.001 KG", + "requestId": "57bcfc5f-ab3a-4962-9ca6-818f1b59bbf8", + "traceId": "9fdb3af0da484db1a0cffb16c4a35919", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:02:57.017Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "05c057a8-f11d-411d-b9e2-5f83ba3f9e91, cda03fdc-a71e-4b7e-8e71-d8c349c2998a", + "traceId": "04e1a0d67448426581cbe4c279e6151e", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:57.049Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "05c057a8-f11d-411d-b9e2-5f83ba3f9e91, cda03fdc-a71e-4b7e-8e71-d8c349c2998a", + "traceId": "04e1a0d67448426581cbe4c279e6151e", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:02:57.049Z" + }, + { + "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/2085909569526607873/weight-results/2085909593765490690/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: numeric value out of bounds (<15 digits>.<3 digits> expected)", + "requestId": "db21f178-13eb-4b4c-aa58-c8e37500542d", + "traceId": "14d05b8b813d4ed0abfd4da1c504f4f2", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:02:57.077Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c4d996a-2bbd-49b1-92ba-b75f2abaef92, a0b06478-e4ee-4253-af1d-7b78e501276b", + "traceId": "ee6e3d693c224feb9dc6a7fc201d5ee9", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:57.112Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c4d996a-2bbd-49b1-92ba-b75f2abaef92, a0b06478-e4ee-4253-af1d-7b78e501276b", + "traceId": "ee6e3d693c224feb9dc6a7fc201d5ee9", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:02:57.112Z" + }, + { + "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/2085909569526607873/weight-results/2085909593765490690/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eafc5635-b1b5-43f7-9461-75b578e4698e, 72025e0f-43f5-4e4c-8b93-74aa021aad4c", + "traceId": "eab51453dbf943c2a2558211479c3c9c", + "evidence": "adjusted=10.125 LB", + "checkedAt": "2026-08-08T02:02:57.149Z" + }, + { + "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/2085909569526607873/weight-results/2085909593765490690/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eafc5635-b1b5-43f7-9461-75b578e4698e, 72025e0f-43f5-4e4c-8b93-74aa021aad4c", + "traceId": "eab51453dbf943c2a2558211479c3c9c", + "evidence": "adjusted=10.125 LB, finalKg=4.593, expectedKg=4.593", + "checkedAt": "2026-08-08T02:02:57.149Z" + }, + { + "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/2085909569526607873/weight-results/2085909593765490690?tenantId=10001&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a8100df0-cb99-4a34-9a00-79bc5f36da94, d0b971af-e80d-4032-83c5-3c60943170f4", + "traceId": "698131c7df074aebbc5bab293c7887d5", + "evidence": "resultId=2085909593765490690, version=2", + "checkedAt": "2026-08-08T02:02:57.185Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "968ae317-5b07-414c-ad87-88411e70c0ba, 801324f6-822b-4f3a-b037-e4464c6c8482", + "traceId": "528589395a5a4e28915674d0b3b28590", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:57.218Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "968ae317-5b07-414c-ad87-88411e70c0ba, 801324f6-822b-4f3a-b037-e4464c6c8482", + "traceId": "528589395a5a4e28915674d0b3b28590", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:02:57.218Z" + }, + { + "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/2085909569526607873/2085909590173089794" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "8abd5a6c-6e77-4aa8-8972-6a964890d7be", + "traceId": "cac3a24a0e6248408d5b42971533ed1a", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:02:57.249Z" + }, + { + "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/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "504932ad-b6a6-4c79-a915-c01b879c8191, a91eb144-29a1-4ff5-b942-9dae63fc89d7", + "traceId": "737daca5744e4194810a4a95f7cf8328", + "evidence": "inboundId=2085909569526607873", + "checkedAt": "2026-08-08T02:02:57.279Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909569526607873/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "504932ad-b6a6-4c79-a915-c01b879c8191, a91eb144-29a1-4ff5-b942-9dae63fc89d7", + "traceId": "737daca5744e4194810a4a95f7cf8328", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:02:57.279Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909569526607873?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dbdaf18c-32f1-4dd5-85ce-62931ed8982c, ba483fd5-d4ac-412c-813b-0abd8621c183", + "traceId": "6368629dc4a346d88d6032c87eb594db", + "evidence": "inboundId=2085909569526607873, tenantId=10001", + "checkedAt": "2026-08-08T02:02:57.311Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909569526607873?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dbdaf18c-32f1-4dd5-85ce-62931ed8982c, ba483fd5-d4ac-412c-813b-0abd8621c183", + "traceId": "6368629dc4a346d88d6032c87eb594db", + "evidence": "identity=true, status=MEASURING", + "checkedAt": "2026-08-08T02:02:57.311Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909569526607873?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dbdaf18c-32f1-4dd5-85ce-62931ed8982c, ba483fd5-d4ac-412c-813b-0abd8621c183", + "traceId": "6368629dc4a346d88d6032c87eb594db", + "evidence": "inboundCode=present, totalPackageCount=missing", + "checkedAt": "2026-08-08T02:02:57.311Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020409.json b/reports/admin-test-env-acceptance-20260808020409.json new file mode 100644 index 000000000..da8edc8e7 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020409.json @@ -0,0 +1,4895 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020409413", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:04:30.202Z", + "startedAt": "2026-08-08T02:04:09.413Z", + "success": false, + "fatal": null, + "summary": { + "total": 256, + "passed": 249, + "failed": 7 + }, + "modules": [ + { + "name": "customers", + "startedAt": "2026-08-08T02:04:09.788Z", + "finishedAt": "2026-08-08T02:04:10.295Z", + "success": false, + "passed": 35, + "failed": 1, + "fatal": null + }, + { + "name": "system", + "startedAt": "2026-08-08T02:04:10.297Z", + "finishedAt": "2026-08-08T02:04:12.570Z", + "success": true, + "passed": 41, + "failed": 0, + "fatal": null + }, + { + "name": "master-data", + "startedAt": "2026-08-08T02:04:12.571Z", + "finishedAt": "2026-08-08T02:04:13.634Z", + "success": true, + "passed": 42, + "failed": 0, + "fatal": null + }, + { + "name": "orders", + "startedAt": "2026-08-08T02:04:13.636Z", + "finishedAt": "2026-08-08T02:04:15.936Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "pricing", + "startedAt": "2026-08-08T02:04:15.938Z", + "finishedAt": "2026-08-08T02:04:19.731Z", + "success": true, + "passed": 26, + "failed": 0, + "fatal": null + }, + { + "name": "downloads", + "startedAt": "2026-08-08T02:04:19.732Z", + "finishedAt": "2026-08-08T02:04:23.943Z", + "success": true, + "passed": 8, + "failed": 0, + "fatal": null + }, + { + "name": "inbound-weight-ocr", + "startedAt": "2026-08-08T02:04:23.945Z", + "finishedAt": "2026-08-08T02:04:30.171Z", + "success": false, + "passed": 49, + "failed": 3, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T02:04:30.172Z", + "finishedAt": "2026-08-08T02:04:30.202Z", + "success": false, + "passed": 2, + "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": false, + "deploymentBlocked": true, + "passed": 49, + "failed": 3 + }, + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 2, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "归档测试客户", + "evidence": "tenantId=2085909899879501825", + "code": "S0500", + "requestId": "52154918-874c-48d3-9edf-566345fdbe86", + "traceId": "5bd5753c912f49119675a64088355551" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "81bd27d3-e4a0-4801-8e39-2792194104d4", + "traceId": "950b2e3102c947829efdee63dab80a1c" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "81bd27d3-e4a0-4801-8e39-2792194104d4", + "traceId": "950b2e3102c947829efdee63dab80a1c" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "code": "200", + "requestId": "f2bd07fd-e505-4a6b-9086-0c2d7a7af963, 11f33169-d419-4bf3-ac5d-29ca3fe87497", + "traceId": "6a1e9377c74b4eb0b41cffc5afcdcd28" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "code": "200", + "requestId": "1b55972f-34af-477b-9206-9a8a02c3ff8d, 742d0f8b-fad3-4092-a51b-2d97c091278d", + "traceId": "f2be264baee043a58e7033432006f36b" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "code": "200", + "requestId": "8f9040b1-bd94-4f81-bace-7d5328834b35, 22eb84ed-3c58-45a0-b39c-f3a2edb83322", + "traceId": "40ecb94bdb0445a39cf1ed8a470431aa" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "evidence": "inboundCode=present, totalPackageCount=missing", + "code": "200", + "requestId": "8c48c3dc-36cd-4268-a6ed-eff4ed56d036, 274f077b-2f35-4cc8-ae31-8559a39cb4df", + "traceId": "07e4bfe12f72485ab2c29cec1b5f0e0c" + } + ], + "createdResources": { + "customer": { + "tenantId": "2085909899879501825", + "marker": "ADMIN-API-20260808020409413", + "contactPhone": "16154649788" + }, + "systemPermission": { + "id": "2085909902056345602", + "code": "platform:acceptance:808020409413" + }, + "systemRole": { + "id": "2085909902568050690", + "code": "ADMIN_ACCEPT_808020409413", + "finalStatus": "DISABLED", + "retainedBecauseAssigned": true + }, + "systemUser": { + "membershipId": "2085909903704707075", + "username": "admin_accept_808020409413", + "finalStatus": "DISABLED" + }, + "warehouse": { + "id": "2085909911633444865", + "code": "AW808020409413", + "finalStatus": "INACTIVE" + }, + "location": { + "id": "2085909912291950594", + "warehouseId": "2085909911633444865", + "deleted": false + }, + "pallet": { + "id": "2085909913072091137", + "warehouseId": "2085909911633444865", + "deleted": true + }, + "expressCompany": { + "id": "2085909913718013953", + "code": "EX808020409413", + "finalStatus": "INACTIVE" + }, + "partner": { + "id": "2085909914363936769", + "code": "PT808020409413", + "finalStatus": "INACTIVE" + }, + "orders": { + "marker": "ADMIN-API-20260808020409413", + "tenantId": "10001", + "orderId": "2085909918519984129", + "productImageFileId": "2085909918180245505", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085909922162716673", + "orderNo": "FL2085909918519984129", + "inboundCode": "RK-2085909918519984129", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085909922162716673", + "marker": "ADMIN-API-20260808020409413" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085909922162716673", + "marker": "ADMIN-API-20260808020409413" + }, + "priceBookVersion": { + "versionId": "2085909925908230146", + "marker": "ADMIN-API-20260808020409413", + "sourceSha256": "3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab" + }, + "exportTask": { + "id": "2085909941454438401" + }, + "inboundWeightOcr": { + "tenantId": "10001", + "inboundId": "2085909922162716673", + "resultIds": [ + "2085909973379362818", + "2085909983173062657" + ], + "cleaned": false + } + }, + "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": "898d8533-0202-45ab-a3d9-7f1ae128dc56, 463c2706-48b4-4ece-a770-562f6b0eabb2", + "traceId": "9d8e6ebf41c44e1f81f8cac6c7de7e10", + "evidence": "", + "checkedAt": "2026-08-08T02:04:09.788Z" + }, + { + "module": "customers", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16154649788" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5c2d73cf-aa04-4f14-a3fc-f20461ab8c1a, 0999dfc9-be27-4295-8e1d-4cd02f3e2264", + "traceId": "4ac1ac666fc240eea7a1bebe956669c9", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T02:04:09.828Z" + }, + { + "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": "de8d0377-9165-4689-8592-12a165c6ab76, 7c106109-39ca-4306-93cb-4eb51af759b1", + "traceId": "08478dca90af4f3c93e8d437becfda5b", + "evidence": "", + "checkedAt": "2026-08-08T02:04:09.864Z" + }, + { + "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": "de8d0377-9165-4689-8592-12a165c6ab76, 7c106109-39ca-4306-93cb-4eb51af759b1", + "traceId": "08478dca90af4f3c93e8d437becfda5b", + "evidence": "missing=none", + "checkedAt": "2026-08-08T02:04:09.864Z" + }, + { + "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": "de8d0377-9165-4689-8592-12a165c6ab76, 7c106109-39ca-4306-93cb-4eb51af759b1", + "traceId": "08478dca90af4f3c93e8d437becfda5b", + "evidence": "tenantId=2085909899879501825, status=PROFILE_REQUIRED", + "checkedAt": "2026-08-08T02:04:09.864Z" + }, + { + "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": "de8d0377-9165-4689-8592-12a165c6ab76, 7c106109-39ca-4306-93cb-4eb51af759b1", + "traceId": "08478dca90af4f3c93e8d437becfda5b", + "evidence": "temporaryPassword=omitted, administratorUsername=omitted", + "checkedAt": "2026-08-08T02:04:09.864Z" + }, + { + "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": "de8d0377-9165-4689-8592-12a165c6ab76, 7c106109-39ca-4306-93cb-4eb51af759b1", + "traceId": "08478dca90af4f3c93e8d437becfda5b", + "evidence": "creditCode=omitted, approvedAt=omitted", + "checkedAt": "2026-08-08T02:04:09.864Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "新客户尺寸规则可查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6174c56e-c439-411c-b65f-3e709d77f0f1, 2a02bb23-b609-42a0-82b5-9a031a79b08d", + "traceId": "62824a82b80d4592aee21a8d3ba87ebe", + "evidence": "tenantId=2085909899879501825", + "checkedAt": "2026-08-08T02:04:09.887Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "固定四箱规顺序完整且无重复", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6174c56e-c439-411c-b65f-3e709d77f0f1, 2a02bb23-b609-42a0-82b5-9a031a79b08d", + "traceId": "62824a82b80d4592aee21a8d3ba87ebe", + "evidence": "count=4, order=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:04:09.887Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "四箱规默认内径、加边和备注正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6174c56e-c439-411c-b65f-3e709d77f0f1, 2a02bb23-b609-42a0-82b5-9a031a79b08d", + "traceId": "62824a82b80d4592aee21a8d3ba87ebe", + "evidence": "defaults=matched", + "checkedAt": "2026-08-08T02:04:09.887Z" + }, + { + "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=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6174c56e-c439-411c-b65f-3e709d77f0f1, 2a02bb23-b609-42a0-82b5-9a031a79b08d", + "traceId": "62824a82b80d4592aee21a8d3ba87ebe", + "evidence": "groupTenantIdType=string, rows=string/v0,string/v0,string/v0,string/v0", + "checkedAt": "2026-08-08T02:04:09.887Z" + }, + { + "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=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6174c56e-c439-411c-b65f-3e709d77f0f1, 2a02bb23-b609-42a0-82b5-9a031a79b08d", + "traceId": "62824a82b80d4592aee21a8d3ba87ebe", + "evidence": "derivedRows=4", + "checkedAt": "2026-08-08T02:04:09.887Z" + }, + { + "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=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6174c56e-c439-411c-b65f-3e709d77f0f1, 2a02bb23-b609-42a0-82b5-9a031a79b08d", + "traceId": "62824a82b80d4592aee21a8d3ba87ebe", + "evidence": "fields=boxType,innerLengthCm,innerWidthCm,innerHeightCm,edgeAdditionCm,remark,version", + "checkedAt": "2026-08-08T02:04:09.887Z" + }, + { + "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=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39b1d4c3-92a2-428b-8ee7-e59c206d1857, 83fdf02a-71f9-4c92-ab63-2a2e1300d1d7", + "traceId": "f70406c9e2f141baa09415c436ad4692", + "evidence": "rows=4", + "checkedAt": "2026-08-08T02:04:09.928Z" + }, + { + "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=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39b1d4c3-92a2-428b-8ee7-e59c206d1857, 83fdf02a-71f9-4c92-ab63-2a2e1300d1d7", + "traceId": "f70406c9e2f141baa09415c436ad4692", + "evidence": "versions=1,1,1,1", + "checkedAt": "2026-08-08T02:04:09.928Z" + }, + { + "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=2085909899879501825" + }, + "http": 200, + "code": "A0409", + "message": "箱规尺寸配置已被修改,请刷新后重试", + "requestId": "b7036fd5-3f02-4a48-88c1-3c2578c7b89c", + "traceId": "040f01f71d194db79355c9e7ce8e49e8", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:04:09.968Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突后重新查询四条规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dbacbd22-a0a2-492d-bcd6-cfef057aca70, b7d6e5fa-eefc-48d9-a274-c25dc8955b02", + "traceId": "d1af118c10c940a2b5d97c2795d6c886", + "evidence": "", + "checkedAt": "2026-08-08T02:04:09.989Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突请求未造成四行部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dbacbd22-a0a2-492d-bcd6-cfef057aca70, b7d6e5fa-eefc-48d9-a274-c25dc8955b02", + "traceId": "d1af118c10c940a2b5d97c2795d6c886", + "evidence": "unchangedRows=4", + "checkedAt": "2026-08-08T02:04:09.989Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "恢复本轮修改前的四箱规配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4d83aae-dfa8-47ff-b09f-2143af4e9c3b, e9774579-2f98-45e6-9d3b-83760424082c", + "traceId": "34faa4c059d044d19230cf357d808dc7", + "evidence": "restore=original-values", + "checkedAt": "2026-08-08T02:04:10.032Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "尺寸规则恢复后回显与初始值一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4d83aae-dfa8-47ff-b09f-2143af4e9c3b, e9774579-2f98-45e6-9d3b-83760424082c", + "traceId": "34faa4c059d044d19230cf357d808dc7", + "evidence": "restoredRows=4", + "checkedAt": "2026-08-08T02:04:10.032Z" + }, + { + "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-808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4aa4910d-15ee-4ed4-94c5-dfb370aa8eb7, 221d2bf4-4ed1-4b92-bd64-d4217c7c05d6", + "traceId": "69315d30e70946c7b67eeededd0a3ff8", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.064Z" + }, + { + "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-808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4aa4910d-15ee-4ed4-94c5-dfb370aa8eb7, 221d2bf4-4ed1-4b92-bd64-d4217c7c05d6", + "traceId": "69315d30e70946c7b67eeededd0a3ff8", + "evidence": "found=true, missing=none", + "checkedAt": "2026-08-08T02:04:10.064Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e068c15-73f8-40aa-868e-1fffdc1ff3a1, 32e821e9-9c88-417c-8992-5df6c1043b4c", + "traceId": "a7b720d05a5042d39225af9c63097bdc", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.089Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户详情基本信息正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e068c15-73f8-40aa-868e-1fffdc1ff3a1, 32e821e9-9c88-417c-8992-5df6c1043b4c", + "traceId": "a7b720d05a5042d39225af9c63097bdc", + "evidence": "tenantId=2085909899879501825", + "checkedAt": "2026-08-08T02:04:10.089Z" + }, + { + "module": "customers", + "scenario": null, + "name": "编辑客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "58a9e7d8-ecb5-4c9a-b39c-f64ab9d73338, 0469f12d-14c2-4856-acb7-e4c704828813", + "traceId": "e6342d5c1ef145ab9b02fef9d9951e30", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.127Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "58a9e7d8-ecb5-4c9a-b39c-f64ab9d73338, 0469f12d-14c2-4856-acb7-e4c704828813", + "traceId": "e6342d5c1ef145ab9b02fef9d9951e30", + "evidence": "tenantId=2085909899879501825", + "checkedAt": "2026-08-08T02:04:10.127Z" + }, + { + "module": "customers", + "scenario": null, + "name": "回查客户编辑结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f77639c0-7944-4431-a7d7-75dcdbf6811a, ad89887a-b9e4-40ee-9710-d2662096b7f1", + "traceId": "d4da7f9abba94e85a9ffd75fc7237044", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.146Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f77639c0-7944-4431-a7d7-75dcdbf6811a, ad89887a-b9e4-40ee-9710-d2662096b7f1", + "traceId": "d4da7f9abba94e85a9ffd75fc7237044", + "evidence": "tenantId=2085909899879501825", + "checkedAt": "2026-08-08T02:04:10.146Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询资质", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "035499ea-4815-4e1a-ab7d-8b454f859385, 06702beb-4dce-421c-838f-445847d14f0f", + "traceId": "6a4c283f71ab4f019f478a89541c3d9b", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.167Z" + }, + { + "module": "customers", + "scenario": null, + "name": "资质概况结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "035499ea-4815-4e1a-ab7d-8b454f859385, 06702beb-4dce-421c-838f-445847d14f0f", + "traceId": "6a4c283f71ab4f019f478a89541c3d9b", + "evidence": "count=0", + "checkedAt": "2026-08-08T02:04:10.167Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询成员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "117cb057-7f7a-4e52-9f84-4db55aabba5f, 0a687aff-da97-44c7-bec5-80fcfd006b4c", + "traceId": "9be7d2543310439f986f8f6729f73db7", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.201Z" + }, + { + "module": "customers", + "scenario": null, + "name": "待完善客户尚未生成企业管理员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085909899879501825/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "117cb057-7f7a-4e52-9f84-4db55aabba5f, 0a687aff-da97-44c7-bec5-80fcfd006b4c", + "traceId": "9be7d2543310439f986f8f6729f73db7", + "evidence": "members=0", + "checkedAt": "2026-08-08T02:04:10.201Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询运单数量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9a7c571f-9aaf-4e9f-b18a-1f3f1ade4cb3, 94ccda0a-0c7c-4dc4-8282-9c534b882f93", + "traceId": "8fa3bd8851c84716836c24ab2766bd7c", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.225Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况返回当前客户运单数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085909899879501825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9a7c571f-9aaf-4e9f-b18a-1f3f1ade4cb3, 94ccda0a-0c7c-4dc4-8282-9c534b882f93", + "traceId": "8fa3bd8851c84716836c24ab2766bd7c", + "evidence": "orderCount=0", + "checkedAt": "2026-08-08T02:04:10.225Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户运单记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085909899879501825&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b23896ca-2b64-4ac1-9c4c-10a50fd8aa31, 1fc85b27-a2c8-40cf-b757-ff8141db6b6b", + "traceId": "5cc5035142074d1abaeb75c15662f357", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.262Z" + }, + { + "module": "customers", + "scenario": null, + "name": "运单记录分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085909899879501825&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b23896ca-2b64-4ac1-9c4c-10a50fd8aa31, 1fc85b27-a2c8-40cf-b757-ff8141db6b6b", + "traceId": "5cc5035142074d1abaeb75c15662f357", + "evidence": "records=0, total=0", + "checkedAt": "2026-08-08T02:04:10.262Z" + }, + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "归档测试客户", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085909899879501825/archive" + }, + "http": 200, + "code": "S0500", + "message": "Internal server error", + "requestId": "52154918-874c-48d3-9edf-566345fdbe86", + "traceId": "5bd5753c912f49119675a64088355551", + "evidence": "tenantId=2085909899879501825", + "checkedAt": "2026-08-08T02:04:10.295Z" + }, + { + "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": "6411dbde-9988-42e7-b7bb-4cfb2a7bc628, ca4a6b5d-573c-4315-a37f-d5a8bb19190e", + "traceId": "1c72b37df89540c4b6169aff08edf47d", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.336Z" + }, + { + "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": "6411dbde-9988-42e7-b7bb-4cfb2a7bc628, ca4a6b5d-573c-4315-a37f-d5a8bb19190e", + "traceId": "1c72b37df89540c4b6169aff08edf47d", + "evidence": "count=117", + "checkedAt": "2026-08-08T02:04:10.336Z" + }, + { + "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": "54e20e00-5ed1-4e89-9d26-c9ce300e9e04, 3d069df7-b55c-437b-a99b-9dc9e701d03c", + "traceId": "ef42cde4b1804550a8995567c1526ef8", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.374Z" + }, + { + "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": "54e20e00-5ed1-4e89-9d26-c9ce300e9e04, 3d069df7-b55c-437b-a99b-9dc9e701d03c", + "traceId": "ef42cde4b1804550a8995567c1526ef8", + "evidence": "permissionId=2085909902056345602", + "checkedAt": "2026-08-08T02:04:10.374Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑自定义权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085909902056345602" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "190745d6-e9e7-4b58-a76a-3e8736ac2369, 1f860afd-abec-4b20-8a2c-ff7e89eede98", + "traceId": "0bb55187ca1b4f188ed6231de4a516ef", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.407Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085909902056345602" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "190745d6-e9e7-4b58-a76a-3e8736ac2369, 1f860afd-abec-4b20-8a2c-ff7e89eede98", + "traceId": "0bb55187ca1b4f188ed6231de4a516ef", + "evidence": "permissionId=2085909902056345602", + "checkedAt": "2026-08-08T02:04:10.407Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085909902056345602/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1506c881-ed4d-4a77-8d0c-9f10c5fe61a0, 6295267d-c9e9-4c3e-8953-fe25c2b25b14", + "traceId": "1ccc6559aca84fad9dda1f6fbb89104f", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.437Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085909902056345602/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1506c881-ed4d-4a77-8d0c-9f10c5fe61a0, 6295267d-c9e9-4c3e-8953-fe25c2b25b14", + "traceId": "1ccc6559aca84fad9dda1f6fbb89104f", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:04:10.437Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085909902056345602/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fbf15e33-b88e-48ad-a27f-c06c264f424b, 03e0a057-742f-4797-be3f-b9b8815969d0", + "traceId": "7e761a9b1ff746aca1f03629d1d531c6", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.470Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085909902056345602/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fbf15e33-b88e-48ad-a27f-c06c264f424b, 03e0a057-742f-4797-be3f-b9b8815969d0", + "traceId": "7e761a9b1ff746aca1f03629d1d531c6", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T02:04:10.470Z" + }, + { + "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": "7bc6dc91-cb8d-4a8c-b6f1-59eb17cda56e, 468c4bf5-7f24-4abb-bbc1-607d31156d7a", + "traceId": "bffd17bec7674be5b90efad0fff68561", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.505Z" + }, + { + "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": "7bc6dc91-cb8d-4a8c-b6f1-59eb17cda56e, 468c4bf5-7f24-4abb-bbc1-607d31156d7a", + "traceId": "bffd17bec7674be5b90efad0fff68561", + "evidence": "roleId=2085909902568050690", + "checkedAt": "2026-08-08T02:04:10.505Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2812ec4c-0afc-4378-bed4-ee1a52cbcdfd, 9623c26f-b87a-4be8-87a4-38e775a9e26f", + "traceId": "dc7e6b31f14a4a8c9c937ecc1744586c", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.545Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2812ec4c-0afc-4378-bed4-ee1a52cbcdfd, 9623c26f-b87a-4be8-87a4-38e775a9e26f", + "traceId": "dc7e6b31f14a4a8c9c937ecc1744586c", + "evidence": "roleId=2085909902568050690", + "checkedAt": "2026-08-08T02:04:10.545Z" + }, + { + "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": "3d5d92aa-60e2-4921-8588-49d8d8ef93f2, 8aae7c72-25bc-4a5f-be5b-d81628109e32", + "traceId": "8b82bf0f0cb044aa91f4082fb4e4e263", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.571Z" + }, + { + "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": "e53add4f-7336-4a1a-9ee5-f03ebad6bef2, 2d32636e-561a-413b-81d0-81d497434f9b", + "traceId": "6ab50a39af0c4e59985bd8ec9e597dd1", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.616Z" + }, + { + "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": "e53add4f-7336-4a1a-9ee5-f03ebad6bef2, 2d32636e-561a-413b-81d0-81d497434f9b", + "traceId": "6ab50a39af0c4e59985bd8ec9e597dd1", + "evidence": "permissionIds=2085909902056345602", + "checkedAt": "2026-08-08T02:04:10.616Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "94451cfc-f5e7-486e-be44-a002b70f52a1, 26dbbd30-2d75-413b-92b6-ec7a3f0c4653", + "traceId": "bf26abf3880a4d888ce4b112ab94523b", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.642Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "94451cfc-f5e7-486e-be44-a002b70f52a1, 26dbbd30-2d75-413b-92b6-ec7a3f0c4653", + "traceId": "bf26abf3880a4d888ce4b112ab94523b", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:04:10.642Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "67abcc3a-d562-40ab-8fe7-f732e5129c32, 32ac51d1-a525-4043-96df-e0f85366d909", + "traceId": "6480182703c74bb0ab9cde06ff306eb8", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.670Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "67abcc3a-d562-40ab-8fe7-f732e5129c32, 32ac51d1-a525-4043-96df-e0f85366d909", + "traceId": "6480182703c74bb0ab9cde06ff306eb8", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T02:04:10.670Z" + }, + { + "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": "a2997c9f-a885-4fce-84d0-6a9af466f69c, 096ce0d4-0fd4-41fe-a876-041a8849e2b1", + "traceId": "d0ff4b4277614b089ca0160185bc1a82", + "evidence": "", + "checkedAt": "2026-08-08T02:04:10.696Z" + }, + { + "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": "a2997c9f-a885-4fce-84d0-6a9af466f69c, 096ce0d4-0fd4-41fe-a876-041a8849e2b1", + "traceId": "d0ff4b4277614b089ca0160185bc1a82", + "evidence": "tenants=1, roles=8", + "checkedAt": "2026-08-08T02:04:10.696Z" + }, + { + "module": "system", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16154650696" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "830406cf-daad-44fc-a474-9ea617ad99f8, 3c2b704f-c6c2-4177-9388-2f2330ed7499", + "traceId": "ed4042e607634d64b8072907ec98b81e", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T02:04:10.730Z" + }, + { + "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": "461b317c-2484-4cb6-8ef3-7979ed95a4f6, 28144841-62a9-4345-b2d0-f876f7d08e07", + "traceId": "5d1e9ea3367c469c9b97a421a0a696fe", + "evidence": "", + "checkedAt": "2026-08-08T02:04:11.081Z" + }, + { + "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": "461b317c-2484-4cb6-8ef3-7979ed95a4f6, 28144841-62a9-4345-b2d0-f876f7d08e07", + "traceId": "5d1e9ea3367c469c9b97a421a0a696fe", + "evidence": "membershipId=2085909903704707075", + "checkedAt": "2026-08-08T02:04:11.081Z" + }, + { + "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_808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6e089952-4254-4746-8ae5-d27cb843037a, 67fb459d-3454-4f78-ac27-f9dec46cccd4", + "traceId": "c0eaf5d56e5c4b21a95234cb6e47f465", + "evidence": "", + "checkedAt": "2026-08-08T02:04:11.109Z" + }, + { + "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_808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6e089952-4254-4746-8ae5-d27cb843037a, 67fb459d-3454-4f78-ac27-f9dec46cccd4", + "traceId": "c0eaf5d56e5c4b21a95234cb6e47f465", + "evidence": "records=1, missing=none, lastLoginAt=omitted", + "checkedAt": "2026-08-08T02:04:11.110Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085909903704707075" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1e70f5ef-1f3a-4f76-bc9a-ef78b1c56eeb, 9624d112-e6d7-4af1-a3de-cb9aaa93d7f4", + "traceId": "5fe0b4a14a404cf7bda4deebe9ec1ce0", + "evidence": "", + "checkedAt": "2026-08-08T02:04:11.206Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085909903704707075" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1e70f5ef-1f3a-4f76-bc9a-ef78b1c56eeb, 9624d112-e6d7-4af1-a3de-cb9aaa93d7f4", + "traceId": "5fe0b4a14a404cf7bda4deebe9ec1ce0", + "evidence": "membershipId=2085909903704707075", + "checkedAt": "2026-08-08T02:04:11.207Z" + }, + { + "module": "system", + "scenario": null, + "name": "新建内部用户可使用初始密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6982b930-341a-4d60-9d93-fc0ca1fca72a, 5ea4c32d-b079-4b77-b7af-0872a3fac224", + "traceId": "97cf9a9f79a741a3a3c9641bf4d5d406", + "evidence": "username=admin_accept_808020409413", + "checkedAt": "2026-08-08T02:04:11.545Z" + }, + { + "module": "system", + "scenario": null, + "name": "重置平台内部用户密码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085909903704707075/password" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eed3cf54-eb3f-4529-a040-84ca01147028, de4865f8-1b29-4e1f-aea7-26cf72ae2d7a", + "traceId": "7126a27d9c0a47ec8723ef04faa705c0", + "evidence": "", + "checkedAt": "2026-08-08T02:04:11.927Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户使用重置密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e3907f59-acb4-42e5-bd24-2df4b358025c, 963e6b7f-04e4-4935-bca0-c6376f2ee1fe", + "traceId": "54344f04ba9941d5bc05ac5ddccd2cdb", + "evidence": "username=admin_accept_808020409413", + "checkedAt": "2026-08-08T02:04:12.258Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085909903704707075/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "81903fbf-71b2-4e10-8ace-1c930b218caa, 7d5ba0b4-ab27-42a8-80ed-927be46e4e8a", + "traceId": "cc4b937d387940efb4ccf06626864ce7", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.374Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户停用状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085909903704707075/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "81903fbf-71b2-4e10-8ace-1c930b218caa, 7d5ba0b4-ab27-42a8-80ed-927be46e4e8a", + "traceId": "cc4b937d387940efb4ccf06626864ce7", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:04:12.374Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用用户禁止登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "c9f33d2e-f62f-428c-99d0-7fa31b7c42f9", + "traceId": "69433422bee14f8c958b6a69628ebb2b", + "evidence": "HTTP=200, code=A0403", + "checkedAt": "2026-08-08T02:04:12.399Z" + }, + { + "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": "959f2b8e-552a-4688-8d51-14d411c2e2fc, 918a37c4-15ae-4ac2-b64f-db0fbd0cfe14", + "traceId": "1c7cbebd818146a499b4730b9041254b", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.437Z" + }, + { + "module": "system", + "scenario": "system-role-protection", + "name": "已分配成员的角色禁止删除", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/roles/2085909902568050690" + }, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "0609b085-c944-4ede-bb3f-8886e36950f3", + "traceId": "6c40889007664c30bb19d860792236e8", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:04:12.469Z" + }, + { + "module": "system", + "scenario": null, + "name": "清理时停用测试角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5f60dbe1-841b-4b2d-a202-e1be784d5829, f7a0fd30-a99e-459a-bbae-57f6088c7e0c", + "traceId": "ab2ef1da4e304733b4a6ef58171d70d5", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.502Z" + }, + { + "module": "system", + "scenario": null, + "name": "保留测试角色处于停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085909902568050690/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5f60dbe1-841b-4b2d-a202-e1be784d5829, f7a0fd30-a99e-459a-bbae-57f6088c7e0c", + "traceId": "ab2ef1da4e304733b4a6ef58171d70d5", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:04:12.502Z" + }, + { + "module": "system", + "scenario": null, + "name": "删除临时权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/permissions/2085909902056345602" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2a5f0d12-dfea-4082-8b9e-5a7f2b82dec7, 0da33add-d137-423e-b58e-2b6b671f7291", + "traceId": "39ce253268f84ce0a573aaca8f9ff1c0", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.570Z" + }, + { + "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": "151778b3-ec96-4534-97e5-1b3941389658, 194ff872-026b-4533-8160-abe29b1abf75", + "traceId": "48d7f0a0a89e45eb9e0a7a77ff7373cf", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.620Z" + }, + { + "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": "151778b3-ec96-4534-97e5-1b3941389658, 194ff872-026b-4533-8160-abe29b1abf75", + "traceId": "48d7f0a0a89e45eb9e0a7a77ff7373cf", + "evidence": "total=267", + "checkedAt": "2026-08-08T02:04:12.620Z" + }, + { + "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": "aad77c38-9d2a-4f18-bb72-87aaf17fb44d, 7567887c-2673-4108-a3fe-190c4f32af3c", + "traceId": "f7942718fb4547478cd95eeb074ff993", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.661Z" + }, + { + "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": "aad77c38-9d2a-4f18-bb72-87aaf17fb44d, 7567887c-2673-4108-a3fe-190c4f32af3c", + "traceId": "f7942718fb4547478cd95eeb074ff993", + "evidence": "warehouseId=2085909911633444865", + "checkedAt": "2026-08-08T02:04:12.661Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询平台仓库详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085909911633444865?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7a4777e6-adab-4cde-8cbd-7227a57f344f, 26235a08-b65d-455f-8078-99b7486c0060", + "traceId": "35c1b6a69f1a4d48a0a6edc0d084a1e4", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.698Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库详情、地址和能力正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085909911633444865?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7a4777e6-adab-4cde-8cbd-7227a57f344f, 26235a08-b65d-455f-8078-99b7486c0060", + "traceId": "35c1b6a69f1a4d48a0a6edc0d084a1e4", + "evidence": "addresses=1, capabilities=1", + "checkedAt": "2026-08-08T02:04:12.698Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/warehouse-admin/2085909911633444865?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7c5fad52-71cf-41bd-9e37-46df1e6de8b1, 0fe463d0-f7a4-4675-ac67-0323a0ef0d4d", + "traceId": "0d6a5292384e4ea08e473ebfaad4c446", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.738Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085909911633444865?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c69f344-fe18-45e9-9689-990e9f28988f, 5dc831d0-e71c-4416-9ab4-28ead6e2985d", + "traceId": "7f02b004afac491a93837c579b05af42", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.777Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085909911633444865?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c69f344-fe18-45e9-9689-990e9f28988f, 5dc831d0-e71c-4416-9ab4-28ead6e2985d", + "traceId": "7f02b004afac491a93837c579b05af42", + "evidence": "warehouseId=2085909911633444865", + "checkedAt": "2026-08-08T02:04:12.777Z" + }, + { + "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": "ade89865-2c32-4dc9-86b5-62e42d6fd703, 947ba693-c172-4762-8776-f57dc2bee8f6", + "traceId": "548de2945c084a68a8fee095c151fa42", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.813Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询库位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085909912291950594?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "012f9ce0-b1b3-48fb-b66b-0fa0acc49f41, 215006a6-71e8-4161-a67e-2ad24293c076", + "traceId": "cf6b809161654887ade1072f7b82c635", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.839Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085909912291950594?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "012f9ce0-b1b3-48fb-b66b-0fa0acc49f41, 215006a6-71e8-4161-a67e-2ad24293c076", + "traceId": "cf6b809161654887ade1072f7b82c635", + "evidence": "locationId=2085909912291950594", + "checkedAt": "2026-08-08T02:04:12.839Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/locations/2085909912291950594?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c165b01b-ccb7-41bf-85fc-ae3badbfab11, c4531cda-a6a7-4ef7-bec1-5cf00b3f3d00", + "traceId": "b5ace9b5e52e4f19a17ba665b3096c65", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.869Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085909912291950594?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2b99dd23-760d-451c-8929-b9c5188c4352, 826afe82-094a-48c6-a611-4744c52f37ac", + "traceId": "0d399e5af5b54e56ad1d86149f4daf9e", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.901Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位编辑与版本递增正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085909912291950594?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2b99dd23-760d-451c-8929-b9c5188c4352, 826afe82-094a-48c6-a611-4744c52f37ac", + "traceId": "0d399e5af5b54e56ad1d86149f4daf9e", + "evidence": "version=1", + "checkedAt": "2026-08-08T02:04:12.901Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/locations/2085909912291950594/status?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9ce78837-0fc3-4ceb-ab93-4f50f3feea0f, 060954cf-89c4-4421-b652-a961a18f693e", + "traceId": "e24a040a562b4ffaa2a672489d8008a1", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.937Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未占用测试库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/locations/2085909912291950594?tenantId=0&warehouseId=2085909911633444865&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a2146654-ef55-4138-adb9-70508549d3d8, 66c7f18f-1d38-4382-bc70-0ec2018d8b1b", + "traceId": "066874d3231648c29320e65ab6d6fcfc", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.969Z" + }, + { + "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": "0813f5e6-745b-4a95-8d54-29d492b0fd50, 62f12c8d-8890-4467-88cd-4aa0b95cb2ef", + "traceId": "543169e0764a422599ee80c8c146cab8", + "evidence": "", + "checkedAt": "2026-08-08T02:04:12.998Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询托盘详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085909913072091137?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88a44663-ec40-4a9a-b5c4-a0551dd4c974, 2ca63b32-0dbc-4c43-a4c4-12b5c6fdaf6d", + "traceId": "c51fec18ed0544afbafc1c48aa9f59e1", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.020Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085909913072091137?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88a44663-ec40-4a9a-b5c4-a0551dd4c974, 2ca63b32-0dbc-4c43-a4c4-12b5c6fdaf6d", + "traceId": "c51fec18ed0544afbafc1c48aa9f59e1", + "evidence": "palletId=2085909913072091137", + "checkedAt": "2026-08-08T02:04:13.020Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/pallets/2085909913072091137?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "37b65609-5094-448b-bb40-8842f2583f1d, 2a07747f-8587-4bfc-a33f-c00b73decfbd", + "traceId": "65c2bbc91ded4a55ba2cc4288053a327", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.060Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085909913072091137?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "acd6f7d2-1485-42dc-84ef-ba9c15b3a5b1, a7808fac-0d52-4878-8a24-a095bef3e0a1", + "traceId": "d64ce83a561e46a8b5265ba48bb9a687", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.084Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085909913072091137?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "acd6f7d2-1485-42dc-84ef-ba9c15b3a5b1, a7808fac-0d52-4878-8a24-a095bef3e0a1", + "traceId": "d64ce83a561e46a8b5265ba48bb9a687", + "evidence": "palletId=2085909913072091137", + "checkedAt": "2026-08-08T02:04:13.084Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未使用测试托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/pallets/2085909913072091137?tenantId=0&warehouseId=2085909911633444865" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2537ef8d-7b0a-41bd-ad77-0da144bd4258, d354814e-bca2-413f-9702-3348717a2c3e", + "traceId": "9f4ed4c5f88f4a1088eae25699b78332", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.120Z" + }, + { + "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": "d92a764b-6270-423c-9675-e66b0998b199, 7437f054-81af-4f8b-aa0a-5f1b8ff8cda4", + "traceId": "a2263d8b3f5d4862b7e38ad719eebbd5", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.153Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询快递公司详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085909913718013953?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3f38ab2b-f581-46c8-bf92-af9c813db140, 5e5085f0-4a98-4696-8553-27184e4a6d39", + "traceId": "60527c6a8b2d43d98c7c5c18a758a9d8", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.177Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085909913718013953?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3f38ab2b-f581-46c8-bf92-af9c813db140, 5e5085f0-4a98-4696-8553-27184e4a6d39", + "traceId": "60527c6a8b2d43d98c7c5c18a758a9d8", + "evidence": "expressId=2085909913718013953", + "checkedAt": "2026-08-08T02:04:13.177Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/express-companies/2085909913718013953?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9c801401-065a-46ed-af88-f27f097e9037, 5211d64f-77d0-4b28-befc-a5bc0655c126", + "traceId": "aa83b5c8902d40769a964d80feeffd5e", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.215Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/express-companies/2085909913718013953/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a14648a3-3f16-4daf-b225-02666326014c, 430db156-0210-4716-a776-182900aa911a", + "traceId": "df75bc4c26554197a16ab8a1508a7bbb", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.246Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选快递公司列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98b17a86-5c56-42ff-97a5-f53abac8725f, 12dccb6a-bbb5-442d-9bd8-68260cb130f2", + "traceId": "3cfc5795b7ad4b06a9eda7369c0a8738", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.272Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司列表回显停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98b17a86-5c56-42ff-97a5-f53abac8725f, 12dccb6a-bbb5-442d-9bd8-68260cb130f2", + "traceId": "3cfc5795b7ad4b06a9eda7369c0a8738", + "evidence": "records=1", + "checkedAt": "2026-08-08T02:04:13.272Z" + }, + { + "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": "d54ff26e-3c52-4762-b943-590c4cdf39f7, 193831d1-a834-498d-8dfd-50af3192ba0e", + "traceId": "4bdfa9f6392a4dc0a1baef6f9454e3e3", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.308Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询往来单位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085909914363936769?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a4f5c08f-58ca-488e-8f06-6a09e1f740ea, 282223b6-17de-4563-a30d-0595d528894e", + "traceId": "7a7c918a2d7b4de9853cf85a46263d84", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.333Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085909914363936769?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a4f5c08f-58ca-488e-8f06-6a09e1f740ea, 282223b6-17de-4563-a30d-0595d528894e", + "traceId": "7a7c918a2d7b4de9853cf85a46263d84", + "evidence": "partnerId=2085909914363936769", + "checkedAt": "2026-08-08T02:04:13.333Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/partners/2085909914363936769?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9acb0007-030c-4777-ae10-b20957b838d4, a736759f-abdb-4515-b32a-67be0b6b39ad", + "traceId": "c3c20142f66a492b8cc6c7d446738113", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.373Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/partners/2085909914363936769/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "74e44cc4-d292-42d5-ab83-e45c4d2c8a33, 5ea98a45-af72-4251-947e-730631d16f44", + "traceId": "ef4e4cd5c8f6435c96a8ff33e615f0ee", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.407Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选往来单位列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a700c72c-d76b-4eca-bf95-80e0888720fc, ab49798b-4c84-4d0c-94a6-21032ec62e2a", + "traceId": "99b225a0c7a84894b88a788804afae95", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.451Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位列表回显编辑与停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808020409413" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a700c72c-d76b-4eca-bf95-80e0888720fc, ab49798b-4c84-4d0c-94a6-21032ec62e2a", + "traceId": "99b225a0c7a84894b88a788804afae95", + "evidence": "records=1", + "checkedAt": "2026-08-08T02:04:13.451Z" + }, + { + "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": "6325165d-0d1d-43a4-8a9a-35795dbf981e, edc77d4b-a0d9-4512-b8f7-e2b95657dfac", + "traceId": "6e74d562acf543bc89db5a577f0a062c", + "evidence": "bytes=3852, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:04:13.493Z" + }, + { + "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": "0893fdf2-1dff-42a3-af29-37146c926160, 6e30434c-fe37-4dc2-9a07-f7d2b2a9b511", + "traceId": "c1dfc2c96f29480fa208c900faaeb865", + "evidence": "bytes=3691, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:04:13.558Z" + }, + { + "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": "82c5f9ac-7dc6-4625-8177-6c66d747996b, b6754457-7408-4b2f-b412-591b64a3bdd9", + "traceId": "778a82bab22a4bdcb30f1f63a509a1a0", + "evidence": "bytes=3829, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:04:13.597Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用测试仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/warehouse-admin/2085909911633444865/status?tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "78c2f9f1-8c3a-4a9d-ba05-825792382859, 504bcf61-23ca-423e-9f1f-8a4369583e31", + "traceId": "4d2404d2409b42f7b87f502e51453113", + "evidence": "", + "checkedAt": "2026-08-08T02:04:13.634Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3fcd04ae-2ca1-430e-bbfe-9a9f0a52a06f, 80c68ce3-4b09-40df-a077-9a3e2f78853d", + "traceId": "1a968e4b879549a293396f9fd7db621e", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:04:13.970Z" + }, + { + "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": "ea748c53-e4e5-451e-bc44-c35fa1c14263, 02124627-2c07-4486-ae6a-148675fe06b9", + "traceId": "0602e9852ea6463fad89963e91af6117", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.003Z" + }, + { + "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": "ea748c53-e4e5-451e-bc44-c35fa1c14263, 02124627-2c07-4486-ae6a-148675fe06b9", + "traceId": "0602e9852ea6463fad89963e91af6117", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:04:14.003Z" + }, + { + "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": "7d63372e-b76d-4b28-8976-c8e35cef30ea, a43f41b0-63dd-4512-bd13-43f7f8c2d498", + "traceId": "68fe17a69fd94277b6f53bd15a881285", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:04:14.035Z" + }, + { + "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": "7d63372e-b76d-4b28-8976-c8e35cef30ea, a43f41b0-63dd-4512-bd13-43f7f8c2d498", + "traceId": "68fe17a69fd94277b6f53bd15a881285", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:04:14.035Z" + }, + { + "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": "14a968bc-9dd7-4c04-8360-7ac8fcc0d3d5, d9fa2109-5029-4fa6-bcac-2ce4302c4a4a", + "traceId": "029e8f827dfa46398a74d894c2daf64b", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.066Z" + }, + { + "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": "14a968bc-9dd7-4c04-8360-7ac8fcc0d3d5, d9fa2109-5029-4fa6-bcac-2ce4302c4a4a", + "traceId": "029e8f827dfa46398a74d894c2daf64b", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:04:14.066Z" + }, + { + "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": "71f15fc6-0748-460d-acac-71f56d6159c0, 9ac25a4f-1e1c-4607-bb13-b29fefdf3fc8", + "traceId": "25c210c7e57043bcb26f79d150868f0e", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.121Z" + }, + { + "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": "71f15fc6-0748-460d-acac-71f56d6159c0, 9ac25a4f-1e1c-4607-bb13-b29fefdf3fc8", + "traceId": "25c210c7e57043bcb26f79d150868f0e", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:04:14.121Z" + }, + { + "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": "2ca88b45-2013-4180-961b-ce10a3d81f97, 84bed524-abb5-451e-8096-5d1114e24891", + "traceId": "db02cdd6e5fc4b908b226392c81b0163", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.156Z" + }, + { + "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": "2ca88b45-2013-4180-961b-ce10a3d81f97, 84bed524-abb5-451e-8096-5d1114e24891", + "traceId": "db02cdd6e5fc4b908b226392c81b0163", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:04:14.156Z" + }, + { + "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": "66be9678-79d3-4155-99d7-41871dd5d37a, 10d84172-f0b9-4588-a842-c0e52936eba1", + "traceId": "dfb568acbd6142c6abec66b0c2337931", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.190Z" + }, + { + "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": "bc477820-bc23-4f8b-b330-0a1f10fbaf36, 572085a2-f10b-4a1b-8fd7-c89fa6227548", + "traceId": "cf8b7712ce3d4e96b29f7b13cae85dcb", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:04:14.216Z" + }, + { + "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": "bc477820-bc23-4f8b-b330-0a1f10fbaf36, 572085a2-f10b-4a1b-8fd7-c89fa6227548", + "traceId": "cf8b7712ce3d4e96b29f7b13cae85dcb", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:04:14.216Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085909918180245505" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "e0471fed-37e4-446a-a71f-a46f7e4f6187, 887ca22a-26d3-43a1-be62-ebc313e2303c", + "traceId": "2a2d37ea37324de5bdacd893c1389149", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:04:14.237Z" + }, + { + "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": "3cf4cd07-c729-463f-8ede-eadf3875c441, 24d359ea-1e66-4293-8d7c-5707e8feae58", + "traceId": "57988d7ec9134285a11cebf505fc7df3", + "evidence": "marker=ADMIN-API-20260808020409413", + "checkedAt": "2026-08-08T02:04:14.306Z" + }, + { + "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": "bb066882-cbdc-4bbc-9892-e51863d9ffff, 56b37c5d-5b9d-4f6f-aaf2-088bdb26d27a", + "traceId": "5eff983fadbd462591993704f333d131", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.331Z" + }, + { + "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": "bb066882-cbdc-4bbc-9892-e51863d9ffff, 56b37c5d-5b9d-4f6f-aaf2-088bdb26d27a", + "traceId": "5eff983fadbd462591993704f333d131", + "evidence": "orderId=2085909918519984129, replayedId=2085909918519984129", + "checkedAt": "2026-08-08T02:04:14.331Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909918519984129" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0a04642-28f3-46c0-8ec3-67781e00dc0a, 9611b648-6f83-4fe0-9df5-4e05b77efaa0", + "traceId": "dc2177cb6ada40f093404ddd2c0b6d0e", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.361Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909918519984129" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0a04642-28f3-46c0-8ec3-67781e00dc0a, 9611b648-6f83-4fe0-9df5-4e05b77efaa0", + "traceId": "dc2177cb6ada40f093404ddd2c0b6d0e", + "evidence": "orderNo=FL2085909918519984129, status=DRAFT", + "checkedAt": "2026-08-08T02:04:14.361Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909918519984129" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0a04642-28f3-46c0-8ec3-67781e00dc0a, 9611b648-6f83-4fe0-9df5-4e05b77efaa0", + "traceId": "dc2177cb6ada40f093404ddd2c0b6d0e", + "evidence": "cargoes=4, imageFileId=2085909918180245505", + "checkedAt": "2026-08-08T02:04:14.361Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085909918519984129/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "289b60b1-5bdd-4c55-a795-eef3a8566341, 55265cd7-af6e-4ac0-be71-dcc83e6c816d", + "traceId": "5f9ced8d846b4d2d8f653c3a6fa42bdf", + "evidence": "orderId=2085909918519984129", + "checkedAt": "2026-08-08T02:04:14.430Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909918519984129" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d62f6fcf-2cca-4325-b97c-b84264ae4e09, 4238229e-18b5-40a1-aa75-13a694a40add", + "traceId": "2789f10dd0664d06ac7c169c9fd818cf", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.460Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085909918519984129" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d62f6fcf-2cca-4325-b97c-b84264ae4e09, 4238229e-18b5-40a1-aa75-13a694a40add", + "traceId": "2789f10dd0664d06ac7c169c9fd818cf", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:04:14.460Z" + }, + { + "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=FL2085909918519984129" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "59bce3ac-137e-4dd8-96f5-eb4bac97d564, 4933803a-8409-4420-9b20-389564cd1c60", + "traceId": "600c7e5b399642ceaad20a57f2ce9e1b", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.491Z" + }, + { + "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=FL2085909918519984129" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "59bce3ac-137e-4dd8-96f5-eb4bac97d564, 4933803a-8409-4420-9b20-389564cd1c60", + "traceId": "600c7e5b399642ceaad20a57f2ce9e1b", + "evidence": "orderId=2085909918519984129, found=true", + "checkedAt": "2026-08-08T02:04:14.491Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "122e5c21-5343-4391-8f30-b034bdd107b9, 4efd2497-afe2-4eda-ac21-cea19245bf35", + "traceId": "9e10086536074b5a895853e48c0133ae", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.516Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "122e5c21-5343-4391-8f30-b034bdd107b9, 4efd2497-afe2-4eda-ac21-cea19245bf35", + "traceId": "9e10086536074b5a895853e48c0133ae", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:04:14.517Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085909918519984129&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bbea850d-7ecd-4681-a74e-a5ba88cc026c, 9debe224-3dea-45cb-bb2c-804382b347d9", + "traceId": "6ec849506a914fd9af6098799c1fc2fe", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.550Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085909918519984129&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bbea850d-7ecd-4681-a74e-a5ba88cc026c, 9debe224-3dea-45cb-bb2c-804382b347d9", + "traceId": "6ec849506a914fd9af6098799c1fc2fe", + "evidence": "orderId=2085909918519984129, found=true", + "checkedAt": "2026-08-08T02:04:14.550Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "141f204e-d5a2-4a8f-bd8f-73cef62fc3e0, 17b0f0b8-c879-4d31-9e73-ae7d82f8fed5", + "traceId": "a4313e382e78454fb7955a039a3a8231", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.580Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "141f204e-d5a2-4a8f-bd8f-73cef62fc3e0, 17b0f0b8-c879-4d31-9e73-ae7d82f8fed5", + "traceId": "a4313e382e78454fb7955a039a3a8231", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:04:14.580Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "141f204e-d5a2-4a8f-bd8f-73cef62fc3e0, 17b0f0b8-c879-4d31-9e73-ae7d82f8fed5", + "traceId": "a4313e382e78454fb7955a039a3a8231", + "evidence": "cargoes=4, imageFileId=2085909918180245505", + "checkedAt": "2026-08-08T02:04:14.580Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1c1b0c68-561c-4414-a53a-e42b8aa8f38c, 594ae28d-6bd6-410b-8b86-289fc17a4092", + "traceId": "0d481c1462ee4f3798e8fe8b2e011494", + "evidence": "", + "checkedAt": "2026-08-08T02:04:14.615Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bb6998e7-0bfd-4646-b575-243c11a28051, b0f3c380-2e02-4b3f-886b-e1acfe21fb72", + "traceId": "fd9f38999aa743d5a74acb1a08c0fa99", + "evidence": "orderId=2085909918519984129", + "checkedAt": "2026-08-08T02:04:14.646Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8b42a04d-718f-44fc-94a5-b10751096d6a, 22f57c8d-bf13-4bcb-a7fe-d87d58c36730", + "traceId": "774cbc5e852849e79d2697fb869e7f74", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:15.728Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909922162716673?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "00d2d9e4-a161-4d15-9b3f-2432b2796501, 643cdd0a-5022-4154-a2f3-450a46715b85", + "traceId": "6cc1a931863b43ecbeda08fd8d4587b8", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:15.764Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909922162716673?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "00d2d9e4-a161-4d15-9b3f-2432b2796501, 643cdd0a-5022-4154-a2f3-450a46715b85", + "traceId": "6cc1a931863b43ecbeda08fd8d4587b8", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:04:15.764Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909922162716673?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "00d2d9e4-a161-4d15-9b3f-2432b2796501, 643cdd0a-5022-4154-a2f3-450a46715b85", + "traceId": "6cc1a931863b43ecbeda08fd8d4587b8", + "evidence": "inboundId=2085909922162716673, history=1", + "checkedAt": "2026-08-08T02:04:15.765Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085909918519984129&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ab64b4f9-44db-4494-8717-9e6411dcf13a, 64fd3b69-3a03-4a1a-9f2f-b9337b7ccf92", + "traceId": "847a306ee4d843daa5334e998e8e96bb", + "evidence": "", + "checkedAt": "2026-08-08T02:04:15.799Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085909918519984129&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ab64b4f9-44db-4494-8717-9e6411dcf13a, 64fd3b69-3a03-4a1a-9f2f-b9337b7ccf92", + "traceId": "847a306ee4d843daa5334e998e8e96bb", + "evidence": "inboundId=2085909922162716673, total=1", + "checkedAt": "2026-08-08T02:04:15.799Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "81bd27d3-e4a0-4801-8e39-2792194104d4", + "traceId": "950b2e3102c947829efdee63dab80a1c", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:04:15.825Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "81bd27d3-e4a0-4801-8e39-2792194104d4", + "traceId": "950b2e3102c947829efdee63dab80a1c", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:04:15.825Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1848b88a-64b8-46b8-8c6f-b43bf5b2d735, 0389d977-b5fd-41f3-b580-7ebe01aa076e", + "traceId": "6284abc9b2ff4a0b9e85f52e5bad0a44", + "evidence": "", + "checkedAt": "2026-08-08T02:04:15.867Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a563d1b5-2069-4307-af14-2923e3eb1f69, 6174609d-24c7-432d-afcd-93a0fb05769d", + "traceId": "40bd1b63f1db451487c76ceb325b9fa3", + "evidence": "", + "checkedAt": "2026-08-08T02:04:15.911Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ac97879f-1a39-4647-afcc-f84dedf19871, cad9c624-c012-4d40-837e-c753fa5d84db", + "traceId": "9112372d1040448981e63eff00a31afc", + "evidence": "", + "checkedAt": "2026-08-08T02:04:15.936Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085909918519984129?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ac97879f-1a39-4647-afcc-f84dedf19871, cad9c624-c012-4d40-837e-c753fa5d84db", + "traceId": "9112372d1040448981e63eff00a31afc", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:04:15.936Z" + }, + { + "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": "582c27da-cc2e-4174-afba-5afe62e317cd, f9c65f62-5408-4133-82bb-fe9871698e99", + "traceId": "b834ffadb1ed48188c39bcdb88e8cb22", + "evidence": "", + "checkedAt": "2026-08-08T02:04:15.963Z" + }, + { + "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": "582c27da-cc2e-4174-afba-5afe62e317cd, f9c65f62-5408-4133-82bb-fe9871698e99", + "traceId": "b834ffadb1ed48188c39bcdb88e8cb22", + "evidence": "versions=8, active=1", + "checkedAt": "2026-08-08T02:04:15.964Z" + }, + { + "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-20260808020409413-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T02:04:15.966Z" + }, + { + "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": "6c0fe65a-48c9-401e-800c-dca4e5b5ee74, 775cbffa-a3f4-45c2-918e-a64ab9b34b34", + "traceId": "e836a5e717a24466b547d6a3ca2f9826", + "evidence": "fileName=ADMIN-API-20260808020409413-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T02:04:17.618Z" + }, + { + "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": "6c0fe65a-48c9-401e-800c-dca4e5b5ee74, 775cbffa-a3f4-45c2-918e-a64ab9b34b34", + "traceId": "e836a5e717a24466b547d6a3ca2f9826", + "evidence": "versionId=2085909925908230146, status=PENDING_CONFIRMATION, fileName=ADMIN-API-20260808020409413-2026.08.03柏悦价格表 船期2026.08.12.xlsx, shaMatched=true", + "checkedAt": "2026-08-08T02:04:17.618Z" + }, + { + "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": "6c0fe65a-48c9-401e-800c-dca4e5b5ee74, 775cbffa-a3f4-45c2-918e-a64ab9b34b34", + "traceId": "e836a5e717a24466b547d6a3ca2f9826", + "evidence": "channelCount=15, unique=15, missing=none", + "checkedAt": "2026-08-08T02:04:17.618Z" + }, + { + "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": "6c0fe65a-48c9-401e-800c-dca4e5b5ee74, 775cbffa-a3f4-45c2-918e-a64ab9b34b34", + "traceId": "e836a5e717a24466b547d6a3ca2f9826", + "evidence": "rateCount=2157, declared=2157, valid=true", + "checkedAt": "2026-08-08T02:04:17.619Z" + }, + { + "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": "6c0fe65a-48c9-401e-800c-dca4e5b5ee74, 775cbffa-a3f4-45c2-918e-a64ab9b34b34", + "traceId": "e836a5e717a24466b547d6a3ca2f9826", + "evidence": "blocking=0, unexpected=none, infrastructure=none", + "checkedAt": "2026-08-08T02:04:17.619Z" + }, + { + "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": "53c4cc1c-274b-402c-b2d3-63c166e6693f, cb5ee908-36c1-4ea4-a83b-10fa3c693692", + "traceId": "82069fb3a94c44a6994821ec9eb91ad3", + "evidence": "", + "checkedAt": "2026-08-08T02:04:17.651Z" + }, + { + "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": "53c4cc1c-274b-402c-b2d3-63c166e6693f, cb5ee908-36c1-4ea4-a83b-10fa3c693692", + "traceId": "82069fb3a94c44a6994821ec9eb91ad3", + "evidence": "pending=PENDING_CONFIRMATION, activeBefore=2085907189707878402, activeAfterUpload=2085907189707878402", + "checkedAt": "2026-08-08T02:04:17.651Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询待确认版本渠道和价格预览", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085909925908230146" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3efcf24-6712-43c6-bead-a1ff4898bed3, 0d913999-2e35-4156-84f8-76c086910545", + "traceId": "91a0133c2afb45c5b06af89a580d4fd0", + "evidence": "", + "checkedAt": "2026-08-08T02:04:17.744Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "详情与上传解析结果一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085909925908230146" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3efcf24-6712-43c6-bead-a1ff4898bed3, 0d913999-2e35-4156-84f8-76c086910545", + "traceId": "91a0133c2afb45c5b06af89a580d4fd0", + "evidence": "versionId=2085909925908230146, channels=15, rates=2157, issues=2", + "checkedAt": "2026-08-08T02:04:17.744Z" + }, + { + "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/2085909925908230146/source" + }, + "http": 200, + "code": null, + "message": "1343413 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "516249c6-aefc-4544-a114-5c94f4eddffe, 8b98cd6b-208c-4b7f-bc12-df31614feebf, 469aecae-fdbe-46a6-97f0-f220f6372972", + "traceId": "4a086c49291d451baaf84e4a10ce0915, 9028312a90974fb7b08e984f0ea18b4c", + "evidence": "bytes=1343413, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, zipMagic=true, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T02:04:17.857Z" + }, + { + "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": "461e5071-4e27-4baf-ae84-b60c4fc332d0, ecbab9ad-3e81-4216-b9c8-f264f543413a", + "traceId": "a92161c0cf584787b6727279ef9f0255", + "evidence": "", + "checkedAt": "2026-08-08T02:04:17.883Z" + }, + { + "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": "3688712d-a6d3-4106-8cb9-2eb3d360dc6b, 85817109-3bba-448b-9059-d956ef5c1d06", + "traceId": "695847cb57db4e0a97a5d57b2ea33e6b", + "evidence": "", + "checkedAt": "2026-08-08T02:04:17.919Z" + }, + { + "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": "3688712d-a6d3-4106-8cb9-2eb3d360dc6b, 85817109-3bba-448b-9059-d956ef5c1d06", + "traceId": "695847cb57db4e0a97a5d57b2ea33e6b", + "evidence": "origins=CN-DONGGUAN-01->193000000000200002,CN-YIWU-01->193000000000200001, overseas=纽约仓->193000000000200004,洛杉矶仓->193000000000200003, missing=none", + "checkedAt": "2026-08-08T02:04:17.920Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "确认仓库映射并立即生效", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085909925908230146/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "851ecf53-a10e-4eed-adf3-b7646630779b, 24bd32d2-a333-4f9e-a65b-ee7a55fb5e1f", + "traceId": "9479f070a422402eb646fe5c56f8427e", + "evidence": "versionId=2085909925908230146, originMappings=2, overseasMappings=2", + "checkedAt": "2026-08-08T02:04:19.547Z" + }, + { + "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/2085909925908230146/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "851ecf53-a10e-4eed-adf3-b7646630779b, 24bd32d2-a333-4f9e-a65b-ee7a55fb5e1f", + "traceId": "9479f070a422402eb646fe5c56f8427e", + "evidence": "status=ACTIVE, blocking=0, publishedAt=2026-08-08T10:04:18.487, channels=15, rates=2157", + "checkedAt": "2026-08-08T02:04:19.548Z" + }, + { + "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": "5a3c97fd-ac6b-4de8-9847-d5d360530f32, e7356437-1436-48ed-ac8f-675bcb0a582d", + "traceId": "22e6b12fe0e6482cbfb85a3cb1b33f30", + "evidence": "", + "checkedAt": "2026-08-08T02:04:19.575Z" + }, + { + "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": "5a3c97fd-ac6b-4de8-9847-d5d360530f32, e7356437-1436-48ed-ac8f-675bcb0a582d", + "traceId": "22e6b12fe0e6482cbfb85a3cb1b33f30", + "evidence": "active=2085909925908230146", + "checkedAt": "2026-08-08T02:04:19.575Z" + }, + { + "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": "5a3c97fd-ac6b-4de8-9847-d5d360530f32, e7356437-1436-48ed-ac8f-675bcb0a582d", + "traceId": "22e6b12fe0e6482cbfb85a3cb1b33f30", + "evidence": "previous=2085907189707878402, superseded=true", + "checkedAt": "2026-08-08T02:04:19.575Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询当前生效价格版本详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085909925908230146" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7eb10189-d562-43c7-9b69-8616432e7bce, 5b4a4ba0-a83a-464a-a2da-008caa24f65e", + "traceId": "f956eee5c836427a985c371e00c52e24", + "evidence": "", + "checkedAt": "2026-08-08T02:04:19.668Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "当前生效版本预览数据完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085909925908230146" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7eb10189-d562-43c7-9b69-8616432e7bce, 5b4a4ba0-a83a-464a-a2da-008caa24f65e", + "traceId": "f956eee5c836427a985c371e00c52e24", + "evidence": "status=ACTIVE, channels=15, rates=2157", + "checkedAt": "2026-08-08T02:04:19.668Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "已生效版本禁止重复发布", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085909925908230146/publish" + }, + "http": 200, + "code": "A0409", + "message": "只有待确认上传记录可以确认并生效", + "requestId": "35c32529-15f8-4f6b-aee8-80e09287ac47", + "traceId": "ff9e6c44b89648a59fec0b17256af132", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:04:19.702Z" + }, + { + "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": "da9b8f65-4a77-4356-8a56-057cc1eb1807, 4f4dd6e5-d3b6-4f4f-957d-b57c38298fb7", + "traceId": "ae53f7fdae1145e3873a9c98c6fbbaaa", + "evidence": "", + "checkedAt": "2026-08-08T02:04:19.731Z" + }, + { + "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": "da9b8f65-4a77-4356-8a56-057cc1eb1807, 4f4dd6e5-d3b6-4f4f-957d-b57c38298fb7", + "traceId": "ae53f7fdae1145e3873a9c98c6fbbaaa", + "evidence": "active=2085909925908230146", + "checkedAt": "2026-08-08T02:04:19.731Z" + }, + { + "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": "0b31c79f-698b-4752-8626-a49588960da3, 33101af2-373d-4f10-8a5f-d11f7ee7af6c", + "traceId": "f151fb791d9b4636a8987c06e39adbbc", + "evidence": "", + "checkedAt": "2026-08-08T02:04:19.770Z" + }, + { + "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": "0b31c79f-698b-4752-8626-a49588960da3, 33101af2-373d-4f10-8a5f-d11f7ee7af6c", + "traceId": "f151fb791d9b4636a8987c06e39adbbc", + "evidence": "taskId=2085909941454438401, status=PENDING", + "checkedAt": "2026-08-08T02:04:19.770Z" + }, + { + "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": "14fd7107-0775-4176-b722-b5b67183d1e8, 3b35034b-085f-4ec1-9675-6a8a4d01b691", + "traceId": "a2351d6d92d54685b8ce5650e1165514", + "evidence": "", + "checkedAt": "2026-08-08T02:04:19.800Z" + }, + { + "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": "14fd7107-0775-4176-b722-b5b67183d1e8, 3b35034b-085f-4ec1-9675-6a8a4d01b691", + "traceId": "a2351d6d92d54685b8ce5650e1165514", + "evidence": "records=4", + "checkedAt": "2026-08-08T02:04:19.800Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "轮询导出任务直到终态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085909941454438401" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e990640b-d7b4-47b5-8e5e-b205f9577dd8, a1d7f717-f05b-448a-8965-d1bf9d0589b1", + "traceId": "b795ec42c44b4e769e559304f088d1c3", + "evidence": "status=SUCCEEDED, processedRows=0", + "checkedAt": "2026-08-08T02:04:23.881Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "查询导出任务详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085909941454438401" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dc053dd3-6a33-479e-930d-17698adc74bd, 3c518756-9d5d-4d5b-b968-5af4ac6dd6da", + "traceId": "f9f869216bb741e18846b98592095853", + "evidence": "", + "checkedAt": "2026-08-08T02:04:23.917Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "导出详情行数和文件元数据正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085909941454438401" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dc053dd3-6a33-479e-930d-17698adc74bd, 3c518756-9d5d-4d5b-b968-5af4ac6dd6da", + "traceId": "f9f869216bb741e18846b98592095853", + "evidence": "processedRows=0, sizeBytes=4066", + "checkedAt": "2026-08-08T02:04:23.917Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "下载并校验客户列表 XLSX", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085909941454438401/download" + }, + "http": 200, + "code": null, + "message": "4066 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "4b9002ec-2052-4452-9886-174964c977fc, 9f25ce19-e0e9-48fa-8aad-63845e7123ea", + "traceId": "fdf3cc5e8a06420aa16c9166bc9355c5", + "evidence": "bytes=4066, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:04:23.943Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅选择带本轮测试标记的可编辑入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909922162716673?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "60781464-8e76-4bc9-8521-278103bb0da6, b8880e34-1dc5-48d8-ab00-30cfba132e06", + "traceId": "d0402ec7a9fd49a1b3591c5917507df3", + "evidence": "tenantId=10001, inboundId=2085909922162716673, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:04:23.969Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ddd099ae-fb52-4abf-a292-99a086079558, bc100b8e-dc9d-43ed-9884-943ca1337159", + "traceId": "68625edd10ad4e088714e3b53fa8f890", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:24.008Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ddd099ae-fb52-4abf-a292-99a086079558, bc100b8e-dc9d-43ed-9884-943ca1337159", + "traceId": "68625edd10ad4e088714e3b53fa8f890", + "evidence": "existingResults=0, baselineWeight=null", + "checkedAt": "2026-08-08T02:04:24.008Z" + }, + { + "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/2085909922162716673" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "7346b2e2-1546", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T02:04:24.025Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "A0400", + "message": "称重图片仅支持JPG、PNG、BMP", + "requestId": "e146a511-82f2-4977-9db3-fda07b3b4e10", + "traceId": "d1955eb3e660426da94d232cdd0aa6a5", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:04:24.052Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "A0400", + "message": "称重图片不能超过5MB", + "requestId": "adc2f405-0014-4f9c-b5fb-a41060d44a13", + "traceId": "f8706cc44c93486f8ff9a1b2a6d600d6", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:04:25.085Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cf075ed5-3f9d-436a-9754-9f6ca7b243fa, e9e4c534-f1fc-438e-80ee-760d89031a98", + "traceId": "a98b594fb49242ba8c7d0868d8c5b0d4", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:04:26.447Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cf075ed5-3f9d-436a-9754-9f6ca7b243fa, e9e4c534-f1fc-438e-80ee-760d89031a98", + "traceId": "a98b594fb49242ba8c7d0868d8c5b0d4", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:04:26.447Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cf075ed5-3f9d-436a-9754-9f6ca7b243fa, e9e4c534-f1fc-438e-80ee-760d89031a98", + "traceId": "a98b594fb49242ba8c7d0868d8c5b0d4", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:04:26.447Z" + }, + { + "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/2085909922162716673/2085909965773012993/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d4db729e-4046-4d18-92af-a1f966a64bd7, bcb4212b-1dec-480a-9b6e-6ce399459b2b", + "traceId": "b2360bc8ce6643adb00460c9a1ab86ae", + "evidence": "fileId=2085909965773012993", + "checkedAt": "2026-08-08T02:04:27.345Z" + }, + { + "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/2085909922162716673/2085909965773012993/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d4db729e-4046-4d18-92af-a1f966a64bd7, bcb4212b-1dec-480a-9b6e-6ce399459b2b", + "traceId": "b2360bc8ce6643adb00460c9a1ab86ae", + "evidence": "sameFile=true, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:04:27.345Z" + }, + { + "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/2085909922162716673/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0892795-41c2-42f4-9b57-de63730586b9, 3a6eb83a-a7df-4e1d-9fed-c06828b8b63e", + "traceId": "81b4a5196b944fadbedc120bdbf480ac", + "evidence": "fileId=2085909965773012993", + "checkedAt": "2026-08-08T02:04:27.377Z" + }, + { + "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/2085909922162716673/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0892795-41c2-42f4-9b57-de63730586b9, 3a6eb83a-a7df-4e1d-9fed-c06828b8b63e", + "traceId": "81b4a5196b944fadbedc120bdbf480ac", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:04:27.377Z" + }, + { + "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/2085909922162716673/2085909965773012993" + }, + "http": 200, + "code": null, + "message": "3701469 bytes (image/jpeg)", + "requestId": "1e2fd487-a5ad-402e-b74a-296e50e3e9a4, d9227884-adac-4f64-b013-da14db16d043", + "traceId": "e0bb56ce86144fa6831a38bbd7138d68", + "evidence": "contentType=image/jpeg, bytes=3701469", + "checkedAt": "2026-08-08T02:04:27.526Z" + }, + { + "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/2085909922162716673/2085909965773012993/thumbnail" + }, + "http": 200, + "code": null, + "message": "18677 bytes (image/jpeg)", + "requestId": "96923ad4-5503-4f6a-8d2f-009fb5e9591e, c1145416-2a2a-4d9f-abee-43e6b4ba2964", + "traceId": "312fb2489af945dd8ca29e6d0c67fd7d", + "evidence": "contentType=image/jpeg, bytes=18677, dimensions=240x320", + "checkedAt": "2026-08-08T02:04:27.902Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bfb7453c-0292-4629-8438-18392691d0ce, 197907d0-77ab-4394-8f10-5f7548faa4d5", + "traceId": "cc72f197ae2a417b84d4d46b74a1c441", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:27.927Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bfb7453c-0292-4629-8438-18392691d0ce, 197907d0-77ab-4394-8f10-5f7548faa4d5", + "traceId": "cc72f197ae2a417b84d4d46b74a1c441", + "evidence": "resultFound=true, baselineCount=0, currentCount=1", + "checkedAt": "2026-08-08T02:04:27.927Z" + }, + { + "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/2085909922162716673/weight-results/2085909973379362818/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "79a19862-6b96-4c55-b109-351d3eb3a96c", + "traceId": "4bccaac29e0d49fd8313930054119d59", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:04:27.963Z" + }, + { + "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/2085909922162716673/weight-results/2085909973379362818/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9707b200-3788-4e26-a9f8-756f35f64a05, 5bba846f-7e4f-4b87-b1d5-4a3730639139", + "traceId": "0f7761cee437419a8afec96364f2976d", + "evidence": "usedOriginal=true", + "checkedAt": "2026-08-08T02:04:27.993Z" + }, + { + "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/2085909922162716673/weight-results/2085909973379362818/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9707b200-3788-4e26-a9f8-756f35f64a05, 5bba846f-7e4f-4b87-b1d5-4a3730639139", + "traceId": "0f7761cee437419a8afec96364f2976d", + "evidence": "status=CONFIRMED, version=1, finalKg=285.5", + "checkedAt": "2026-08-08T02:04:27.993Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df20c7f6-938c-4cde-95e4-acc96ad99858, 61491e36-e71a-4816-a413-e79d8cdc22d6", + "traceId": "f74018f118a2472495cf1cc4ffe1599b", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:28.018Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df20c7f6-938c-4cde-95e4-acc96ad99858, 61491e36-e71a-4816-a413-e79d8cdc22d6", + "traceId": "f74018f118a2472495cf1cc4ffe1599b", + "evidence": "baseline=null, added=285.5, actual=285.5", + "checkedAt": "2026-08-08T02:04:28.018Z" + }, + { + "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/2085909922162716673/weight-results/2085909973379362818?tenantId=10001&version=0" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "29ccf430-d6fc-46a1-a686-0f840a6bd11f", + "traceId": "a5929ff4defd44c4a76dc1c784af85d5", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:04:28.050Z" + }, + { + "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/2085909922162716673/weight-results/2085909973379362818?tenantId=10001&version=1" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "122973cb-3deb-4d4d-afe5-ed7ffb8be8a3, bb5dd86c-0343-4939-a5b4-b1fbbd034d5c", + "traceId": "0d3808bbe6b44d62a7ef7ec182804bcc", + "evidence": "resultId=2085909973379362818, version=1", + "checkedAt": "2026-08-08T02:04:28.102Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f2bd07fd-e505-4a6b-9086-0c2d7a7af963, 11f33169-d419-4bf3-ac5d-29ca3fe87497", + "traceId": "6a1e9377c74b4eb0b41cffc5afcdcd28", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:28.129Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f2bd07fd-e505-4a6b-9086-0c2d7a7af963, 11f33169-d419-4bf3-ac5d-29ca3fe87497", + "traceId": "6a1e9377c74b4eb0b41cffc5afcdcd28", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "checkedAt": "2026-08-08T02:04:28.129Z" + }, + { + "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/2085909922162716673/2085909965773012993" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "d17b0484-499f-4f67-9440-86ba96204f4e", + "traceId": "24e06eb480ce49a3b6311f4ec8193960", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:04:28.151Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5bdbd38b-c26a-4066-bb38-9fc186ac3d3f, b056bc81-1f60-4263-97b6-bc2777884b4c", + "traceId": "183c0b19618a463686d77a4c9f69171d", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:04:29.684Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5bdbd38b-c26a-4066-bb38-9fc186ac3d3f, b056bc81-1f60-4263-97b6-bc2777884b4c", + "traceId": "183c0b19618a463686d77a4c9f69171d", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:04:29.684Z" + }, + { + "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/2085909922162716673" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5bdbd38b-c26a-4066-bb38-9fc186ac3d3f, b056bc81-1f60-4263-97b6-bc2777884b4c", + "traceId": "183c0b19618a463686d77a4c9f69171d", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:04:29.684Z" + }, + { + "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/2085909922162716673/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9084858c-a04f-46ff-a2d4-bed61a069a3b, eb91930e-9d03-4651-95cc-2e706b97962c", + "traceId": "6e4cb2059af84d0fab9bb7f3118fdb29", + "evidence": "fileId=2085909979404500994", + "checkedAt": "2026-08-08T02:04:29.712Z" + }, + { + "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/2085909922162716673/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9084858c-a04f-46ff-a2d4-bed61a069a3b, eb91930e-9d03-4651-95cc-2e706b97962c", + "traceId": "6e4cb2059af84d0fab9bb7f3118fdb29", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:04:29.712Z" + }, + { + "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/2085909922162716673/weight-results/2085909983173062657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "b98e019e-a9a4-4857-8b6d-15d7c850ef1b", + "traceId": "764b939009e74d59ab110c86080fb216", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:04:29.736Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98778f5e-cbac-47d8-b8a9-be0ee323e4a1, f1d5e72e-6460-43a6-b8ff-46e223c5db27", + "traceId": "9e0c42ad55b4498180d36f01386f1889", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:29.770Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98778f5e-cbac-47d8-b8a9-be0ee323e4a1, f1d5e72e-6460-43a6-b8ff-46e223c5db27", + "traceId": "9e0c42ad55b4498180d36f01386f1889", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:04:29.770Z" + }, + { + "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/2085909922162716673/weight-results/2085909983173062657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "c1e74cf9-3949-4736-b95a-67f778bc798a", + "traceId": "53ae99cbada64ab698a06f257aba2274", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:04:29.797Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5152f9ec-6980-4ee1-8e27-97ae539b091e, ee96b602-c7a8-42fd-9d25-70ca1084dfea", + "traceId": "08cc1bcb41e2460692629be920b60f94", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:29.864Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5152f9ec-6980-4ee1-8e27-97ae539b091e, ee96b602-c7a8-42fd-9d25-70ca1084dfea", + "traceId": "08cc1bcb41e2460692629be920b60f94", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:04:29.864Z" + }, + { + "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/2085909922162716673/weight-results/2085909983173062657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "换算后重量不能小于 0.001 KG", + "requestId": "d6adede7-c378-4f25-8f63-89843eb877a3", + "traceId": "dd97ce8d34024425aade84a7c87107aa", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:04:29.891Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "93e0f1d6-c164-4582-b812-df2b9dea5449, 39851756-548c-4fa2-a8f3-20561959dfdf", + "traceId": "b3da97fd5aa24bb487d38ea1afc2d5fe", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:29.923Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "93e0f1d6-c164-4582-b812-df2b9dea5449, 39851756-548c-4fa2-a8f3-20561959dfdf", + "traceId": "b3da97fd5aa24bb487d38ea1afc2d5fe", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:04:29.923Z" + }, + { + "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/2085909922162716673/weight-results/2085909983173062657/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: numeric value out of bounds (<15 digits>.<3 digits> expected)", + "requestId": "eda48dfc-5b78-4213-a0fa-689e46aa0002", + "traceId": "e5654c1887c243f3a4065d6227c031a4", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:04:29.955Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9694891c-b67b-4f73-bbb8-5cb5f58a90b9, 5da544ae-58dc-4fdb-9dcb-f7890142e0a0", + "traceId": "45b0150c4f9844fd8e3aac1fe6836395", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:29.987Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9694891c-b67b-4f73-bbb8-5cb5f58a90b9, 5da544ae-58dc-4fdb-9dcb-f7890142e0a0", + "traceId": "45b0150c4f9844fd8e3aac1fe6836395", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:04:29.987Z" + }, + { + "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/2085909922162716673/weight-results/2085909983173062657/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad3f2f31-0867-48ea-bd69-0a4724e72ced, babd1a9e-e932-434c-a063-e308b6830f0a", + "traceId": "e6247cac07db4991b7cb2121d6ccf261", + "evidence": "adjusted=10.125 LB", + "checkedAt": "2026-08-08T02:04:30.023Z" + }, + { + "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/2085909922162716673/weight-results/2085909983173062657/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad3f2f31-0867-48ea-bd69-0a4724e72ced, babd1a9e-e932-434c-a063-e308b6830f0a", + "traceId": "e6247cac07db4991b7cb2121d6ccf261", + "evidence": "adjusted=10.125 LB, finalKg=4.593, expectedKg=4.593", + "checkedAt": "2026-08-08T02:04:30.023Z" + }, + { + "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/2085909922162716673/weight-results/2085909983173062657?tenantId=10001&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4fff748f-ce0b-47db-b092-8fde176047a2, 0b314951-627c-4bcb-a9ac-3b7e1342b027", + "traceId": "49f03b0eb22b40c6a36a11870060b294", + "evidence": "resultId=2085909983173062657, version=2", + "checkedAt": "2026-08-08T02:04:30.078Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b55972f-34af-477b-9206-9a8a02c3ff8d, 742d0f8b-fad3-4092-a51b-2d97c091278d", + "traceId": "f2be264baee043a58e7033432006f36b", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:30.107Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b55972f-34af-477b-9206-9a8a02c3ff8d, 742d0f8b-fad3-4092-a51b-2d97c091278d", + "traceId": "f2be264baee043a58e7033432006f36b", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:04:30.107Z" + }, + { + "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/2085909922162716673/2085909979404500994" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "757f277b-87fb-4ee3-b443-af6e71fd18f1", + "traceId": "b7db454c78af45fb80d23fbbf0315ae5", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:04:30.139Z" + }, + { + "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/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8f9040b1-bd94-4f81-bace-7d5328834b35, 22eb84ed-3c58-45a0-b39c-f3a2edb83322", + "traceId": "40ecb94bdb0445a39cf1ed8a470431aa", + "evidence": "inboundId=2085909922162716673", + "checkedAt": "2026-08-08T02:04:30.171Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085909922162716673/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8f9040b1-bd94-4f81-bace-7d5328834b35, 22eb84ed-3c58-45a0-b39c-f3a2edb83322", + "traceId": "40ecb94bdb0445a39cf1ed8a470431aa", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:04:30.171Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909922162716673?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c48c3dc-36cd-4268-a6ed-eff4ed56d036, 274f077b-2f35-4cc8-ae31-8559a39cb4df", + "traceId": "07e4bfe12f72485ab2c29cec1b5f0e0c", + "evidence": "inboundId=2085909922162716673, tenantId=10001", + "checkedAt": "2026-08-08T02:04:30.202Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909922162716673?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c48c3dc-36cd-4268-a6ed-eff4ed56d036, 274f077b-2f35-4cc8-ae31-8559a39cb4df", + "traceId": "07e4bfe12f72485ab2c29cec1b5f0e0c", + "evidence": "identity=true, status=MEASURING", + "checkedAt": "2026-08-08T02:04:30.202Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085909922162716673?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c48c3dc-36cd-4268-a6ed-eff4ed56d036, 274f077b-2f35-4cc8-ae31-8559a39cb4df", + "traceId": "07e4bfe12f72485ab2c29cec1b5f0e0c", + "evidence": "inboundCode=present, totalPackageCount=missing", + "checkedAt": "2026-08-08T02:04:30.202Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020600.json b/reports/admin-test-env-acceptance-20260808020600.json new file mode 100644 index 000000000..8767e4af2 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020600.json @@ -0,0 +1,777 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020600398", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:06:01.284Z", + "startedAt": "2026-08-08T02:06:00.398Z", + "success": false, + "fatal": null, + "summary": { + "total": 38, + "passed": 34, + "failed": 4 + }, + "modules": [ + { + "name": "customers", + "startedAt": "2026-08-08T02:06:00.764Z", + "finishedAt": "2026-08-08T02:06:01.284Z", + "success": false, + "passed": 33, + "failed": 4, + "fatal": null + } + ], + "scenarios": [ + { + "name": "customer-dimension-rules", + "module": "customers", + "success": true, + "deploymentBlocked": false, + "passed": 13, + "failed": 0 + } + ], + "deploymentBlockers": [ + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "创建客户生成初始密码", + "evidence": "generated=false, length=0", + "code": "200", + "requestId": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "管理员用户名默认使用联系电话", + "evidence": "matches=false", + "code": "200", + "requestId": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "联系电话账号是企业管理员", + "evidence": "ownerFound=false, matches=false", + "code": "200", + "requestId": "4e38b00f-9877-448f-9c54-d7a4a604bf79, 6261cac3-bf0d-4e9c-81f5-19edb4a89bec", + "traceId": "261ac37d19d94fa0a6108d65333c84c6" + }, + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "归档测试客户", + "evidence": "tenantId=2085910365380136962", + "code": "S0500", + "requestId": "d7382957-3ac8-44a5-bf1d-fb10394f2181", + "traceId": "33ede0d091f644a283c541e91aa0ab65" + } + ], + "createdResources": { + "customer": { + "tenantId": "2085910365380136962", + "marker": "ADMIN-API-20260808020600398", + "contactPhone": "16154760765" + } + }, + "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": "4c559599-241d-4e9d-a8cd-717f333037b8, 6c7f9a77-889f-484f-b39a-b6755a68779f", + "traceId": "3765d7a68a1d4d85bab38362c14f15c2", + "evidence": "", + "checkedAt": "2026-08-08T02:06:00.764Z" + }, + { + "module": "customers", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16154760765" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "32c4883f-a91f-4212-a0cd-269c521726a0, ab347d17-f86f-43b3-b904-6c45cb78dcf9", + "traceId": "de191475b4d84f88998330c796c56d1a", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T02:06:00.806Z" + }, + { + "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": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045", + "evidence": "", + "checkedAt": "2026-08-08T02:06:00.850Z" + }, + { + "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": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045", + "evidence": "missing=none", + "checkedAt": "2026-08-08T02:06:00.850Z" + }, + { + "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": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045", + "evidence": "tenantId=2085910365380136962, status=PROFILE_REQUIRED", + "checkedAt": "2026-08-08T02:06:00.850Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "创建客户生成初始密码", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045", + "evidence": "generated=false, length=0", + "checkedAt": "2026-08-08T02:06:00.850Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "管理员用户名默认使用联系电话", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045", + "evidence": "matches=false", + "checkedAt": "2026-08-08T02:06:00.850Z" + }, + { + "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": "1f863aad-18a9-4bd0-903d-54b6137a1e97, 5cde4d63-7324-42c5-8302-73f092b285e8", + "traceId": "4675d04359f7429b99de4d6ff4582045", + "evidence": "creditCode=omitted, approvedAt=omitted", + "checkedAt": "2026-08-08T02:06:00.850Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "新客户尺寸规则可查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b20bbb-3ca8-43c2-8eb1-3dbb47fc71de, 87759826-5c05-4ff9-8567-c708ee171a80", + "traceId": "a1535addd49848878e84957c42d65e7c", + "evidence": "tenantId=2085910365380136962", + "checkedAt": "2026-08-08T02:06:00.882Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "固定四箱规顺序完整且无重复", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b20bbb-3ca8-43c2-8eb1-3dbb47fc71de, 87759826-5c05-4ff9-8567-c708ee171a80", + "traceId": "a1535addd49848878e84957c42d65e7c", + "evidence": "count=4, order=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:06:00.882Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "四箱规默认内径、加边和备注正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b20bbb-3ca8-43c2-8eb1-3dbb47fc71de, 87759826-5c05-4ff9-8567-c708ee171a80", + "traceId": "a1535addd49848878e84957c42d65e7c", + "evidence": "defaults=matched", + "checkedAt": "2026-08-08T02:06:00.882Z" + }, + { + "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=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b20bbb-3ca8-43c2-8eb1-3dbb47fc71de, 87759826-5c05-4ff9-8567-c708ee171a80", + "traceId": "a1535addd49848878e84957c42d65e7c", + "evidence": "groupTenantIdType=string, rows=string/v0,string/v0,string/v0,string/v0", + "checkedAt": "2026-08-08T02:06:00.882Z" + }, + { + "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=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b20bbb-3ca8-43c2-8eb1-3dbb47fc71de, 87759826-5c05-4ff9-8567-c708ee171a80", + "traceId": "a1535addd49848878e84957c42d65e7c", + "evidence": "derivedRows=4", + "checkedAt": "2026-08-08T02:06:00.882Z" + }, + { + "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=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2b20bbb-3ca8-43c2-8eb1-3dbb47fc71de, 87759826-5c05-4ff9-8567-c708ee171a80", + "traceId": "a1535addd49848878e84957c42d65e7c", + "evidence": "fields=boxType,innerLengthCm,innerWidthCm,innerHeightCm,edgeAdditionCm,remark,version", + "checkedAt": "2026-08-08T02:06:00.882Z" + }, + { + "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=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9448a113-33b2-474b-b2f5-6d4a9ab65acc, f36a1a2b-c50d-4035-9abc-7820481390f5", + "traceId": "ad86761022ae47e98793789acda99f56", + "evidence": "rows=4", + "checkedAt": "2026-08-08T02:06:00.919Z" + }, + { + "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=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9448a113-33b2-474b-b2f5-6d4a9ab65acc, f36a1a2b-c50d-4035-9abc-7820481390f5", + "traceId": "ad86761022ae47e98793789acda99f56", + "evidence": "versions=1,1,1,1", + "checkedAt": "2026-08-08T02:06:00.919Z" + }, + { + "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=2085910365380136962" + }, + "http": 200, + "code": "A0409", + "message": "箱规尺寸配置已被修改,请刷新后重试", + "requestId": "afa9f40a-9b2b-4f70-a788-454d762dc5da", + "traceId": "56c946c77a5b4befb42727cfe28e5710", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:06:00.943Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突后重新查询四条规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f18c251b-bbda-4cb2-b6f6-fd826709a1eb, 70013868-202c-4147-b8a3-68426a4e9d63", + "traceId": "29a534c8a04d462e87f979f04fbccbe5", + "evidence": "", + "checkedAt": "2026-08-08T02:06:00.975Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突请求未造成四行部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f18c251b-bbda-4cb2-b6f6-fd826709a1eb, 70013868-202c-4147-b8a3-68426a4e9d63", + "traceId": "29a534c8a04d462e87f979f04fbccbe5", + "evidence": "unchangedRows=4", + "checkedAt": "2026-08-08T02:06:00.975Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "恢复本轮修改前的四箱规配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "31537a8d-cd3e-403d-9ff3-52e722046fa2, add8c74d-b88a-42d9-9d2c-75dd4dc09064", + "traceId": "9e8f45ceebff4cefb032b1f754542797", + "evidence": "restore=original-values", + "checkedAt": "2026-08-08T02:06:01.011Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "尺寸规则恢复后回显与初始值一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "31537a8d-cd3e-403d-9ff3-52e722046fa2, add8c74d-b88a-42d9-9d2c-75dd4dc09064", + "traceId": "9e8f45ceebff4cefb032b1f754542797", + "evidence": "restoredRows=4", + "checkedAt": "2026-08-08T02:06:01.011Z" + }, + { + "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-808020600398" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3ee91990-b379-4968-b0e3-ab08d13fe8ba, ced818cf-b7d1-472d-b0e6-f8f10e7b32e6", + "traceId": "34abafb02a9a46938c58fd5f34c55318", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.038Z" + }, + { + "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-808020600398" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3ee91990-b379-4968-b0e3-ab08d13fe8ba, ced818cf-b7d1-472d-b0e6-f8f10e7b32e6", + "traceId": "34abafb02a9a46938c58fd5f34c55318", + "evidence": "found=true, missing=none", + "checkedAt": "2026-08-08T02:06:01.038Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6d694ce1-49a2-4206-ac59-9345219cd35b, de69b6a5-4b88-4a77-8df4-6d6361f23fa1", + "traceId": "21a96c4ca1f7428ca74a8050916999a7", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.068Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户详情基本信息正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6d694ce1-49a2-4206-ac59-9345219cd35b, de69b6a5-4b88-4a77-8df4-6d6361f23fa1", + "traceId": "21a96c4ca1f7428ca74a8050916999a7", + "evidence": "tenantId=2085910365380136962", + "checkedAt": "2026-08-08T02:06:01.068Z" + }, + { + "module": "customers", + "scenario": null, + "name": "编辑客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e650c62c-ccf0-46c4-859a-6857c73c0aa4, f07c58e3-72cb-4615-9733-30b838835ebc", + "traceId": "87a1412e0b984ae2b627f1262010504d", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.100Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e650c62c-ccf0-46c4-859a-6857c73c0aa4, f07c58e3-72cb-4615-9733-30b838835ebc", + "traceId": "87a1412e0b984ae2b627f1262010504d", + "evidence": "tenantId=2085910365380136962", + "checkedAt": "2026-08-08T02:06:01.100Z" + }, + { + "module": "customers", + "scenario": null, + "name": "回查客户编辑结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eac35a1c-d37f-4ddb-b88a-c0e28f3e2a8e, 5972f9bb-2da2-4b89-b081-a630190123b1", + "traceId": "0570893840f145fd815a48af13bbb159", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.127Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eac35a1c-d37f-4ddb-b88a-c0e28f3e2a8e, 5972f9bb-2da2-4b89-b081-a630190123b1", + "traceId": "0570893840f145fd815a48af13bbb159", + "evidence": "tenantId=2085910365380136962", + "checkedAt": "2026-08-08T02:06:01.127Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询资质", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b66ce26f-5511-4416-950c-0d8ff2ceff2e, 20900824-11f2-4bd9-9ee5-78db4267de35", + "traceId": "4f08664e2e8c4ed18f9c87292e25085e", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.159Z" + }, + { + "module": "customers", + "scenario": null, + "name": "资质概况结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b66ce26f-5511-4416-950c-0d8ff2ceff2e, 20900824-11f2-4bd9-9ee5-78db4267de35", + "traceId": "4f08664e2e8c4ed18f9c87292e25085e", + "evidence": "count=0", + "checkedAt": "2026-08-08T02:06:01.159Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询成员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4e38b00f-9877-448f-9c54-d7a4a604bf79, 6261cac3-bf0d-4e9c-81f5-19edb4a89bec", + "traceId": "261ac37d19d94fa0a6108d65333c84c6", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.189Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "联系电话账号是企业管理员", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910365380136962/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4e38b00f-9877-448f-9c54-d7a4a604bf79, 6261cac3-bf0d-4e9c-81f5-19edb4a89bec", + "traceId": "261ac37d19d94fa0a6108d65333c84c6", + "evidence": "ownerFound=false, matches=false", + "checkedAt": "2026-08-08T02:06:01.189Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询运单数量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "82d5ea41-1dbd-4d11-a353-fed6e3f69b58, 84dc0125-532d-4c5a-a591-563cd57eb2f0", + "traceId": "a5c195d8f66e4ebd9f778724c84fef5e", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.221Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况返回当前客户运单数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085910365380136962" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "82d5ea41-1dbd-4d11-a353-fed6e3f69b58, 84dc0125-532d-4c5a-a591-563cd57eb2f0", + "traceId": "a5c195d8f66e4ebd9f778724c84fef5e", + "evidence": "orderCount=0", + "checkedAt": "2026-08-08T02:06:01.221Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户运单记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085910365380136962&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9c31f043-204a-426e-bd31-b12b2f858269, dd5e3362-ec45-4f90-a7f2-3ebed8f18794", + "traceId": "4aa7a5a101ab45c8ad97c173ff98f13c", + "evidence": "", + "checkedAt": "2026-08-08T02:06:01.253Z" + }, + { + "module": "customers", + "scenario": null, + "name": "运单记录分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085910365380136962&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9c31f043-204a-426e-bd31-b12b2f858269, dd5e3362-ec45-4f90-a7f2-3ebed8f18794", + "traceId": "4aa7a5a101ab45c8ad97c173ff98f13c", + "evidence": "records=0, total=0", + "checkedAt": "2026-08-08T02:06:01.253Z" + }, + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "归档测试客户", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085910365380136962/archive" + }, + "http": 200, + "code": "S0500", + "message": "Internal server error", + "requestId": "d7382957-3ac8-44a5-bf1d-fb10394f2181", + "traceId": "33ede0d091f644a283c541e91aa0ab65", + "evidence": "tenantId=2085910365380136962", + "checkedAt": "2026-08-08T02:06:01.284Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020614.json b/reports/admin-test-env-acceptance-20260808020614.json new file mode 100644 index 000000000..823318a36 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020614.json @@ -0,0 +1,4940 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020614529", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:06:36.673Z", + "startedAt": "2026-08-08T02:06:14.529Z", + "success": false, + "fatal": null, + "summary": { + "total": 257, + "passed": 247, + "failed": 10 + }, + "modules": [ + { + "name": "customers", + "startedAt": "2026-08-08T02:06:14.900Z", + "finishedAt": "2026-08-08T02:06:15.410Z", + "success": false, + "passed": 33, + "failed": 4, + "fatal": null + }, + { + "name": "system", + "startedAt": "2026-08-08T02:06:15.411Z", + "finishedAt": "2026-08-08T02:06:17.616Z", + "success": true, + "passed": 41, + "failed": 0, + "fatal": null + }, + { + "name": "master-data", + "startedAt": "2026-08-08T02:06:17.617Z", + "finishedAt": "2026-08-08T02:06:18.688Z", + "success": true, + "passed": 42, + "failed": 0, + "fatal": null + }, + { + "name": "orders", + "startedAt": "2026-08-08T02:06:18.689Z", + "finishedAt": "2026-08-08T02:06:22.076Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "pricing", + "startedAt": "2026-08-08T02:06:22.077Z", + "finishedAt": "2026-08-08T02:06:25.798Z", + "success": true, + "passed": 26, + "failed": 0, + "fatal": null + }, + { + "name": "downloads", + "startedAt": "2026-08-08T02:06:25.799Z", + "finishedAt": "2026-08-08T02:06:30.057Z", + "success": true, + "passed": 8, + "failed": 0, + "fatal": null + }, + { + "name": "inbound-weight-ocr", + "startedAt": "2026-08-08T02:06:30.058Z", + "finishedAt": "2026-08-08T02:06:36.641Z", + "success": false, + "passed": 49, + "failed": 3, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T02:06:36.642Z", + "finishedAt": "2026-08-08T02:06:36.673Z", + "success": false, + "passed": 2, + "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": false, + "deploymentBlocked": true, + "passed": 49, + "failed": 3 + }, + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 2, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "创建客户生成初始密码", + "evidence": "generated=false, length=0", + "code": "200", + "requestId": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "管理员用户名默认使用联系电话", + "evidence": "matches=false", + "code": "200", + "requestId": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "联系电话账号是企业管理员", + "evidence": "ownerFound=false, matches=false", + "code": "200", + "requestId": "cff22ff2-8e0e-4ae1-a496-33a0c9d87fc1, b27b7063-cdba-493d-948e-e178154cacb4", + "traceId": "524eda847d2441728a6281e527686701" + }, + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "归档测试客户", + "evidence": "tenantId=2085910424691789825", + "code": "S0500", + "requestId": "d23edac5-7c21-4c3c-bbe8-d4c2750bdfd4", + "traceId": "7f3503585dbe4369930a56a740535e28" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "8f433833-6736-4b7a-9637-0ebbf7a34843", + "traceId": "888ab53b508f40528de5c08a7c5ed1d0" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "8f433833-6736-4b7a-9637-0ebbf7a34843", + "traceId": "888ab53b508f40528de5c08a7c5ed1d0" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "code": "200", + "requestId": "4bc235c2-14ad-4e90-9820-5b5ed07df157, c59dd193-12f8-4a96-a14d-3dc7bdae815d", + "traceId": "581bf2963b9d489faa9225bc07ff3283" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "code": "200", + "requestId": "a1af5929-11dc-4e01-ac69-6f3401918cbf, 8f809e3e-61d8-46c8-94eb-cb107c11e4f1", + "traceId": "0413f33d272347e38cc3a5de9d1f98fb" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "code": "200", + "requestId": "edcd6877-e3c7-43e9-9f34-535624344c84, 5b25d8cc-443a-4c43-bc8f-4a74af02edc8", + "traceId": "17ce8208bf8d4379874014c8c8c0420d" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "evidence": "inboundCode=present, totalPackageCount=missing", + "code": "200", + "requestId": "8d589fd8-c4a8-4943-b105-3687b25b7658, 25af7c83-9d88-4cb0-86d4-308cc8fa7247", + "traceId": "5e31ef9f58814d71a8a943abc41fa3f6" + } + ], + "createdResources": { + "customer": { + "tenantId": "2085910424691789825", + "marker": "ADMIN-API-20260808020614529", + "contactPhone": "16154774900" + }, + "systemPermission": { + "id": "2085910426835079170", + "code": "platform:acceptance:808020614529" + }, + "systemRole": { + "id": "2085910427363561473", + "code": "ADMIN_ACCEPT_808020614529", + "finalStatus": "DISABLED", + "retainedBecauseAssigned": true + }, + "systemUser": { + "membershipId": "2085910428407943171", + "username": "admin_accept_808020614529", + "finalStatus": "DISABLED" + }, + "warehouse": { + "id": "2085910436097605633", + "code": "AW808020614529", + "finalStatus": "INACTIVE" + }, + "location": { + "id": "2085910436676419585", + "warehouseId": "2085910436097605633", + "deleted": false + }, + "pallet": { + "id": "2085910437460754434", + "warehouseId": "2085910436097605633", + "deleted": true + }, + "expressCompany": { + "id": "2085910438115065857", + "code": "EX808020614529", + "finalStatus": "INACTIVE" + }, + "partner": { + "id": "2085910438903595009", + "code": "PT808020614529", + "finalStatus": "INACTIVE" + }, + "orders": { + "marker": "ADMIN-API-20260808020614529", + "tenantId": "10001", + "orderId": "2085910443126751234", + "productImageFileId": "2085910442774429697", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085910450967982082", + "orderNo": "FL2085910443126751234", + "inboundCode": "RK-2085910443126751234", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085910450967982082", + "marker": "ADMIN-API-20260808020614529" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085910450967982082", + "marker": "ADMIN-API-20260808020614529" + }, + "priceBookVersion": { + "versionId": "2085910455296503809", + "marker": "ADMIN-API-20260808020614529", + "sourceSha256": "3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab" + }, + "exportTask": { + "id": "2085910470221955073" + }, + "inboundWeightOcr": { + "tenantId": "10001", + "inboundId": "2085910450967982082", + "resultIds": [ + "2085910504206282754", + "2085910513807044609" + ], + "cleaned": false + } + }, + "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": "625740bd-a6ca-4f9b-8449-8e3c300ddf4c, 677c2c3e-ed86-49f0-88e1-627257941aa9", + "traceId": "ee329a5c2d624166867b4f40068597f2", + "evidence": "", + "checkedAt": "2026-08-08T02:06:14.900Z" + }, + { + "module": "customers", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16154774900" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "74f27953-a048-4126-b217-b76173ef7429, a1249124-bf36-49b0-8df5-2665c7a59c33", + "traceId": "6bde745c74434651b38ef300f2518674", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T02:06:14.941Z" + }, + { + "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": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72", + "evidence": "", + "checkedAt": "2026-08-08T02:06:14.990Z" + }, + { + "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": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72", + "evidence": "missing=none", + "checkedAt": "2026-08-08T02:06:14.990Z" + }, + { + "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": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72", + "evidence": "tenantId=2085910424691789825, status=PROFILE_REQUIRED", + "checkedAt": "2026-08-08T02:06:14.991Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "创建客户生成初始密码", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72", + "evidence": "generated=false, length=0", + "checkedAt": "2026-08-08T02:06:14.991Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "管理员用户名默认使用联系电话", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72", + "evidence": "matches=false", + "checkedAt": "2026-08-08T02:06:14.991Z" + }, + { + "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": "66a98aad-56a7-4269-999a-15bdfcf999f7, 46604e82-0073-467b-ab53-aa273500d56f", + "traceId": "f868fda582334241906ab6a02d664d72", + "evidence": "creditCode=omitted, approvedAt=omitted", + "checkedAt": "2026-08-08T02:06:14.991Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "新客户尺寸规则可查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "195e7b2e-46f7-4e6d-922b-c10606fb0153, aef02eda-facc-49ed-a2c7-72d19ae04f9b", + "traceId": "2b0bbffaebe74206a24226a11ce13cb9", + "evidence": "tenantId=2085910424691789825", + "checkedAt": "2026-08-08T02:06:15.022Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "固定四箱规顺序完整且无重复", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "195e7b2e-46f7-4e6d-922b-c10606fb0153, aef02eda-facc-49ed-a2c7-72d19ae04f9b", + "traceId": "2b0bbffaebe74206a24226a11ce13cb9", + "evidence": "count=4, order=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:06:15.022Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "四箱规默认内径、加边和备注正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "195e7b2e-46f7-4e6d-922b-c10606fb0153, aef02eda-facc-49ed-a2c7-72d19ae04f9b", + "traceId": "2b0bbffaebe74206a24226a11ce13cb9", + "evidence": "defaults=matched", + "checkedAt": "2026-08-08T02:06:15.023Z" + }, + { + "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=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "195e7b2e-46f7-4e6d-922b-c10606fb0153, aef02eda-facc-49ed-a2c7-72d19ae04f9b", + "traceId": "2b0bbffaebe74206a24226a11ce13cb9", + "evidence": "groupTenantIdType=string, rows=string/v0,string/v0,string/v0,string/v0", + "checkedAt": "2026-08-08T02:06:15.023Z" + }, + { + "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=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "195e7b2e-46f7-4e6d-922b-c10606fb0153, aef02eda-facc-49ed-a2c7-72d19ae04f9b", + "traceId": "2b0bbffaebe74206a24226a11ce13cb9", + "evidence": "derivedRows=4", + "checkedAt": "2026-08-08T02:06:15.023Z" + }, + { + "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=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "195e7b2e-46f7-4e6d-922b-c10606fb0153, aef02eda-facc-49ed-a2c7-72d19ae04f9b", + "traceId": "2b0bbffaebe74206a24226a11ce13cb9", + "evidence": "fields=boxType,innerLengthCm,innerWidthCm,innerHeightCm,edgeAdditionCm,remark,version", + "checkedAt": "2026-08-08T02:06:15.023Z" + }, + { + "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=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3439154-744c-4888-b883-eba4f4bd8b8d, 556668ff-4bf2-4779-8446-adbf766082cd", + "traceId": "0214bec610604e4982c30e41d0550d9c", + "evidence": "rows=4", + "checkedAt": "2026-08-08T02:06:15.060Z" + }, + { + "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=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3439154-744c-4888-b883-eba4f4bd8b8d, 556668ff-4bf2-4779-8446-adbf766082cd", + "traceId": "0214bec610604e4982c30e41d0550d9c", + "evidence": "versions=1,1,1,1", + "checkedAt": "2026-08-08T02:06:15.060Z" + }, + { + "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=2085910424691789825" + }, + "http": 200, + "code": "A0409", + "message": "箱规尺寸配置已被修改,请刷新后重试", + "requestId": "d1665f38-4c4d-4d2c-bec1-03d6ba4f83f4", + "traceId": "c86b0a0212664bbdbf9e36f466a5fc3c", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:06:15.086Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突后重新查询四条规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6b6fe561-3fd2-4056-abf6-bd32558e3a9c, 0ca666f1-cba1-4943-8607-7a13c6d198fb", + "traceId": "f1083628f4b040db8ea21a232c831216", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.115Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突请求未造成四行部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6b6fe561-3fd2-4056-abf6-bd32558e3a9c, 0ca666f1-cba1-4943-8607-7a13c6d198fb", + "traceId": "f1083628f4b040db8ea21a232c831216", + "evidence": "unchangedRows=4", + "checkedAt": "2026-08-08T02:06:15.115Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "恢复本轮修改前的四箱规配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2d7325f1-07d7-4b92-b119-e266e1b0a3de, 2b4a9d5b-0169-411b-b577-26456f545a64", + "traceId": "95a6ec5f48d5484cbbb6f9d7fe37d3e6", + "evidence": "restore=original-values", + "checkedAt": "2026-08-08T02:06:15.145Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "尺寸规则恢复后回显与初始值一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2d7325f1-07d7-4b92-b119-e266e1b0a3de, 2b4a9d5b-0169-411b-b577-26456f545a64", + "traceId": "95a6ec5f48d5484cbbb6f9d7fe37d3e6", + "evidence": "restoredRows=4", + "checkedAt": "2026-08-08T02:06:15.145Z" + }, + { + "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-808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0c28f626-0a0f-4bee-b61e-3c372b786b52, e16920ae-8e84-483b-a806-82f7e3fcb5f2", + "traceId": "74957530d1a948ccb9b3c54ced2c1b33", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.184Z" + }, + { + "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-808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0c28f626-0a0f-4bee-b61e-3c372b786b52, e16920ae-8e84-483b-a806-82f7e3fcb5f2", + "traceId": "74957530d1a948ccb9b3c54ced2c1b33", + "evidence": "found=true, missing=none", + "checkedAt": "2026-08-08T02:06:15.184Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7d74638c-c767-4067-8ab9-98ba7574a77a, 2305c038-6416-4f87-872e-4b74b274105f", + "traceId": "463e544b2a6d4d5ca7b5f0fc77154f4b", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.210Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户详情基本信息正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7d74638c-c767-4067-8ab9-98ba7574a77a, 2305c038-6416-4f87-872e-4b74b274105f", + "traceId": "463e544b2a6d4d5ca7b5f0fc77154f4b", + "evidence": "tenantId=2085910424691789825", + "checkedAt": "2026-08-08T02:06:15.210Z" + }, + { + "module": "customers", + "scenario": null, + "name": "编辑客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "42780ffa-d180-419a-ad63-bf0b57daf05e, 10659b52-5363-462c-a541-61f9e101dfbd", + "traceId": "19094b4a4e7c430e8911269f045ebe17", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.243Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "42780ffa-d180-419a-ad63-bf0b57daf05e, 10659b52-5363-462c-a541-61f9e101dfbd", + "traceId": "19094b4a4e7c430e8911269f045ebe17", + "evidence": "tenantId=2085910424691789825", + "checkedAt": "2026-08-08T02:06:15.243Z" + }, + { + "module": "customers", + "scenario": null, + "name": "回查客户编辑结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "497af339-0d50-47cb-ac2a-2b05d82a4469, 59389b51-336e-47ae-a209-2dde97098486", + "traceId": "fc044c573d2146b59bb86d64fcba2ca6", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.267Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "497af339-0d50-47cb-ac2a-2b05d82a4469, 59389b51-336e-47ae-a209-2dde97098486", + "traceId": "fc044c573d2146b59bb86d64fcba2ca6", + "evidence": "tenantId=2085910424691789825", + "checkedAt": "2026-08-08T02:06:15.267Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询资质", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a38b85b-0c70-446d-9331-ba1f8a4fb27f, 2c3a06ed-70b5-4063-900c-eda4a3db209f", + "traceId": "69637a6acad3460d96df8b8b957c60cc", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.299Z" + }, + { + "module": "customers", + "scenario": null, + "name": "资质概况结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a38b85b-0c70-446d-9331-ba1f8a4fb27f, 2c3a06ed-70b5-4063-900c-eda4a3db209f", + "traceId": "69637a6acad3460d96df8b8b957c60cc", + "evidence": "count=0", + "checkedAt": "2026-08-08T02:06:15.299Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询成员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cff22ff2-8e0e-4ae1-a496-33a0c9d87fc1, b27b7063-cdba-493d-948e-e178154cacb4", + "traceId": "524eda847d2441728a6281e527686701", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.334Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "联系电话账号是企业管理员", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085910424691789825/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cff22ff2-8e0e-4ae1-a496-33a0c9d87fc1, b27b7063-cdba-493d-948e-e178154cacb4", + "traceId": "524eda847d2441728a6281e527686701", + "evidence": "ownerFound=false, matches=false", + "checkedAt": "2026-08-08T02:06:15.334Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询运单数量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9695b0e1-751a-4979-80cb-34b4cfb293d2, cd5fd3ce-e828-46f8-b867-64539e72b995", + "traceId": "85bc066f8a86453b8b47bc7184b64a53", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.361Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况返回当前客户运单数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085910424691789825" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9695b0e1-751a-4979-80cb-34b4cfb293d2, cd5fd3ce-e828-46f8-b867-64539e72b995", + "traceId": "85bc066f8a86453b8b47bc7184b64a53", + "evidence": "orderCount=0", + "checkedAt": "2026-08-08T02:06:15.362Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户运单记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085910424691789825&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0e14105-5996-444f-89d4-302f202a3a9c, b255eafd-825e-4353-9115-360dde729781", + "traceId": "fe69228260e744f18b5a63b15a2bf92d", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.384Z" + }, + { + "module": "customers", + "scenario": null, + "name": "运单记录分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085910424691789825&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0e14105-5996-444f-89d4-302f202a3a9c, b255eafd-825e-4353-9115-360dde729781", + "traceId": "fe69228260e744f18b5a63b15a2bf92d", + "evidence": "records=0, total=0", + "checkedAt": "2026-08-08T02:06:15.384Z" + }, + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "归档测试客户", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085910424691789825/archive" + }, + "http": 200, + "code": "S0500", + "message": "Internal server error", + "requestId": "d23edac5-7c21-4c3c-bbe8-d4c2750bdfd4", + "traceId": "7f3503585dbe4369930a56a740535e28", + "evidence": "tenantId=2085910424691789825", + "checkedAt": "2026-08-08T02:06:15.410Z" + }, + { + "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": "bf43d0db-41cd-40cb-8940-bae12b278cf8, bda60ec1-11cc-4eb8-b497-f23bd226162d", + "traceId": "f4b2f73d5ff149e5bbb9fd1c8311bac2", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.452Z" + }, + { + "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": "bf43d0db-41cd-40cb-8940-bae12b278cf8, bda60ec1-11cc-4eb8-b497-f23bd226162d", + "traceId": "f4b2f73d5ff149e5bbb9fd1c8311bac2", + "evidence": "count=117", + "checkedAt": "2026-08-08T02:06:15.452Z" + }, + { + "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": "c0f18e56-1e37-43a0-a794-84c96f9c86cf, 08946ea8-890e-4b43-a4a3-851caf633044", + "traceId": "e3daaf0f20094fc99bee6672747e1957", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.491Z" + }, + { + "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": "c0f18e56-1e37-43a0-a794-84c96f9c86cf, 08946ea8-890e-4b43-a4a3-851caf633044", + "traceId": "e3daaf0f20094fc99bee6672747e1957", + "evidence": "permissionId=2085910426835079170", + "checkedAt": "2026-08-08T02:06:15.491Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑自定义权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085910426835079170" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "529a02d7-8da0-4a30-b047-3aa2b5defa97, be1df43e-bea7-4ee5-96e8-002b31d4048e", + "traceId": "51fb466502b94d57936e929fef8d4ea0", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.523Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085910426835079170" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "529a02d7-8da0-4a30-b047-3aa2b5defa97, be1df43e-bea7-4ee5-96e8-002b31d4048e", + "traceId": "51fb466502b94d57936e929fef8d4ea0", + "evidence": "permissionId=2085910426835079170", + "checkedAt": "2026-08-08T02:06:15.523Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085910426835079170/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "07d97745-2eec-4aae-a8dc-2a312117e77c, 451120fa-bf90-488e-a074-eee6bf5cb195", + "traceId": "5cbcbbcf2bee4b7d9df8d5d5fb306d1f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.555Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085910426835079170/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "07d97745-2eec-4aae-a8dc-2a312117e77c, 451120fa-bf90-488e-a074-eee6bf5cb195", + "traceId": "5cbcbbcf2bee4b7d9df8d5d5fb306d1f", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:06:15.555Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085910426835079170/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3618b490-fe28-46b3-92f3-96672ef8ff42, 8ca7a818-e3e3-4b68-b5a0-0a2324a9073b", + "traceId": "f48ccd5bc0f1425f8c3d338a0759ed68", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.585Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085910426835079170/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3618b490-fe28-46b3-92f3-96672ef8ff42, 8ca7a818-e3e3-4b68-b5a0-0a2324a9073b", + "traceId": "f48ccd5bc0f1425f8c3d338a0759ed68", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T02:06:15.585Z" + }, + { + "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": "3aae9d0b-7ff6-4b6e-aaae-2c00b75427cd, 1602e1e0-cef9-41c7-9bb0-548d48d137ca", + "traceId": "7151fcbfa26a4ef2811cbb308ff9fc31", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.617Z" + }, + { + "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": "3aae9d0b-7ff6-4b6e-aaae-2c00b75427cd, 1602e1e0-cef9-41c7-9bb0-548d48d137ca", + "traceId": "7151fcbfa26a4ef2811cbb308ff9fc31", + "evidence": "roleId=2085910427363561473", + "checkedAt": "2026-08-08T02:06:15.617Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "013ac7c6-8a18-4cd6-8a70-81894726abc8, 7d06e9f5-78f3-47ba-9035-53dc73d00207", + "traceId": "3d2d412483f54ee29db54f21fb3b2917", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.651Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "013ac7c6-8a18-4cd6-8a70-81894726abc8, 7d06e9f5-78f3-47ba-9035-53dc73d00207", + "traceId": "3d2d412483f54ee29db54f21fb3b2917", + "evidence": "roleId=2085910427363561473", + "checkedAt": "2026-08-08T02:06:15.651Z" + }, + { + "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": "07fbe87f-2b9a-4a93-a9b4-0da5c12cb1bf, 2f34a8c8-64fe-464d-85b3-c0e573ae1f65", + "traceId": "68c7f16066f8476485ff1da1bf0f1a89", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.681Z" + }, + { + "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": "7110c38b-33b6-4ddc-b254-8eae3248d9e2, 69c33994-da10-4d71-af6f-4297b592cd94", + "traceId": "a329918b8df24f69a115fdcf51554014", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.711Z" + }, + { + "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": "7110c38b-33b6-4ddc-b254-8eae3248d9e2, 69c33994-da10-4d71-af6f-4297b592cd94", + "traceId": "a329918b8df24f69a115fdcf51554014", + "evidence": "permissionIds=2085910426835079170", + "checkedAt": "2026-08-08T02:06:15.711Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a12e8d0b-619e-484c-a87d-01c3c0627a07, 812360ac-8166-47b0-a9e9-b9b4e254019f", + "traceId": "d48529d58efe4a57a7d35777318370e0", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.740Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a12e8d0b-619e-484c-a87d-01c3c0627a07, 812360ac-8166-47b0-a9e9-b9b4e254019f", + "traceId": "d48529d58efe4a57a7d35777318370e0", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:06:15.740Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c6ab8697-2de6-4061-9ec7-519567f595f0, 346afac0-f582-4566-9e51-857ca5f51b28", + "traceId": "b3eb0a0e3c234de1808cc2d1392f57a5", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.773Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c6ab8697-2de6-4061-9ec7-519567f595f0, 346afac0-f582-4566-9e51-857ca5f51b28", + "traceId": "b3eb0a0e3c234de1808cc2d1392f57a5", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T02:06:15.774Z" + }, + { + "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": "74ddf40f-645a-415d-b5ff-f7bf2d325bbb, 037108db-c2a9-4716-a0f7-86f3c2e90f57", + "traceId": "e6efa81b45ed476e977d23d68e0c966c", + "evidence": "", + "checkedAt": "2026-08-08T02:06:15.800Z" + }, + { + "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": "74ddf40f-645a-415d-b5ff-f7bf2d325bbb, 037108db-c2a9-4716-a0f7-86f3c2e90f57", + "traceId": "e6efa81b45ed476e977d23d68e0c966c", + "evidence": "tenants=1, roles=9", + "checkedAt": "2026-08-08T02:06:15.800Z" + }, + { + "module": "system", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16154775800" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e28f60ac-8cde-4f2a-a95d-87e314206e1c, b8aa81cc-d1a6-46d3-bfff-d3f3e1d0e026", + "traceId": "631c6939ec8a461591cc4a9fa24d9531", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T02:06:15.834Z" + }, + { + "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": "5e493d2b-f432-4882-83a5-04db8afc9ca9, 5064ffba-9826-46a4-bf74-60b55c47e45f", + "traceId": "43e8ec11405647fbad712a2abba63ced", + "evidence": "", + "checkedAt": "2026-08-08T02:06:16.178Z" + }, + { + "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": "5e493d2b-f432-4882-83a5-04db8afc9ca9, 5064ffba-9826-46a4-bf74-60b55c47e45f", + "traceId": "43e8ec11405647fbad712a2abba63ced", + "evidence": "membershipId=2085910428407943171", + "checkedAt": "2026-08-08T02:06:16.178Z" + }, + { + "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_808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0168448-96d5-4955-a939-069ce31751c9, 42e08e61-3fb9-4aad-a8b4-8a0dba7900e3", + "traceId": "b8eb8dc540cf40a1a4d2c5c91508f036", + "evidence": "", + "checkedAt": "2026-08-08T02:06:16.212Z" + }, + { + "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_808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c0168448-96d5-4955-a939-069ce31751c9, 42e08e61-3fb9-4aad-a8b4-8a0dba7900e3", + "traceId": "b8eb8dc540cf40a1a4d2c5c91508f036", + "evidence": "records=1, missing=none, lastLoginAt=omitted", + "checkedAt": "2026-08-08T02:06:16.213Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085910428407943171" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4624b8d9-072a-4f80-a46e-0ee11299b955, b79a04bc-7263-4e53-ac25-832457bf2ebf", + "traceId": "0333553fd1644a519c38efa406104b8a", + "evidence": "", + "checkedAt": "2026-08-08T02:06:16.324Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085910428407943171" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4624b8d9-072a-4f80-a46e-0ee11299b955, b79a04bc-7263-4e53-ac25-832457bf2ebf", + "traceId": "0333553fd1644a519c38efa406104b8a", + "evidence": "membershipId=2085910428407943171", + "checkedAt": "2026-08-08T02:06:16.324Z" + }, + { + "module": "system", + "scenario": null, + "name": "新建内部用户可使用初始密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "26b8a221-8049-4e46-b3d3-b39e5ff8b53a, 0d6b8800-cb03-4725-8a8f-6425629206d6", + "traceId": "fea89bb5368a49209aecd7b7ae160bad", + "evidence": "username=admin_accept_808020614529", + "checkedAt": "2026-08-08T02:06:16.659Z" + }, + { + "module": "system", + "scenario": null, + "name": "重置平台内部用户密码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085910428407943171/password" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7bcd4065-9f66-4c33-833d-b89a17e07464, 3b35696b-758a-4f4a-8245-d71980f03ead", + "traceId": "b7c4b863314f443b8bbaa3048a39e72d", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.032Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户使用重置密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6fca88ef-eaf7-4833-b869-65aaecf5f6b5, 06333868-58fb-4c33-913f-dd8395963f3e", + "traceId": "c35fbbe287d343b09d83a4a8bd6aca51", + "evidence": "username=admin_accept_808020614529", + "checkedAt": "2026-08-08T02:06:17.357Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085910428407943171/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3eef8f9f-cd4e-42f2-a5a7-d0aec6f449ed, 35249cd3-772e-41be-a01d-ad70d5b2ad4c", + "traceId": "44bd503e84e544f48a8bb185e4bc2624", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.453Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户停用状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085910428407943171/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3eef8f9f-cd4e-42f2-a5a7-d0aec6f449ed, 35249cd3-772e-41be-a01d-ad70d5b2ad4c", + "traceId": "44bd503e84e544f48a8bb185e4bc2624", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:06:17.453Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用用户禁止登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "6ad99565-ba87-4050-843d-d109f7035a1d", + "traceId": "30f906cb4ca44ad39640ba85cc9c86e9", + "evidence": "HTTP=200, code=A0403", + "checkedAt": "2026-08-08T02:06:17.489Z" + }, + { + "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": "71a0e791-6dad-4a9e-81d7-d8258c7b0c2a, 1c612c07-0c36-4a1f-9d1c-70adbe4e9e92", + "traceId": "a33b090ec30c47ca9616e4f2f8e19e4b", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.523Z" + }, + { + "module": "system", + "scenario": "system-role-protection", + "name": "已分配成员的角色禁止删除", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/roles/2085910427363561473" + }, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "1840a995-0e8d-4ad2-b657-5dde1bf10870", + "traceId": "42614f4da10e4f679fe368dfa5d60f8d", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:06:17.550Z" + }, + { + "module": "system", + "scenario": null, + "name": "清理时停用测试角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a4fe8d2d-5f5d-4207-b459-98cbf299127d, bbd9d4c4-292d-4b55-8c76-8feddb40e360", + "traceId": "0007c440b1d8496b8639a8fe4c3de4a1", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.587Z" + }, + { + "module": "system", + "scenario": null, + "name": "保留测试角色处于停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085910427363561473/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a4fe8d2d-5f5d-4207-b459-98cbf299127d, bbd9d4c4-292d-4b55-8c76-8feddb40e360", + "traceId": "0007c440b1d8496b8639a8fe4c3de4a1", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T02:06:17.587Z" + }, + { + "module": "system", + "scenario": null, + "name": "删除临时权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/permissions/2085910426835079170" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "529e334d-a198-43d1-93e1-555242cf9748, 750ea4e0-4bb8-4378-b8e2-ceadd2e3a7ba", + "traceId": "e03d264bf03b405d80db37177171b1ee", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.616Z" + }, + { + "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": "d06cbc09-c844-4211-ab32-bddf58695ad8, 17b0b2fe-0140-4073-8f66-18412b219950", + "traceId": "a41fbbbedd6040baa611de08875d6308", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.659Z" + }, + { + "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": "d06cbc09-c844-4211-ab32-bddf58695ad8, 17b0b2fe-0140-4073-8f66-18412b219950", + "traceId": "a41fbbbedd6040baa611de08875d6308", + "evidence": "total=268", + "checkedAt": "2026-08-08T02:06:17.659Z" + }, + { + "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": "073bcd50-1698-4dd8-9db3-f3aed7c5f31c, e020253b-f168-4e10-adad-2cffb30505c4", + "traceId": "d470795fc3f445d680af63f8d87ee92a", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.706Z" + }, + { + "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": "073bcd50-1698-4dd8-9db3-f3aed7c5f31c, e020253b-f168-4e10-adad-2cffb30505c4", + "traceId": "d470795fc3f445d680af63f8d87ee92a", + "evidence": "warehouseId=2085910436097605633", + "checkedAt": "2026-08-08T02:06:17.707Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询平台仓库详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085910436097605633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1ea70150-760b-401f-95ec-77c01f53c9ed, cebba3d3-aeb2-47e4-a824-bff1658034fe", + "traceId": "439e56a37ad34b1e9f4ff92a068b9f09", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.728Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库详情、地址和能力正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085910436097605633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1ea70150-760b-401f-95ec-77c01f53c9ed, cebba3d3-aeb2-47e4-a824-bff1658034fe", + "traceId": "439e56a37ad34b1e9f4ff92a068b9f09", + "evidence": "addresses=1, capabilities=1", + "checkedAt": "2026-08-08T02:06:17.728Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/warehouse-admin/2085910436097605633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6896fbb-934a-4481-8a5f-c98118008a36, 0cf2ccde-03d3-4d6b-b4fc-13294758a029", + "traceId": "1c7802c6fc6242b3924fb12948aa71e2", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.767Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085910436097605633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ba952aea-5cb0-4812-a09b-9284826b0c16, a28b3936-639d-451c-b215-66f7452466d9", + "traceId": "3471523233ed47f89433ebd7dc0ef806", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.796Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085910436097605633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ba952aea-5cb0-4812-a09b-9284826b0c16, a28b3936-639d-451c-b215-66f7452466d9", + "traceId": "3471523233ed47f89433ebd7dc0ef806", + "evidence": "warehouseId=2085910436097605633", + "checkedAt": "2026-08-08T02:06:17.796Z" + }, + { + "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": "36c7d61b-e4cc-4fc4-b678-04d10fd69062, 80f77948-04f4-4dc5-8c44-4f4d5ce8c1d9", + "traceId": "192b44a16adf4773b9fd581d0a21e6b1", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.838Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询库位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085910436676419585?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d4e66096-cee9-4077-bfa3-2f1bbd5ec4b5, a470edef-e2b8-43da-8d43-ac2ceb78b5d7", + "traceId": "178d500ca2604d72935c1c053e79502f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.861Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085910436676419585?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d4e66096-cee9-4077-bfa3-2f1bbd5ec4b5, a470edef-e2b8-43da-8d43-ac2ceb78b5d7", + "traceId": "178d500ca2604d72935c1c053e79502f", + "evidence": "locationId=2085910436676419585", + "checkedAt": "2026-08-08T02:06:17.861Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/locations/2085910436676419585?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "68b5fd92-4ec7-4d34-bdd8-d37ec2121c56, db3d361b-4166-4adc-bae2-2015bf070b87", + "traceId": "f298351b045e4c78b4c6ce9da20f86bb", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.901Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085910436676419585?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "acb39bdd-4615-4e4c-9532-a1e1d74bf7f6, 6c84a2ab-e635-44a1-9cea-1921dbeef16e", + "traceId": "28cb2bf1f9cf4493af0c596d4d86375a", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.927Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位编辑与版本递增正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085910436676419585?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "acb39bdd-4615-4e4c-9532-a1e1d74bf7f6, 6c84a2ab-e635-44a1-9cea-1921dbeef16e", + "traceId": "28cb2bf1f9cf4493af0c596d4d86375a", + "evidence": "version=1", + "checkedAt": "2026-08-08T02:06:17.928Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/locations/2085910436676419585/status?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d0a8c5d5-99ca-4338-80e8-377b38622f3a, 7b04fbc0-3544-4cbd-9cc9-0c341a2bda16", + "traceId": "b99632b56b284e00bede1d75bd8939f2", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.965Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未占用测试库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/locations/2085910436676419585?tenantId=0&warehouseId=2085910436097605633&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c60d3106-133a-4cea-8575-bbf62e7d67de, 6ed13f58-313f-4dfd-b8ab-a945b757e647", + "traceId": "657182ec34fe47d6b43141ac841b838f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:17.994Z" + }, + { + "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": "31f0983b-715f-48c1-80ad-c88b36de09c1, 5fe1b496-5106-45d9-8952-dd2121babd95", + "traceId": "08daf46482ed450c87c5d14a01a65bc2", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.024Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询托盘详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085910437460754434?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dcd8a6f4-8e6f-4619-a333-134eaa41007e, edc884e2-054c-43cf-a162-b6cce7a0b9c4", + "traceId": "481d96058ff74d11b19674d1d9373ead", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.052Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085910437460754434?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dcd8a6f4-8e6f-4619-a333-134eaa41007e, edc884e2-054c-43cf-a162-b6cce7a0b9c4", + "traceId": "481d96058ff74d11b19674d1d9373ead", + "evidence": "palletId=2085910437460754434", + "checkedAt": "2026-08-08T02:06:18.052Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/pallets/2085910437460754434?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5c061dad-e47d-40e6-bdf4-e63db02696a5, 9b940ac3-ec5b-4c4d-a5c2-d9b26d942e32", + "traceId": "ba95682fc74c4d779a93a42476bd2db6", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.089Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085910437460754434?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39f23b4f-2d95-4ca1-9ae4-8ceb3cadac8b, fdf0d1fa-7997-42c5-b9f7-6932ead0751b", + "traceId": "e670834576d34e7694f3ba4657b9a7c5", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.110Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085910437460754434?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39f23b4f-2d95-4ca1-9ae4-8ceb3cadac8b, fdf0d1fa-7997-42c5-b9f7-6932ead0751b", + "traceId": "e670834576d34e7694f3ba4657b9a7c5", + "evidence": "palletId=2085910437460754434", + "checkedAt": "2026-08-08T02:06:18.110Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未使用测试托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/pallets/2085910437460754434?tenantId=0&warehouseId=2085910436097605633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d1af3bbd-3cf0-4bb9-b302-f999c73d888c, 2da7d53d-2bdb-4d08-8de4-bdd71b12a3a3", + "traceId": "992ba58fab164d0d8a07ea68532a8ffe", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.150Z" + }, + { + "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": "fc39f408-f247-4b80-b0c7-09b59ebd3c4a, e94b41b0-85b6-4af1-8dc1-3f3732fa465e", + "traceId": "0f02be265e054bb7b99e655c4adad4c5", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.180Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询快递公司详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085910438115065857?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8f6e7be4-b24e-407e-ba1e-d1c982102600, acda0994-e3c9-490f-a49e-f7665c66a785", + "traceId": "eb087148a74442aeb1becf32ede56728", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.205Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085910438115065857?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8f6e7be4-b24e-407e-ba1e-d1c982102600, acda0994-e3c9-490f-a49e-f7665c66a785", + "traceId": "eb087148a74442aeb1becf32ede56728", + "evidence": "expressId=2085910438115065857", + "checkedAt": "2026-08-08T02:06:18.205Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/express-companies/2085910438115065857?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3d9384c7-ac7f-40b9-b140-44fe3c264b16, e47a5e82-a89d-4fe7-a72c-85d092c1ef8f", + "traceId": "592d8bf2da204018bc0c6a358ec430ce", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.242Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/express-companies/2085910438115065857/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8217519a-2a20-4257-99a7-d386f423fef9, 8ce8dece-4cdb-48c1-b471-7f6e8daf0a70", + "traceId": "b894ba0284f1460d887ddf9ba57b2e52", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.271Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选快递公司列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "febadf7e-c27e-4da3-9ff4-535030afc37d, c49b89c5-4c4f-495b-acb5-5252711dd715", + "traceId": "fa0cd869fe9043d797493742cb5e7a42", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.328Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司列表回显停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "febadf7e-c27e-4da3-9ff4-535030afc37d, c49b89c5-4c4f-495b-acb5-5252711dd715", + "traceId": "fa0cd869fe9043d797493742cb5e7a42", + "evidence": "records=1", + "checkedAt": "2026-08-08T02:06:18.328Z" + }, + { + "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": "22f6e40c-d665-4db1-a812-bb7d416895b5, 43705c71-c3df-492d-8670-4b75b1af27ec", + "traceId": "29c46d10b588470fa869c26823a7157f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.369Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询往来单位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085910438903595009?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a3eb9b40-25fc-4f88-ac9d-559bed964c73, 26fdfc02-8ddc-4658-8b86-44e1d5c57fa9", + "traceId": "954cd4c54fc94341a713f724bb8111cd", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.407Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085910438903595009?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a3eb9b40-25fc-4f88-ac9d-559bed964c73, 26fdfc02-8ddc-4658-8b86-44e1d5c57fa9", + "traceId": "954cd4c54fc94341a713f724bb8111cd", + "evidence": "partnerId=2085910438903595009", + "checkedAt": "2026-08-08T02:06:18.407Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/partners/2085910438903595009?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f97baae5-0262-4b0c-8c20-39d139dd3fed, c887fba9-6f0a-4364-bc9a-ea19afb8b1d7", + "traceId": "1173c6b6a2bc43f884735c4c6daac365", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.446Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/partners/2085910438903595009/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ae38c9cf-4b85-4b5e-bde9-24d738cec213, d47b9b6f-aeb3-40a1-9fdb-894fa46207f0", + "traceId": "4f11b0dd8b8d4ba6bc4fb3c868af36ad", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.489Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选往来单位列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3b6b95d4-f04d-4784-992e-bd7b632004e1, 4aada877-588f-4033-8752-c679995b6536", + "traceId": "c95377e76d514d97826a17052402fb2b", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.516Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位列表回显编辑与停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808020614529" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3b6b95d4-f04d-4784-992e-bd7b632004e1, 4aada877-588f-4033-8752-c679995b6536", + "traceId": "c95377e76d514d97826a17052402fb2b", + "evidence": "records=1", + "checkedAt": "2026-08-08T02:06:18.516Z" + }, + { + "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": "16f91e26-6ceb-48c8-a724-04b7cd9e2aa6, eba2eb2d-fba8-40fc-b5b2-b347e08770aa", + "traceId": "682b798d7f5b4dc9ad5f5388095c48fc", + "evidence": "bytes=3852, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:06:18.563Z" + }, + { + "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": "915dd806-abcc-4e22-a47b-93ecf7414f8a, 0878a1cd-8d97-4ea4-9e47-910e9aa46af3", + "traceId": "5a9f3c28122641a0974a17bb7199ade2", + "evidence": "bytes=3691, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:06:18.606Z" + }, + { + "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": "516f9b73-29d0-4b9b-8e4b-99d880c290b6, 165fcf64-a088-46e6-be31-e8e791cb9d9c", + "traceId": "feb2d1b486cb4d8b9debf766c97f4e7e", + "evidence": "bytes=3829, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:06:18.646Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用测试仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/warehouse-admin/2085910436097605633/status?tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dffc2b93-97dc-4283-abe6-9370f0b86ca1, 82d42cf1-5849-4a6e-a0ee-af54e8462456", + "traceId": "745b79ff36854615917c5b6f44402bb2", + "evidence": "", + "checkedAt": "2026-08-08T02:06:18.688Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dd5982be-f33f-4f17-ac3a-dab0a1311be3, 62c31526-5bde-4702-aac8-05721c278cb7", + "traceId": "48c5c073c69d44a39ef7f7af8a6c6163", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:06:19.015Z" + }, + { + "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": "75909ee1-bc43-46a1-bdb9-6f43936bb3b8, acef3b1a-844b-4d56-a877-ea428ab1ea89", + "traceId": "3eea6bb04a2f42bfbb7bcca702f95ac5", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.048Z" + }, + { + "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": "75909ee1-bc43-46a1-bdb9-6f43936bb3b8, acef3b1a-844b-4d56-a877-ea428ab1ea89", + "traceId": "3eea6bb04a2f42bfbb7bcca702f95ac5", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:06:19.048Z" + }, + { + "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": "a5993963-fe98-46c0-a2c5-6b31fca63293, d5d071bc-96c5-4d9e-be25-8178336096be", + "traceId": "2035bf8f0c9242fdbb4913806d5d4dcf", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:06:19.083Z" + }, + { + "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": "a5993963-fe98-46c0-a2c5-6b31fca63293, d5d071bc-96c5-4d9e-be25-8178336096be", + "traceId": "2035bf8f0c9242fdbb4913806d5d4dcf", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:06:19.083Z" + }, + { + "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": "bd9eb8b5-dc3d-48de-9571-c272306f0eb0, dbb30b28-6e97-4d18-8a8c-8e882ed1948a", + "traceId": "d99afb69383d43788e4e2598e5b34379", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.118Z" + }, + { + "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": "bd9eb8b5-dc3d-48de-9571-c272306f0eb0, dbb30b28-6e97-4d18-8a8c-8e882ed1948a", + "traceId": "d99afb69383d43788e4e2598e5b34379", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:06:19.118Z" + }, + { + "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": "9465b821-111d-43f2-a94e-392af1403e2e, 17771ccb-938b-4e3f-b835-9b19b805228d", + "traceId": "164d88b148d2434abc2c435116af9f88", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.170Z" + }, + { + "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": "9465b821-111d-43f2-a94e-392af1403e2e, 17771ccb-938b-4e3f-b835-9b19b805228d", + "traceId": "164d88b148d2434abc2c435116af9f88", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:06:19.170Z" + }, + { + "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": "27c4def7-ecf3-4af0-a731-9e27ec1a5035, d8f625ed-cff2-4194-ab02-8032f1a32364", + "traceId": "82edc760ea1749aca3daf3b26acc70cd", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.224Z" + }, + { + "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": "27c4def7-ecf3-4af0-a731-9e27ec1a5035, d8f625ed-cff2-4194-ab02-8032f1a32364", + "traceId": "82edc760ea1749aca3daf3b26acc70cd", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:06:19.224Z" + }, + { + "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": "8949f011-6226-4205-9580-53158c3bfe56, 00100635-c4ab-4c1c-b911-b92314cd682c", + "traceId": "888d89a9f713491694af728675c08660", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.255Z" + }, + { + "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": "98f1a2a7-c079-43c2-b590-5b155c3cb402, 1de2071f-c03e-4604-a91a-565bf375b342", + "traceId": "34d12bfa0db34038a1361b3c35f9d8e7", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:06:19.291Z" + }, + { + "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": "98f1a2a7-c079-43c2-b590-5b155c3cb402, 1de2071f-c03e-4604-a91a-565bf375b342", + "traceId": "34d12bfa0db34038a1361b3c35f9d8e7", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:06:19.291Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085910442774429697" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "2fa832bf-15c4-434d-9491-b115e2f80446, 22723944-3ac4-4bd4-981c-8d8e46e4d0a4", + "traceId": "997c4e6bf49e4f1c9230e6e547d2ce0d", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:06:19.312Z" + }, + { + "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": "50c1ec60-8f22-42e6-a954-e040a4acf6d6, 0868983d-b3d2-4fe4-8133-841b3ad81bd7", + "traceId": "ac59d32311b44033b5a3f2fb112e5324", + "evidence": "marker=ADMIN-API-20260808020614529", + "checkedAt": "2026-08-08T02:06:19.382Z" + }, + { + "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": "14ff04e5-fad0-428f-b2a5-e370e70e8fca, 354a1209-414e-459c-843d-12f85b5362b8", + "traceId": "52c429df86f8482494f16d4bc4ef97ea", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.410Z" + }, + { + "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": "14ff04e5-fad0-428f-b2a5-e370e70e8fca, 354a1209-414e-459c-843d-12f85b5362b8", + "traceId": "52c429df86f8482494f16d4bc4ef97ea", + "evidence": "orderId=2085910443126751234, replayedId=2085910443126751234", + "checkedAt": "2026-08-08T02:06:19.410Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910443126751234" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "302f370b-1eb9-4ffc-9564-7e5eea08dee2, 96fe3e29-9607-4b1f-a4f0-4554062a124b", + "traceId": "c14688ef1fa7420c881321bf0f421f12", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.438Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910443126751234" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "302f370b-1eb9-4ffc-9564-7e5eea08dee2, 96fe3e29-9607-4b1f-a4f0-4554062a124b", + "traceId": "c14688ef1fa7420c881321bf0f421f12", + "evidence": "orderNo=FL2085910443126751234, status=DRAFT", + "checkedAt": "2026-08-08T02:06:19.438Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910443126751234" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "302f370b-1eb9-4ffc-9564-7e5eea08dee2, 96fe3e29-9607-4b1f-a4f0-4554062a124b", + "traceId": "c14688ef1fa7420c881321bf0f421f12", + "evidence": "cargoes=4, imageFileId=2085910442774429697", + "checkedAt": "2026-08-08T02:06:19.439Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085910443126751234/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4f837162-62e1-4feb-a1cb-51c684451ccd, 9929748a-897a-41b7-8969-fff502417e02", + "traceId": "44a81360b7394673b32f1c27af94849f", + "evidence": "orderId=2085910443126751234", + "checkedAt": "2026-08-08T02:06:19.500Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910443126751234" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fca6d4cf-4af9-4702-8bf6-82cb02d48698, 4fb6d118-61eb-47bf-a197-1c971c0c32c8", + "traceId": "7aa753da7219428989d41e1e1b45cc55", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.532Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910443126751234" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fca6d4cf-4af9-4702-8bf6-82cb02d48698, 4fb6d118-61eb-47bf-a197-1c971c0c32c8", + "traceId": "7aa753da7219428989d41e1e1b45cc55", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:06:19.532Z" + }, + { + "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=FL2085910443126751234" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "115d7a75-c4e4-4a57-9299-8f04b809efc0, 457e2670-2535-489d-9bd5-d2940871e891", + "traceId": "8d620fd7a25542ebb0c4283fdbcc3d95", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.568Z" + }, + { + "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=FL2085910443126751234" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "115d7a75-c4e4-4a57-9299-8f04b809efc0, 457e2670-2535-489d-9bd5-d2940871e891", + "traceId": "8d620fd7a25542ebb0c4283fdbcc3d95", + "evidence": "orderId=2085910443126751234, found=true", + "checkedAt": "2026-08-08T02:06:19.568Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "26ed7979-9473-4890-ada4-35a6e42a6412, 0fcf6436-d2d9-49b2-b626-8bf78ea65616", + "traceId": "928cd506354243a19bde77e4a92e6a55", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.596Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "26ed7979-9473-4890-ada4-35a6e42a6412, 0fcf6436-d2d9-49b2-b626-8bf78ea65616", + "traceId": "928cd506354243a19bde77e4a92e6a55", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:06:19.596Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910443126751234&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "20dcdddb-fdf0-4e0a-aa77-5f8235776852, bd20f935-1012-478c-9926-8e7b14800267", + "traceId": "e122df44f3084a9c9d879e97224e2263", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.625Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910443126751234&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "20dcdddb-fdf0-4e0a-aa77-5f8235776852, bd20f935-1012-478c-9926-8e7b14800267", + "traceId": "e122df44f3084a9c9d879e97224e2263", + "evidence": "orderId=2085910443126751234, found=true", + "checkedAt": "2026-08-08T02:06:19.625Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e8238c02-c341-47b8-b527-290ea0977dab, 2173dd69-ddc2-4a5a-a1ef-8a579125900b", + "traceId": "c566220d05a8477b9a822db034480345", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.659Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e8238c02-c341-47b8-b527-290ea0977dab, 2173dd69-ddc2-4a5a-a1ef-8a579125900b", + "traceId": "c566220d05a8477b9a822db034480345", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:06:19.659Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e8238c02-c341-47b8-b527-290ea0977dab, 2173dd69-ddc2-4a5a-a1ef-8a579125900b", + "traceId": "c566220d05a8477b9a822db034480345", + "evidence": "cargoes=4, imageFileId=2085910442774429697", + "checkedAt": "2026-08-08T02:06:19.659Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "049ece83-6615-4ef2-966e-59d03654f6d9, 1a929349-e47f-49bd-ba3c-ea8f9fba7b63", + "traceId": "74470f771c7045a9bf80f3ce2b4aef12", + "evidence": "", + "checkedAt": "2026-08-08T02:06:19.690Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "932392ef-5f90-454f-9213-dd9825ff9d7b, 775d7d59-8602-4bc4-8685-26563d105a8f", + "traceId": "0e81101352fa46a8a1b96948fb7f8f97", + "evidence": "orderId=2085910443126751234", + "checkedAt": "2026-08-08T02:06:19.724Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "600665d6-e9b5-446e-b502-e015c540734f, 98e8ecbb-a290-470f-a857-3119811610d2", + "traceId": "27a759fe7acf47fb884c9fecc1bb4437", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:21.875Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910450967982082?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "55340b3d-433c-4adc-8a86-bf51d2ff4685, 5a6befb5-a58e-47f2-b392-643130787819", + "traceId": "1c65842b72974d4b96859fa4193dc099", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:21.906Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910450967982082?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "55340b3d-433c-4adc-8a86-bf51d2ff4685, 5a6befb5-a58e-47f2-b392-643130787819", + "traceId": "1c65842b72974d4b96859fa4193dc099", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:06:21.907Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910450967982082?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "55340b3d-433c-4adc-8a86-bf51d2ff4685, 5a6befb5-a58e-47f2-b392-643130787819", + "traceId": "1c65842b72974d4b96859fa4193dc099", + "evidence": "inboundId=2085910450967982082, history=1", + "checkedAt": "2026-08-08T02:06:21.907Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910443126751234&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7c98b816-fd4b-47a2-901d-089ed51dabb4, 7fb5abfc-4c12-4dda-a74f-033e38545450", + "traceId": "a18139d9a8bf45c3a91c761123fb9f14", + "evidence": "", + "checkedAt": "2026-08-08T02:06:21.943Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910443126751234&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7c98b816-fd4b-47a2-901d-089ed51dabb4, 7fb5abfc-4c12-4dda-a74f-033e38545450", + "traceId": "a18139d9a8bf45c3a91c761123fb9f14", + "evidence": "inboundId=2085910450967982082, total=1", + "checkedAt": "2026-08-08T02:06:21.943Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "8f433833-6736-4b7a-9637-0ebbf7a34843", + "traceId": "888ab53b508f40528de5c08a7c5ed1d0", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:06:21.972Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "8f433833-6736-4b7a-9637-0ebbf7a34843", + "traceId": "888ab53b508f40528de5c08a7c5ed1d0", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:06:21.972Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "416c8ca2-738f-46c8-947e-1e44b905d6a7, f505711a-08e4-41a9-8c85-4bc3366bb3dd", + "traceId": "b495db03ff184dfbb82e4d020ebae2a4", + "evidence": "", + "checkedAt": "2026-08-08T02:06:22.003Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "15fb40db-d405-4334-a6ea-30ee24b0301e, 8a135948-c504-4da7-98b2-c7f37d2d1120", + "traceId": "90f4ba82d45443cea86039393b2fb467", + "evidence": "", + "checkedAt": "2026-08-08T02:06:22.038Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9be67f26-c47d-427e-a69f-b0987880e4c7, a197057c-7e07-438f-acb9-3a67ec399c3a", + "traceId": "e3ab1528d57f45f68c4bc77f87f3aa4f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:22.075Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910443126751234?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9be67f26-c47d-427e-a69f-b0987880e4c7, a197057c-7e07-438f-acb9-3a67ec399c3a", + "traceId": "e3ab1528d57f45f68c4bc77f87f3aa4f", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:06:22.076Z" + }, + { + "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": "90048aae-2cbf-4ab2-9521-2564d60e81f2, 0f1b77d9-5802-4947-8d68-43108cfdb5aa", + "traceId": "b5e9f9da6abc4f1cac53c4452f2fa14f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:22.104Z" + }, + { + "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": "90048aae-2cbf-4ab2-9521-2564d60e81f2, 0f1b77d9-5802-4947-8d68-43108cfdb5aa", + "traceId": "b5e9f9da6abc4f1cac53c4452f2fa14f", + "evidence": "versions=9, active=1", + "checkedAt": "2026-08-08T02:06:22.104Z" + }, + { + "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-20260808020614529-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T02:06:22.106Z" + }, + { + "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": "71dc2644-b051-4b9a-9fb1-678a1133af28, 47b46bc0-46a1-409c-a2ca-f8e1f8fb6b44", + "traceId": "3272f59074aa466bab2435c47c197a17", + "evidence": "fileName=ADMIN-API-20260808020614529-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T02:06:23.689Z" + }, + { + "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": "71dc2644-b051-4b9a-9fb1-678a1133af28, 47b46bc0-46a1-409c-a2ca-f8e1f8fb6b44", + "traceId": "3272f59074aa466bab2435c47c197a17", + "evidence": "versionId=2085910455296503809, status=PENDING_CONFIRMATION, fileName=ADMIN-API-20260808020614529-2026.08.03柏悦价格表 船期2026.08.12.xlsx, shaMatched=true", + "checkedAt": "2026-08-08T02:06:23.690Z" + }, + { + "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": "71dc2644-b051-4b9a-9fb1-678a1133af28, 47b46bc0-46a1-409c-a2ca-f8e1f8fb6b44", + "traceId": "3272f59074aa466bab2435c47c197a17", + "evidence": "channelCount=15, unique=15, missing=none", + "checkedAt": "2026-08-08T02:06:23.690Z" + }, + { + "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": "71dc2644-b051-4b9a-9fb1-678a1133af28, 47b46bc0-46a1-409c-a2ca-f8e1f8fb6b44", + "traceId": "3272f59074aa466bab2435c47c197a17", + "evidence": "rateCount=2157, declared=2157, valid=true", + "checkedAt": "2026-08-08T02:06:23.690Z" + }, + { + "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": "71dc2644-b051-4b9a-9fb1-678a1133af28, 47b46bc0-46a1-409c-a2ca-f8e1f8fb6b44", + "traceId": "3272f59074aa466bab2435c47c197a17", + "evidence": "blocking=0, unexpected=none, infrastructure=none", + "checkedAt": "2026-08-08T02:06:23.690Z" + }, + { + "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": "11744005-4e78-4502-ba1c-dc7518a7be77, 52879477-238a-4cf4-a57b-b0b5d19cf1c2", + "traceId": "928aeff4e99848339373736bf32def6e", + "evidence": "", + "checkedAt": "2026-08-08T02:06:23.726Z" + }, + { + "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": "11744005-4e78-4502-ba1c-dc7518a7be77, 52879477-238a-4cf4-a57b-b0b5d19cf1c2", + "traceId": "928aeff4e99848339373736bf32def6e", + "evidence": "pending=PENDING_CONFIRMATION, activeBefore=2085909925908230146, activeAfterUpload=2085909925908230146", + "checkedAt": "2026-08-08T02:06:23.726Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询待确认版本渠道和价格预览", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085910455296503809" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "73946323-15c5-4ad3-82b3-24be61f6bb8b, ec0b326e-0c03-4250-934f-89f1b7140931", + "traceId": "b0876098755b4094b4e3c542a8b1b5d1", + "evidence": "", + "checkedAt": "2026-08-08T02:06:23.819Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "详情与上传解析结果一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085910455296503809" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "73946323-15c5-4ad3-82b3-24be61f6bb8b, ec0b326e-0c03-4250-934f-89f1b7140931", + "traceId": "b0876098755b4094b4e3c542a8b1b5d1", + "evidence": "versionId=2085910455296503809, channels=15, rates=2157, issues=2", + "checkedAt": "2026-08-08T02:06:23.819Z" + }, + { + "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/2085910455296503809/source" + }, + "http": 200, + "code": null, + "message": "1343413 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "d689e856-a74f-4494-abb4-b57ba7b6fa17, f6d97a31-65ff-4706-82f7-03e1a6593214, 81375e15-6e82-43cf-acb5-efb4faa0d74b", + "traceId": "56cd8dd9de7d459a87502d8d3a7dcfc3, 625bfd19a9ae46a3b61f284fdb638372", + "evidence": "bytes=1343413, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, zipMagic=true, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T02:06:23.951Z" + }, + { + "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": "d21c5b5c-d005-4c0f-86e3-1fe574a083dd, c998bdee-77a3-46a6-8f58-3dfe25c74551", + "traceId": "3fa9fc05b805473c971e8eb3c49a6255", + "evidence": "", + "checkedAt": "2026-08-08T02:06:23.975Z" + }, + { + "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": "55e7543c-814c-4210-bd90-df22c4c47d55, 9f48e719-c894-4b2b-b698-1a8ca325400a", + "traceId": "e0fb9398ea584ad9a6f558e4de62042c", + "evidence": "", + "checkedAt": "2026-08-08T02:06:24.007Z" + }, + { + "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": "55e7543c-814c-4210-bd90-df22c4c47d55, 9f48e719-c894-4b2b-b698-1a8ca325400a", + "traceId": "e0fb9398ea584ad9a6f558e4de62042c", + "evidence": "origins=CN-DONGGUAN-01->193000000000200002,CN-YIWU-01->193000000000200001, overseas=纽约仓->193000000000200004,洛杉矶仓->193000000000200003, missing=none", + "checkedAt": "2026-08-08T02:06:24.008Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "确认仓库映射并立即生效", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085910455296503809/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc1c0e66-a8c7-466c-830b-bb29781bcb77, 16dd6fff-0260-407f-95e8-b0522a7ff767", + "traceId": "e1c197eef26049349bf12da416ac9597", + "evidence": "versionId=2085910455296503809, originMappings=2, overseasMappings=2", + "checkedAt": "2026-08-08T02:06:25.590Z" + }, + { + "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/2085910455296503809/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc1c0e66-a8c7-466c-830b-bb29781bcb77, 16dd6fff-0260-407f-95e8-b0522a7ff767", + "traceId": "e1c197eef26049349bf12da416ac9597", + "evidence": "status=ACTIVE, blocking=0, publishedAt=2026-08-08T10:06:24.515, channels=15, rates=2157", + "checkedAt": "2026-08-08T02:06:25.590Z" + }, + { + "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": "8f513a62-1954-40d0-b048-5982ade5885a, 06ac7f31-49f9-495c-99b2-bfe506fb1b35", + "traceId": "efd098edc57544cd952cc41cd53f1708", + "evidence": "", + "checkedAt": "2026-08-08T02:06:25.624Z" + }, + { + "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": "8f513a62-1954-40d0-b048-5982ade5885a, 06ac7f31-49f9-495c-99b2-bfe506fb1b35", + "traceId": "efd098edc57544cd952cc41cd53f1708", + "evidence": "active=2085910455296503809", + "checkedAt": "2026-08-08T02:06:25.624Z" + }, + { + "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": "8f513a62-1954-40d0-b048-5982ade5885a, 06ac7f31-49f9-495c-99b2-bfe506fb1b35", + "traceId": "efd098edc57544cd952cc41cd53f1708", + "evidence": "previous=2085909925908230146, superseded=true", + "checkedAt": "2026-08-08T02:06:25.624Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询当前生效价格版本详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085910455296503809" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5ebe259e-45ca-466b-b156-63bf7d5b0387, f63b621b-705c-4d8f-860a-5dbbd9414fdf", + "traceId": "f285f421a9c34c209736a47fc05a70a8", + "evidence": "", + "checkedAt": "2026-08-08T02:06:25.745Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "当前生效版本预览数据完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085910455296503809" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5ebe259e-45ca-466b-b156-63bf7d5b0387, f63b621b-705c-4d8f-860a-5dbbd9414fdf", + "traceId": "f285f421a9c34c209736a47fc05a70a8", + "evidence": "status=ACTIVE, channels=15, rates=2157", + "checkedAt": "2026-08-08T02:06:25.745Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "已生效版本禁止重复发布", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085910455296503809/publish" + }, + "http": 200, + "code": "A0409", + "message": "只有待确认上传记录可以确认并生效", + "requestId": "acabed98-e103-46bd-ae59-4e89c3e8d133", + "traceId": "488a17dfe4d04e19a63ef94a08729071", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:06:25.770Z" + }, + { + "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": "142b0580-e32f-49b2-a35a-cec6e197c265, f59239bb-9d8e-48b7-bafe-5cd281956f12", + "traceId": "fb6ae81b6b0341b09250182ae647b4c6", + "evidence": "", + "checkedAt": "2026-08-08T02:06:25.798Z" + }, + { + "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": "142b0580-e32f-49b2-a35a-cec6e197c265, f59239bb-9d8e-48b7-bafe-5cd281956f12", + "traceId": "fb6ae81b6b0341b09250182ae647b4c6", + "evidence": "active=2085910455296503809", + "checkedAt": "2026-08-08T02:06:25.798Z" + }, + { + "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": "01902564-4e43-4c66-972d-d9f3790bda62, 35b0d7c7-3f21-4032-acd5-7e0d755dcd42", + "traceId": "2d18b2a46fbc4a1993b2fd7b7e88cbb9", + "evidence": "", + "checkedAt": "2026-08-08T02:06:25.842Z" + }, + { + "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": "01902564-4e43-4c66-972d-d9f3790bda62, 35b0d7c7-3f21-4032-acd5-7e0d755dcd42", + "traceId": "2d18b2a46fbc4a1993b2fd7b7e88cbb9", + "evidence": "taskId=2085910470221955073, status=PENDING", + "checkedAt": "2026-08-08T02:06:25.843Z" + }, + { + "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": "b27e6b0a-86f2-4b5b-9474-c0eca16872e0, 9dbf906c-99a5-46ad-8920-94e8bb9afabd", + "traceId": "392681158fd74c4785d45158081cdaa3", + "evidence": "", + "checkedAt": "2026-08-08T02:06:25.882Z" + }, + { + "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": "b27e6b0a-86f2-4b5b-9474-c0eca16872e0, 9dbf906c-99a5-46ad-8920-94e8bb9afabd", + "traceId": "392681158fd74c4785d45158081cdaa3", + "evidence": "records=5", + "checkedAt": "2026-08-08T02:06:25.882Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "轮询导出任务直到终态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085910470221955073" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "31f5395e-4953-4de5-9de4-0969ef4396ad, 49b14616-6f8b-4b88-bec2-6b7d4fb85788", + "traceId": "de32413d5b7f40ca923e5305940fb0ad", + "evidence": "status=SUCCEEDED, processedRows=0", + "checkedAt": "2026-08-08T02:06:29.979Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "查询导出任务详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085910470221955073" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c8f77bf-053a-4d1d-88bb-2bb0585290f3, 3a1e8d80-e465-4178-b7ff-4cf9561e5b8a", + "traceId": "7ccea5a4eba7437b8613fd126cba5823", + "evidence": "", + "checkedAt": "2026-08-08T02:06:30.020Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "导出详情行数和文件元数据正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085910470221955073" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8c8f77bf-053a-4d1d-88bb-2bb0585290f3, 3a1e8d80-e465-4178-b7ff-4cf9561e5b8a", + "traceId": "7ccea5a4eba7437b8613fd126cba5823", + "evidence": "processedRows=0, sizeBytes=4066", + "checkedAt": "2026-08-08T02:06:30.021Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "下载并校验客户列表 XLSX", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085910470221955073/download" + }, + "http": 200, + "code": null, + "message": "4066 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "a4d200cd-9420-4b6c-85b8-cf2f2ba7276d, 954117e8-b4cb-433c-8d7a-aab2ece54df0", + "traceId": "3d041245692f484799abcd29847ea171", + "evidence": "bytes=4066, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T02:06:30.057Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅选择带本轮测试标记的可编辑入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910450967982082?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "740af33e-198f-40cd-8ae9-882e3a0ac304, b273b5bc-ed82-4a81-9f72-d488a6f09a0e", + "traceId": "bb31141e86a147e3a38551a0cdaf7846", + "evidence": "tenantId=10001, inboundId=2085910450967982082, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:06:30.088Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b683eae7-5881-439d-a204-5f6815737361, 9accc97c-8e83-44c0-9dba-319767aebbc2", + "traceId": "0f7130bfe5374fce802e3c5eeff532ae", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:30.118Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b683eae7-5881-439d-a204-5f6815737361, 9accc97c-8e83-44c0-9dba-319767aebbc2", + "traceId": "0f7130bfe5374fce802e3c5eeff532ae", + "evidence": "existingResults=0, baselineWeight=null", + "checkedAt": "2026-08-08T02:06:30.118Z" + }, + { + "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/2085910450967982082" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "2bca7e8a-1721", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T02:06:30.137Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "A0400", + "message": "称重图片仅支持JPG、PNG、BMP", + "requestId": "f567d681-3a05-44bb-a7dc-9d1f46eb2e9b", + "traceId": "591fd3eca77d4b84aaf7306241dfc992", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:06:30.162Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "A0400", + "message": "称重图片不能超过5MB", + "requestId": "d2113e4d-7edb-4525-9f76-9d88b7c0f0a9", + "traceId": "39ac723325fb4fceae5de6ced4aeab62", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T02:06:31.465Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4fcb28c3-95e0-43b0-a8ae-44d1cb2dca89, fd3db3fa-7cde-4455-a329-c2f6aad78ab7", + "traceId": "4440495bb6084b549fa0cb0a6d443619", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:06:33.020Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4fcb28c3-95e0-43b0-a8ae-44d1cb2dca89, fd3db3fa-7cde-4455-a329-c2f6aad78ab7", + "traceId": "4440495bb6084b549fa0cb0a6d443619", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:06:33.020Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4fcb28c3-95e0-43b0-a8ae-44d1cb2dca89, fd3db3fa-7cde-4455-a329-c2f6aad78ab7", + "traceId": "4440495bb6084b549fa0cb0a6d443619", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:06:33.020Z" + }, + { + "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/2085910450967982082/2085910496725762049/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6e9b447-651e-40c8-b611-d0f01d32b4c0, de6cef9e-78e6-4ccf-9359-a56f2fbb8651", + "traceId": "012011c766a84997967976e059d6513d", + "evidence": "fileId=2085910496725762049", + "checkedAt": "2026-08-08T02:06:33.898Z" + }, + { + "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/2085910450967982082/2085910496725762049/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6e9b447-651e-40c8-b611-d0f01d32b4c0, de6cef9e-78e6-4ccf-9359-a56f2fbb8651", + "traceId": "012011c766a84997967976e059d6513d", + "evidence": "sameFile=true, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:06:33.898Z" + }, + { + "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/2085910450967982082/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "695457a1-3004-4080-9d58-c4c964dda701, ab410a51-cf73-4e94-8883-7a831ca646be", + "traceId": "ec9679db6ef84d9aa2574822bfc15c96", + "evidence": "fileId=2085910496725762049", + "checkedAt": "2026-08-08T02:06:33.936Z" + }, + { + "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/2085910450967982082/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "695457a1-3004-4080-9d58-c4c964dda701, ab410a51-cf73-4e94-8883-7a831ca646be", + "traceId": "ec9679db6ef84d9aa2574822bfc15c96", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:06:33.936Z" + }, + { + "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/2085910450967982082/2085910496725762049" + }, + "http": 200, + "code": null, + "message": "3701469 bytes (image/jpeg)", + "requestId": "0c2b9524-dcd4-4840-a0b5-ee2f2640db12, 30b9ae6b-8f42-4339-9bcf-d4653cc2cb68", + "traceId": "60f188b58f434bfa8c8a6f6716e1eb69", + "evidence": "contentType=image/jpeg, bytes=3701469", + "checkedAt": "2026-08-08T02:06:34.075Z" + }, + { + "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/2085910450967982082/2085910496725762049/thumbnail" + }, + "http": 200, + "code": null, + "message": "18677 bytes (image/jpeg)", + "requestId": "1a02e5f7-45f8-4422-bc76-481858e45f30, e352b5e7-9ccb-41d8-867f-17cb37af0530", + "traceId": "702d00d641fd402da401f708a0b30da0", + "evidence": "contentType=image/jpeg, bytes=18677, dimensions=240x320", + "checkedAt": "2026-08-08T02:06:34.461Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "12fe0353-03c9-4c77-9ae5-d8ca9dfcfba5, 3d99bf59-e38b-4091-856c-e566e84f86ba", + "traceId": "dcdeab8bafaf4aff9539a75abc96cc97", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:34.485Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "12fe0353-03c9-4c77-9ae5-d8ca9dfcfba5, 3d99bf59-e38b-4091-856c-e566e84f86ba", + "traceId": "dcdeab8bafaf4aff9539a75abc96cc97", + "evidence": "resultFound=true, baselineCount=0, currentCount=1", + "checkedAt": "2026-08-08T02:06:34.485Z" + }, + { + "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/2085910450967982082/weight-results/2085910504206282754/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "02420290-7483-4dff-8ab2-faa9d7b8196e", + "traceId": "46eb74f2e8af43208978a12ab716af2b", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:06:34.507Z" + }, + { + "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/2085910450967982082/weight-results/2085910504206282754/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d82c63fa-eed2-4d20-a949-756c1d34dd12, 12b622c6-b58b-4e84-81a2-76a3c3b23016", + "traceId": "6d62b32e93c9464abf4163c8b6030ead", + "evidence": "usedOriginal=true", + "checkedAt": "2026-08-08T02:06:34.547Z" + }, + { + "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/2085910450967982082/weight-results/2085910504206282754/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d82c63fa-eed2-4d20-a949-756c1d34dd12, 12b622c6-b58b-4e84-81a2-76a3c3b23016", + "traceId": "6d62b32e93c9464abf4163c8b6030ead", + "evidence": "status=CONFIRMED, version=1, finalKg=285.5", + "checkedAt": "2026-08-08T02:06:34.547Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e21736d2-fcf5-498b-9005-171e42236993, e64ed0c9-10cf-42f4-80b9-05500f1b3e71", + "traceId": "e70af4b2f72d43929d2d9e42e485e3cb", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:34.566Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e21736d2-fcf5-498b-9005-171e42236993, e64ed0c9-10cf-42f4-80b9-05500f1b3e71", + "traceId": "e70af4b2f72d43929d2d9e42e485e3cb", + "evidence": "baseline=null, added=285.5, actual=285.5", + "checkedAt": "2026-08-08T02:06:34.566Z" + }, + { + "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/2085910450967982082/weight-results/2085910504206282754?tenantId=10001&version=0" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "0464c474-bcdc-4932-8a75-28ce6fe80aac", + "traceId": "eb4e247e2e824c1e9989d4070d30606b", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T02:06:34.589Z" + }, + { + "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/2085910450967982082/weight-results/2085910504206282754?tenantId=10001&version=1" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "320c3c1d-7b1a-4cb3-9a93-c8d55f1a7789, b2a1434c-b704-4912-b52a-8cc5b0e26a8c", + "traceId": "ddd34fed461e4ab997a2f049f2941ce1", + "evidence": "resultId=2085910504206282754, version=1", + "checkedAt": "2026-08-08T02:06:34.634Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4bc235c2-14ad-4e90-9820-5b5ed07df157, c59dd193-12f8-4a96-a14d-3dc7bdae815d", + "traceId": "581bf2963b9d489faa9225bc07ff3283", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:34.665Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4bc235c2-14ad-4e90-9820-5b5ed07df157, c59dd193-12f8-4a96-a14d-3dc7bdae815d", + "traceId": "581bf2963b9d489faa9225bc07ff3283", + "evidence": "resultMissing=true, baseline=null, actual=285.5", + "checkedAt": "2026-08-08T02:06:34.665Z" + }, + { + "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/2085910450967982082/2085910496725762049" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "3e540a8f-15b9-4e31-bf9c-54e272a4df0d", + "traceId": "b13ec91f5eed473186a7c5656cad9093", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:06:34.695Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "019d5c06-39b7-4cc7-9fa0-77702d7bf910, 847ec603-284f-4a9f-b06d-0907e8d3d7cd", + "traceId": "2bc4911278a244039fb692b9d735f455", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T02:06:36.195Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "019d5c06-39b7-4cc7-9fa0-77702d7bf910, 847ec603-284f-4a9f-b06d-0907e8d3d7cd", + "traceId": "2bc4911278a244039fb692b9d735f455", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T02:06:36.195Z" + }, + { + "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/2085910450967982082" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "019d5c06-39b7-4cc7-9fa0-77702d7bf910, 847ec603-284f-4a9f-b06d-0907e8d3d7cd", + "traceId": "2bc4911278a244039fb692b9d735f455", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T02:06:36.195Z" + }, + { + "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/2085910450967982082/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7f521cb7-c029-4be1-a4c4-801fb48b8b16, d40775e6-5ee0-4008-b739-905a6e67f87f", + "traceId": "f813b253ef344aabb14585c73f799c7c", + "evidence": "fileId=2085910510181089281", + "checkedAt": "2026-08-08T02:06:36.226Z" + }, + { + "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/2085910450967982082/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7f521cb7-c029-4be1-a4c4-801fb48b8b16, d40775e6-5ee0-4008-b739-905a6e67f87f", + "traceId": "f813b253ef344aabb14585c73f799c7c", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T02:06:36.226Z" + }, + { + "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/2085910450967982082/weight-results/2085910513807044609/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "7b475105-2168-41cd-9b65-1e930f2d561f", + "traceId": "a6a7c123a5304fa699300ce50bec1e27", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:06:36.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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c6d4a015-b69c-43c0-ac6c-ae2edff2570c, fcd7586f-4bba-4db3-903e-43033c4807b2", + "traceId": "546587508453414bbdc9c34dbc6ea523", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:36.283Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c6d4a015-b69c-43c0-ac6c-ae2edff2570c, fcd7586f-4bba-4db3-903e-43033c4807b2", + "traceId": "546587508453414bbdc9c34dbc6ea523", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:06:36.283Z" + }, + { + "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/2085910450967982082/weight-results/2085910513807044609/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "e5d180ad-add1-4eb6-ae61-f441f916f00a", + "traceId": "b07a0e1bbfb640ef98ef9a237bc1513f", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:06:36.313Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "160a367b-8b01-447e-a9c4-b9c716815216, ebc19412-a44b-4724-9612-9e71c0cd29e6", + "traceId": "11ac151926d14f9cbc60e0bb4bddaba9", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:36.346Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "160a367b-8b01-447e-a9c4-b9c716815216, ebc19412-a44b-4724-9612-9e71c0cd29e6", + "traceId": "11ac151926d14f9cbc60e0bb4bddaba9", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:06:36.346Z" + }, + { + "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/2085910450967982082/weight-results/2085910513807044609/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "换算后重量不能小于 0.001 KG", + "requestId": "317831b0-e93d-4d43-9d73-5405f278da55", + "traceId": "e8ddb0abe9d64d91a6dda25c57a54d09", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:06:36.376Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39d1df74-e732-4e8e-ac22-02ab27c26c33, f340f5ac-7fc4-44a4-9ebe-8be07e30a14d", + "traceId": "16b55d472b9a432b83e54c32d96b290e", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:36.406Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39d1df74-e732-4e8e-ac22-02ab27c26c33, f340f5ac-7fc4-44a4-9ebe-8be07e30a14d", + "traceId": "16b55d472b9a432b83e54c32d96b290e", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:06:36.406Z" + }, + { + "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/2085910450967982082/weight-results/2085910513807044609/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: numeric value out of bounds (<15 digits>.<3 digits> expected)", + "requestId": "13425eca-f0f9-4552-b20a-7ea0324f7f01", + "traceId": "a5f24435e8bd4d2cb3ae352119eb1c19", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T02:06:36.436Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec83d233-1394-49a6-b32e-955a76d73753, 477c0d20-f3c9-45f5-a68a-1dd25b22af4d", + "traceId": "46e672fe42484c9b9732d070de5c69bc", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:36.470Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec83d233-1394-49a6-b32e-955a76d73753, 477c0d20-f3c9-45f5-a68a-1dd25b22af4d", + "traceId": "46e672fe42484c9b9732d070de5c69bc", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T02:06:36.470Z" + }, + { + "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/2085910450967982082/weight-results/2085910513807044609/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f602a13b-dfde-4570-8d21-1989a8b9d932, 88ddb334-4ff3-46e6-b950-632654677027", + "traceId": "b020549ca3dc459ca33df33ac857e91b", + "evidence": "adjusted=10.125 LB", + "checkedAt": "2026-08-08T02:06:36.510Z" + }, + { + "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/2085910450967982082/weight-results/2085910513807044609/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f602a13b-dfde-4570-8d21-1989a8b9d932, 88ddb334-4ff3-46e6-b950-632654677027", + "traceId": "b020549ca3dc459ca33df33ac857e91b", + "evidence": "adjusted=10.125 LB, finalKg=4.593, expectedKg=4.593", + "checkedAt": "2026-08-08T02:06:36.510Z" + }, + { + "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/2085910450967982082/weight-results/2085910513807044609?tenantId=10001&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6d20c250-1300-4309-9b3a-fd155d9ea6e0, 646568e7-1bdd-4b0c-ba2f-7eb508f3b309", + "traceId": "04bce2282630459eae196e3fbdff33e0", + "evidence": "resultId=2085910513807044609, version=2", + "checkedAt": "2026-08-08T02:06:36.551Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a1af5929-11dc-4e01-ac69-6f3401918cbf, 8f809e3e-61d8-46c8-94eb-cb107c11e4f1", + "traceId": "0413f33d272347e38cc3a5de9d1f98fb", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:36.575Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a1af5929-11dc-4e01-ac69-6f3401918cbf, 8f809e3e-61d8-46c8-94eb-cb107c11e4f1", + "traceId": "0413f33d272347e38cc3a5de9d1f98fb", + "evidence": "resultMissing=true, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:06:36.575Z" + }, + { + "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/2085910450967982082/2085910510181089281" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "051add95-ab73-40b9-b954-a9742d952bbc", + "traceId": "8524537604d44fc98764177ccfad21ba", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T02:06:36.609Z" + }, + { + "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/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "edcd6877-e3c7-43e9-9f34-535624344c84, 5b25d8cc-443a-4c43-bc8f-4a74af02edc8", + "traceId": "17ce8208bf8d4379874014c8c8c0420d", + "evidence": "inboundId=2085910450967982082", + "checkedAt": "2026-08-08T02:06:36.641Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910450967982082/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "edcd6877-e3c7-43e9-9f34-535624344c84, 5b25d8cc-443a-4c43-bc8f-4a74af02edc8", + "traceId": "17ce8208bf8d4379874014c8c8c0420d", + "evidence": "leftovers=0, baseline=null, actual=4.593", + "checkedAt": "2026-08-08T02:06:36.641Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910450967982082?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8d589fd8-c4a8-4943-b105-3687b25b7658, 25af7c83-9d88-4cb0-86d4-308cc8fa7247", + "traceId": "5e31ef9f58814d71a8a943abc41fa3f6", + "evidence": "inboundId=2085910450967982082, tenantId=10001", + "checkedAt": "2026-08-08T02:06:36.673Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910450967982082?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8d589fd8-c4a8-4943-b105-3687b25b7658, 25af7c83-9d88-4cb0-86d4-308cc8fa7247", + "traceId": "5e31ef9f58814d71a8a943abc41fa3f6", + "evidence": "identity=true, status=MEASURING", + "checkedAt": "2026-08-08T02:06:36.673Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910450967982082?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8d589fd8-c4a8-4943-b105-3687b25b7658, 25af7c83-9d88-4cb0-86d4-308cc8fa7247", + "traceId": "5e31ef9f58814d71a8a943abc41fa3f6", + "evidence": "inboundCode=present, totalPackageCount=missing", + "checkedAt": "2026-08-08T02:06:36.673Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020653.json b/reports/admin-test-env-acceptance-20260808020653.json new file mode 100644 index 000000000..004f6e7a1 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020653.json @@ -0,0 +1,1032 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020653996", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:06:58.119Z", + "startedAt": "2026-08-08T02:06:53.996Z", + "success": false, + "fatal": null, + "summary": { + "total": 51, + "passed": 48, + "failed": 3 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T02:06:54.393Z", + "finishedAt": "2026-08-08T02:06:58.091Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T02:06:58.093Z", + "finishedAt": "2026-08-08T02:06:58.119Z", + "success": false, + "passed": 2, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 2, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "2df26ef1-a8a7-4e45-b246-24cbe24643d2", + "traceId": "3e563131ff484ae88f4a9a4b2ad71df8" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "2df26ef1-a8a7-4e45-b246-24cbe24643d2", + "traceId": "3e563131ff484ae88f4a9a4b2ad71df8" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "evidence": "inboundCode=present, totalPackageCount=missing", + "code": "200", + "requestId": "95359fd9-664c-44ad-93a6-dc035401c72e, ba1a1663-0d18-4940-ac6a-a2b9428571de", + "traceId": "09bd34e210964e37b6b66c54b20e0c56" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808020653996", + "tenantId": "10001", + "orderId": "2085910593094090754", + "productImageFileId": "2085910592674660353", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085910602105532418", + "orderNo": "FL2085910593094090754", + "inboundCode": "RK-2085910593094090754", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085910602105532418", + "marker": "ADMIN-API-20260808020653996" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085910602105532418", + "marker": "ADMIN-API-20260808020653996" + } + }, + "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": "3ba2bc0f-dcc0-484c-9807-cfc82332571d, b85abf88-048d-4a82-83f3-288237f9d327", + "traceId": "7719c00c48934950b1a0704b5027cc8f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:54.391Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98da6b14-bced-45e0-bc31-6b444ae379f2, a0ce1181-b29c-4c9c-ad6c-2e7fba59c8a9", + "traceId": "8a4fe224077049ebb5b5dd5454ede5ce", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:06:54.741Z" + }, + { + "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": "3612b98d-ce15-45d9-9541-e124cc20ff13, a6d3b798-4394-4a5e-8a25-94461580f364", + "traceId": "c49394f0126b480296d8552312d74055", + "evidence": "", + "checkedAt": "2026-08-08T02:06:54.764Z" + }, + { + "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": "3612b98d-ce15-45d9-9541-e124cc20ff13, a6d3b798-4394-4a5e-8a25-94461580f364", + "traceId": "c49394f0126b480296d8552312d74055", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:06:54.765Z" + }, + { + "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": "d036d2e5-469b-41d4-a8e2-7ef3f11bbdd9, f432cb92-5b7e-464f-afa6-20643c83c8cf", + "traceId": "70d331a59e81465eb63de380602e9ff8", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:06:54.793Z" + }, + { + "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": "d036d2e5-469b-41d4-a8e2-7ef3f11bbdd9, f432cb92-5b7e-464f-afa6-20643c83c8cf", + "traceId": "70d331a59e81465eb63de380602e9ff8", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:06:54.793Z" + }, + { + "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": "e42d6e1b-c314-4705-935c-d1019ac9557a, b445d31b-0a0b-4108-a5f0-65fc5a7e1eb9", + "traceId": "d648c05b51eb4150834e7257d7db06c9", + "evidence": "", + "checkedAt": "2026-08-08T02:06:54.835Z" + }, + { + "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": "e42d6e1b-c314-4705-935c-d1019ac9557a, b445d31b-0a0b-4108-a5f0-65fc5a7e1eb9", + "traceId": "d648c05b51eb4150834e7257d7db06c9", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:06:54.835Z" + }, + { + "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": "107c080b-ad3f-4846-b110-9067ea7fe794, 8bfdb3de-84f5-4cd3-94f4-e35fbed65939", + "traceId": "29ac27e4f1804325a5110bad1b4a5c06", + "evidence": "", + "checkedAt": "2026-08-08T02:06:54.913Z" + }, + { + "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": "107c080b-ad3f-4846-b110-9067ea7fe794, 8bfdb3de-84f5-4cd3-94f4-e35fbed65939", + "traceId": "29ac27e4f1804325a5110bad1b4a5c06", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:06:54.913Z" + }, + { + "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": "b6bcc176-9cc0-4af3-af3e-b55ea4240076, 1bfaefba-0e7e-40ba-b870-5e00d9d72fc6", + "traceId": "bf69ba14c55b4b02b6ad3ad4eb6aa45f", + "evidence": "", + "checkedAt": "2026-08-08T02:06:54.957Z" + }, + { + "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": "b6bcc176-9cc0-4af3-af3e-b55ea4240076, 1bfaefba-0e7e-40ba-b870-5e00d9d72fc6", + "traceId": "bf69ba14c55b4b02b6ad3ad4eb6aa45f", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:06:54.957Z" + }, + { + "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": "39d64105-0357-4b3a-a67d-b035d477aeab, 8e0ea4fc-938d-4c75-9ba6-1b57c6c8363a", + "traceId": "d707c97141844bc2a834a6669138ed3a", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.001Z" + }, + { + "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": "95ca36fd-4ab9-4594-8516-441f6d20f455, 132b89a1-efa9-4f90-a9e3-e632fb7aabbb", + "traceId": "8f988e454ea349d0a18de1da798a6ba2", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:06:55.035Z" + }, + { + "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": "95ca36fd-4ab9-4594-8516-441f6d20f455, 132b89a1-efa9-4f90-a9e3-e632fb7aabbb", + "traceId": "8f988e454ea349d0a18de1da798a6ba2", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:06:55.035Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085910592674660353" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "815680c7-2519-4c1a-8bce-2c12a8d89b84, 908c21fd-910f-4668-8ee3-2e50b3e791ff", + "traceId": "16742c6efbbb49f18fd78200b180a150", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:06:55.067Z" + }, + { + "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": "de59b269-04cb-47ec-a04d-1f0cba7f6f4f, a5adb4a0-8e8e-4ea3-aa77-457e9e00f681", + "traceId": "7ae2467ebf4f4ecbacc8ea02910e3402", + "evidence": "marker=ADMIN-API-20260808020653996", + "checkedAt": "2026-08-08T02:06:55.140Z" + }, + { + "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": "33a9cf36-6e00-4acf-a133-3be033a411fa, 16e2eb88-7174-4de9-8154-d832da9d6e97", + "traceId": "7d13e87141e9439999f02bfaff02236e", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.174Z" + }, + { + "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": "33a9cf36-6e00-4acf-a133-3be033a411fa, 16e2eb88-7174-4de9-8154-d832da9d6e97", + "traceId": "7d13e87141e9439999f02bfaff02236e", + "evidence": "orderId=2085910593094090754, replayedId=2085910593094090754", + "checkedAt": "2026-08-08T02:06:55.174Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910593094090754" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "283cd51f-3c10-4997-954b-f87d70de8d3d, 39d3c9d2-901d-4235-92bd-9bda3ebae6ab", + "traceId": "10e582212bb941e7912ffa29a4ceb74d", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.207Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910593094090754" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "283cd51f-3c10-4997-954b-f87d70de8d3d, 39d3c9d2-901d-4235-92bd-9bda3ebae6ab", + "traceId": "10e582212bb941e7912ffa29a4ceb74d", + "evidence": "orderNo=FL2085910593094090754, status=DRAFT", + "checkedAt": "2026-08-08T02:06:55.208Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910593094090754" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "283cd51f-3c10-4997-954b-f87d70de8d3d, 39d3c9d2-901d-4235-92bd-9bda3ebae6ab", + "traceId": "10e582212bb941e7912ffa29a4ceb74d", + "evidence": "cargoes=4, imageFileId=2085910592674660353", + "checkedAt": "2026-08-08T02:06:55.208Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085910593094090754/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "53c36b63-e89b-49a3-b0b2-4503568c5040, 12da09e2-2082-4f60-8755-717d3f660c5c", + "traceId": "33d8d7ac51704bc496b37488bcdea11c", + "evidence": "orderId=2085910593094090754", + "checkedAt": "2026-08-08T02:06:55.285Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910593094090754" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39cbbb33-f81a-4669-9079-ed54c158a024, 5630fc12-2c55-44f0-abcf-58dd198795a5", + "traceId": "b5ba4476353242a68ca3d5c822e28ba9", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.330Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910593094090754" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "39cbbb33-f81a-4669-9079-ed54c158a024, 5630fc12-2c55-44f0-abcf-58dd198795a5", + "traceId": "b5ba4476353242a68ca3d5c822e28ba9", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:06:55.331Z" + }, + { + "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=FL2085910593094090754" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c81d533a-40ae-4ada-be89-600de410c1ef, 8099ea8a-6d37-4669-b49b-07f8088d9e1b", + "traceId": "f8c72c3a44c74d60bee8c80fd2d63b94", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.378Z" + }, + { + "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=FL2085910593094090754" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c81d533a-40ae-4ada-be89-600de410c1ef, 8099ea8a-6d37-4669-b49b-07f8088d9e1b", + "traceId": "f8c72c3a44c74d60bee8c80fd2d63b94", + "evidence": "orderId=2085910593094090754, found=true", + "checkedAt": "2026-08-08T02:06:55.378Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c7fd5650-decf-49bc-a2cf-5e138689126c, 9103cdce-846b-419b-ac17-005c6720ef71", + "traceId": "4c18836211004596b5ba586dd75b95ca", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.423Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c7fd5650-decf-49bc-a2cf-5e138689126c, 9103cdce-846b-419b-ac17-005c6720ef71", + "traceId": "4c18836211004596b5ba586dd75b95ca", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:06:55.423Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910593094090754&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6b5c0e70-b9d6-40d7-9c04-d1126b52692a, dd7c34e0-e59e-4f96-81f4-76890ddb3f78", + "traceId": "4a0ad48442204ea69a945e6da67b813a", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.469Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910593094090754&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6b5c0e70-b9d6-40d7-9c04-d1126b52692a, dd7c34e0-e59e-4f96-81f4-76890ddb3f78", + "traceId": "4a0ad48442204ea69a945e6da67b813a", + "evidence": "orderId=2085910593094090754, found=true", + "checkedAt": "2026-08-08T02:06:55.470Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4a6d3ea-39a9-4235-abe3-923d8beaf643, 54fc51a2-5fa8-4786-a410-d8de98721a6d", + "traceId": "6fa457ae1c7c453cbd3b0cad7b93d871", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.508Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4a6d3ea-39a9-4235-abe3-923d8beaf643, 54fc51a2-5fa8-4786-a410-d8de98721a6d", + "traceId": "6fa457ae1c7c453cbd3b0cad7b93d871", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:06:55.509Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4a6d3ea-39a9-4235-abe3-923d8beaf643, 54fc51a2-5fa8-4786-a410-d8de98721a6d", + "traceId": "6fa457ae1c7c453cbd3b0cad7b93d871", + "evidence": "cargoes=4, imageFileId=2085910592674660353", + "checkedAt": "2026-08-08T02:06:55.509Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "60543fc6-f02c-44ef-8b96-8fea88a49f12, dde4ffbf-9824-46fc-9735-1a3bfe2a8764", + "traceId": "f401e45543594863b6277a092de1df1a", + "evidence": "", + "checkedAt": "2026-08-08T02:06:55.548Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e3d80fb3-dacc-4f12-8ffd-f07ab004ad63, 5ace9b4d-63fa-4696-8e90-352b747e8610", + "traceId": "70bcd67a840d434c97e085743335bc71", + "evidence": "orderId=2085910593094090754", + "checkedAt": "2026-08-08T02:06:55.578Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af55acc2-e9b4-4884-ac49-a88d0e3990d8, 9809b04e-f158-4efc-b6db-74ddc8838bc8", + "traceId": "c771d24e646a4c7196e476fb58b4e0dc", + "evidence": "inboundId=2085910602105532418", + "checkedAt": "2026-08-08T02:06:57.841Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910602105532418?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "32b8c963-bca6-4606-a186-c6f081b716d4, 3f51cef6-dd97-4508-b253-fb2ba3a41e49", + "traceId": "ebb48afc22d74ff79f74711d0cd45f24", + "evidence": "inboundId=2085910602105532418", + "checkedAt": "2026-08-08T02:06:57.867Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910602105532418?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "32b8c963-bca6-4606-a186-c6f081b716d4, 3f51cef6-dd97-4508-b253-fb2ba3a41e49", + "traceId": "ebb48afc22d74ff79f74711d0cd45f24", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:06:57.867Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910602105532418?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "32b8c963-bca6-4606-a186-c6f081b716d4, 3f51cef6-dd97-4508-b253-fb2ba3a41e49", + "traceId": "ebb48afc22d74ff79f74711d0cd45f24", + "evidence": "inboundId=2085910602105532418, history=1", + "checkedAt": "2026-08-08T02:06:57.867Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910593094090754&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e32a0b05-3603-42df-a901-8c8473e23a74, 1823ba11-c7ae-492f-bf57-878f0c5e5cfa", + "traceId": "fc4a8c8516f64eb58ff3eea7d8cf9469", + "evidence": "", + "checkedAt": "2026-08-08T02:06:57.904Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910593094090754&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e32a0b05-3603-42df-a901-8c8473e23a74, 1823ba11-c7ae-492f-bf57-878f0c5e5cfa", + "traceId": "fc4a8c8516f64eb58ff3eea7d8cf9469", + "evidence": "inboundId=2085910602105532418, total=1", + "checkedAt": "2026-08-08T02:06:57.905Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "2df26ef1-a8a7-4e45-b246-24cbe24643d2", + "traceId": "3e563131ff484ae88f4a9a4b2ad71df8", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:06:57.951Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "2df26ef1-a8a7-4e45-b246-24cbe24643d2", + "traceId": "3e563131ff484ae88f4a9a4b2ad71df8", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:06:57.951Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eb7222f5-fb90-41be-8f7e-afcbd439ed0d, 73b3b125-7af8-450a-97ec-abf2c8c487c0", + "traceId": "6b7d94a89f7e4a16b451c2b14714fe97", + "evidence": "", + "checkedAt": "2026-08-08T02:06:57.997Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b28dba03-5eb7-4440-a3b8-37596cddba26, 2b9b95a4-55b4-4767-a79e-b3baa43b3e58", + "traceId": "25f33443f7c84187af0530a15201ec2d", + "evidence": "", + "checkedAt": "2026-08-08T02:06:58.044Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e5ea5904-0825-4cb4-b0b2-8577aa482c91, 7895f5e6-7fdf-4958-a0bc-8389cfe16262", + "traceId": "46e813782a7244779b591b4071f41f3b", + "evidence": "", + "checkedAt": "2026-08-08T02:06:58.091Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910593094090754?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e5ea5904-0825-4cb4-b0b2-8577aa482c91, 7895f5e6-7fdf-4958-a0bc-8389cfe16262", + "traceId": "46e813782a7244779b591b4071f41f3b", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:06:58.091Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910602105532418?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "95359fd9-664c-44ad-93a6-dc035401c72e, ba1a1663-0d18-4940-ac6a-a2b9428571de", + "traceId": "09bd34e210964e37b6b66c54b20e0c56", + "evidence": "inboundId=2085910602105532418, tenantId=10001", + "checkedAt": "2026-08-08T02:06:58.118Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910602105532418?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "95359fd9-664c-44ad-93a6-dc035401c72e, ba1a1663-0d18-4940-ac6a-a2b9428571de", + "traceId": "09bd34e210964e37b6b66c54b20e0c56", + "evidence": "identity=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:06:58.118Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱码生成前置数据完整", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910602105532418?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "95359fd9-664c-44ad-93a6-dc035401c72e, ba1a1663-0d18-4940-ac6a-a2b9428571de", + "traceId": "09bd34e210964e37b6b66c54b20e0c56", + "evidence": "inboundCode=present, totalPackageCount=missing", + "checkedAt": "2026-08-08T02:06:58.119Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020727.json b/reports/admin-test-env-acceptance-20260808020727.json new file mode 100644 index 000000000..66fe76a95 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020727.json @@ -0,0 +1,1101 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020727105", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:07:31.359Z", + "startedAt": "2026-08-08T02:07:27.105Z", + "success": false, + "fatal": null, + "summary": { + "total": 56, + "passed": 53, + "failed": 3 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T02:07:27.469Z", + "finishedAt": "2026-08-08T02:07:30.843Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T02:07:30.844Z", + "finishedAt": "2026-08-08T02:07:31.359Z", + "success": false, + "passed": 7, + "failed": 1, + "fatal": "ENOENT: no such file or directory, open 'C:\\Users\\BY-OY\\Desktop\\code\\chongchong-global\\baiyue-firstleg\\apps\\pda-uniapp\\static\\c7.png'" + } + ], + "scenarios": [], + "deploymentBlockers": [ + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "6d7dbb9b-ba89-44ff-801f-d174c0214a0c", + "traceId": "2de389e31dd844378cc7d37a5f8313db" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "6d7dbb9b-ba89-44ff-801f-d174c0214a0c", + "traceId": "2de389e31dd844378cc7d37a5f8313db" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808020727105", + "tenantId": "10001", + "orderId": "2085910731510317057", + "productImageFileId": "2085910731204132865", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085910740651782145", + "orderNo": "FL2085910731510317057", + "inboundCode": "RK-2085910731510317057", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085910740651782145", + "marker": "ADMIN-API-20260808020727105" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085910740651782145", + "marker": "ADMIN-API-20260808020727105" + } + }, + "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": "2079f5ef-158c-4ef8-8cd8-c9837a3e4004, 8fb2c4e9-f814-4190-a3ed-884f7982270c", + "traceId": "3dc3cf92db92420682fff7028e73fc2e", + "evidence": "", + "checkedAt": "2026-08-08T02:07:27.468Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0c16e148-49ed-464d-8674-88d44fd9ba09, 9f332b83-18a0-4a02-86b0-781aa8f91ba5", + "traceId": "11995137edf045e6b5cc5fec42499bb3", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:07:27.809Z" + }, + { + "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": "043f0870-179d-4a88-bc75-83e149a5ed3e, fb93de61-874e-4107-bd63-c2bbb7334b8c", + "traceId": "6c4c2968eab34566b52dfbd23e579ed0", + "evidence": "", + "checkedAt": "2026-08-08T02:07:27.834Z" + }, + { + "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": "043f0870-179d-4a88-bc75-83e149a5ed3e, fb93de61-874e-4107-bd63-c2bbb7334b8c", + "traceId": "6c4c2968eab34566b52dfbd23e579ed0", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:07:27.834Z" + }, + { + "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": "1f1e4a17-3886-4497-a6fd-7addacb18f69, 5f9fe691-bfa0-46ca-b2a4-d12b8594c4e3", + "traceId": "63bfa79cb43c431c99b25b587763f043", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:07:27.868Z" + }, + { + "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": "1f1e4a17-3886-4497-a6fd-7addacb18f69, 5f9fe691-bfa0-46ca-b2a4-d12b8594c4e3", + "traceId": "63bfa79cb43c431c99b25b587763f043", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:07:27.869Z" + }, + { + "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": "c2931cf6-0532-41b8-88cf-fff926c5f6b6, a8f3b805-1bcb-415f-b15b-9d36fcca8038", + "traceId": "c5dc8a3c575b43dc8c567178e9840a04", + "evidence": "", + "checkedAt": "2026-08-08T02:07:27.901Z" + }, + { + "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": "c2931cf6-0532-41b8-88cf-fff926c5f6b6, a8f3b805-1bcb-415f-b15b-9d36fcca8038", + "traceId": "c5dc8a3c575b43dc8c567178e9840a04", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:07:27.901Z" + }, + { + "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": "6d6c0602-b5df-43e5-b71c-5af012083ecf, faa8f7e2-5842-4a57-b611-4369bc5b4b00", + "traceId": "fe9f4ce430384cf2afe43f7368b121fb", + "evidence": "", + "checkedAt": "2026-08-08T02:07:27.954Z" + }, + { + "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": "6d6c0602-b5df-43e5-b71c-5af012083ecf, faa8f7e2-5842-4a57-b611-4369bc5b4b00", + "traceId": "fe9f4ce430384cf2afe43f7368b121fb", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:07:27.954Z" + }, + { + "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": "96ae03e1-aa8b-490c-bd65-e074291f9524, 1998938b-e6c3-4a9c-80bb-8b6b548e944e", + "traceId": "a77ecdb31d2e4b07b95ba0097657f206", + "evidence": "", + "checkedAt": "2026-08-08T02:07:27.990Z" + }, + { + "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": "96ae03e1-aa8b-490c-bd65-e074291f9524, 1998938b-e6c3-4a9c-80bb-8b6b548e944e", + "traceId": "a77ecdb31d2e4b07b95ba0097657f206", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:07:27.990Z" + }, + { + "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": "7f91d6d8-4a10-4e8f-ae27-3bc14eb4695b, 0b464e84-d379-4ea9-a962-a3fe2c96fc1e", + "traceId": "b71e6b75261941e3bbc9a1ecd545e110", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.021Z" + }, + { + "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": "ffe2aab9-6d9e-4953-a91b-d3a0da07fcd4, c5010a3c-2a40-4f7b-8995-8e16274603e1", + "traceId": "719c88e7d41c417b854980421b0d9853", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:07:28.058Z" + }, + { + "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": "ffe2aab9-6d9e-4953-a91b-d3a0da07fcd4, c5010a3c-2a40-4f7b-8995-8e16274603e1", + "traceId": "719c88e7d41c417b854980421b0d9853", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:07:28.058Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085910731204132865" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "1f708f55-d5ae-46c7-a38c-12fbe42ec5d2, c8bbf0f9-4cbf-46dd-a3fa-b660b6784497", + "traceId": "0108ef7a65a94d7794000ca4834ad97c", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:07:28.082Z" + }, + { + "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": "3d800d68-e764-4a1c-ba1c-cd62d7824916, a4891f80-1367-4233-b873-4ebf4f415d63", + "traceId": "16dcfde7eeee47e189bf9ad8d5e20a32", + "evidence": "marker=ADMIN-API-20260808020727105", + "checkedAt": "2026-08-08T02:07:28.136Z" + }, + { + "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": "7d8f8b3f-9ff9-4d02-b21c-74ce9b876b03, a64404b7-d5b0-476e-98b6-1072ed17c0ed", + "traceId": "86f7ae0aa9274bddb36c63e585ace549", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.166Z" + }, + { + "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": "7d8f8b3f-9ff9-4d02-b21c-74ce9b876b03, a64404b7-d5b0-476e-98b6-1072ed17c0ed", + "traceId": "86f7ae0aa9274bddb36c63e585ace549", + "evidence": "orderId=2085910731510317057, replayedId=2085910731510317057", + "checkedAt": "2026-08-08T02:07:28.167Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910731510317057" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "287aee2b-8a30-430c-918f-dfbc64619b2d, ec0a36e8-82cb-4c44-9cd2-10a2bc957715", + "traceId": "efc8c5bd735b4e00bd7c232954259ce9", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.196Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910731510317057" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "287aee2b-8a30-430c-918f-dfbc64619b2d, ec0a36e8-82cb-4c44-9cd2-10a2bc957715", + "traceId": "efc8c5bd735b4e00bd7c232954259ce9", + "evidence": "orderNo=FL2085910731510317057, status=DRAFT", + "checkedAt": "2026-08-08T02:07:28.196Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910731510317057" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "287aee2b-8a30-430c-918f-dfbc64619b2d, ec0a36e8-82cb-4c44-9cd2-10a2bc957715", + "traceId": "efc8c5bd735b4e00bd7c232954259ce9", + "evidence": "cargoes=4, imageFileId=2085910731204132865", + "checkedAt": "2026-08-08T02:07:28.196Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085910731510317057/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4ef4e76a-5893-4c0d-9b6a-23a8d6b786e7, 89567860-b82f-4dd6-877b-09d2edd7740d", + "traceId": "3ec4281b470240dcbc5dfa0a362e9e2e", + "evidence": "orderId=2085910731510317057", + "checkedAt": "2026-08-08T02:07:28.253Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910731510317057" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "128a0019-0239-4184-927b-27dfc00a4f4b, 95c83461-2346-4946-be83-dbc4e2f29701", + "traceId": "17e519b7fe454a309fa9bdfc36372ec2", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.287Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910731510317057" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "128a0019-0239-4184-927b-27dfc00a4f4b, 95c83461-2346-4946-be83-dbc4e2f29701", + "traceId": "17e519b7fe454a309fa9bdfc36372ec2", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:07:28.287Z" + }, + { + "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=FL2085910731510317057" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3553699-6c08-4c4a-94d3-7731228cb07a, 5f19a4bc-bb4b-435c-9143-90f51dd0709a", + "traceId": "1e83bcdee6ed43d6a21c14942ac5d151", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.327Z" + }, + { + "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=FL2085910731510317057" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3553699-6c08-4c4a-94d3-7731228cb07a, 5f19a4bc-bb4b-435c-9143-90f51dd0709a", + "traceId": "1e83bcdee6ed43d6a21c14942ac5d151", + "evidence": "orderId=2085910731510317057, found=true", + "checkedAt": "2026-08-08T02:07:28.327Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4836183a-9a28-4d54-9e3c-68578c6f5875, 4004c66a-6e97-4454-bd97-f79baf97a865", + "traceId": "cc3e9321fec042d38eac4a3292a7e48b", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.363Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4836183a-9a28-4d54-9e3c-68578c6f5875, 4004c66a-6e97-4454-bd97-f79baf97a865", + "traceId": "cc3e9321fec042d38eac4a3292a7e48b", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:07:28.363Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910731510317057&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "10deadaf-17ef-41d1-829e-0d53c569f773, 1a898d77-830d-4ea5-9d35-96a8e40c2f47", + "traceId": "a1c53eea30a84436b413db223553be39", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.400Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910731510317057&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "10deadaf-17ef-41d1-829e-0d53c569f773, 1a898d77-830d-4ea5-9d35-96a8e40c2f47", + "traceId": "a1c53eea30a84436b413db223553be39", + "evidence": "orderId=2085910731510317057, found=true", + "checkedAt": "2026-08-08T02:07:28.400Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df8836a7-740f-41ea-8d3e-6315c283b1c0, 9531bfdc-e7c8-4a3d-8cb9-22461c36e8b3", + "traceId": "188f3df752144082a71204d1994bb1b1", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.426Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df8836a7-740f-41ea-8d3e-6315c283b1c0, 9531bfdc-e7c8-4a3d-8cb9-22461c36e8b3", + "traceId": "188f3df752144082a71204d1994bb1b1", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:07:28.426Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "df8836a7-740f-41ea-8d3e-6315c283b1c0, 9531bfdc-e7c8-4a3d-8cb9-22461c36e8b3", + "traceId": "188f3df752144082a71204d1994bb1b1", + "evidence": "cargoes=4, imageFileId=2085910731204132865", + "checkedAt": "2026-08-08T02:07:28.426Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "61c751e8-970a-45ea-9de5-7e7293db11c6, 61256f9c-4985-43eb-9dd3-46f7a4ac8d4e", + "traceId": "56291fc0fe364342891582a3fc780d1d", + "evidence": "", + "checkedAt": "2026-08-08T02:07:28.462Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a5d13001-bfa9-454f-9097-7d24a4b8198f, 6f9a0deb-c82e-4bef-bbf9-3e891c62c32c", + "traceId": "d560d708bbe74a09ab51a51bba97cc4c", + "evidence": "orderId=2085910731510317057", + "checkedAt": "2026-08-08T02:07:28.499Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3825d33e-3830-47a4-94a8-85bef3e0f793, 8ef91486-51cb-4327-8e7b-a2680df6e21c", + "traceId": "b73e4592fbc24754b48980d230e37321", + "evidence": "inboundId=2085910740651782145", + "checkedAt": "2026-08-08T02:07:30.636Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910740651782145?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0148517d-f270-495c-990d-190d14adc976, 1018ef74-7163-4836-9824-182cec01175d", + "traceId": "ade372860dfd474cb04e45719a190b64", + "evidence": "inboundId=2085910740651782145", + "checkedAt": "2026-08-08T02:07:30.672Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910740651782145?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0148517d-f270-495c-990d-190d14adc976, 1018ef74-7163-4836-9824-182cec01175d", + "traceId": "ade372860dfd474cb04e45719a190b64", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:07:30.672Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910740651782145?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0148517d-f270-495c-990d-190d14adc976, 1018ef74-7163-4836-9824-182cec01175d", + "traceId": "ade372860dfd474cb04e45719a190b64", + "evidence": "inboundId=2085910740651782145, history=1", + "checkedAt": "2026-08-08T02:07:30.672Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910731510317057&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4da57546-66a4-4996-93f4-c6af21b81959, 24f67baf-0afb-4e88-b3a1-eff72a38f976", + "traceId": "f2bf427786714d38905e6842c3ddd865", + "evidence": "", + "checkedAt": "2026-08-08T02:07:30.711Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910731510317057&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4da57546-66a4-4996-93f4-c6af21b81959, 24f67baf-0afb-4e88-b3a1-eff72a38f976", + "traceId": "f2bf427786714d38905e6842c3ddd865", + "evidence": "inboundId=2085910740651782145, total=1", + "checkedAt": "2026-08-08T02:07:30.711Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "6d7dbb9b-ba89-44ff-801f-d174c0214a0c", + "traceId": "2de389e31dd844378cc7d37a5f8313db", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:07:30.745Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "6d7dbb9b-ba89-44ff-801f-d174c0214a0c", + "traceId": "2de389e31dd844378cc7d37a5f8313db", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:07:30.745Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dda6336e-3753-40d6-ba33-230cac525341, 3ce62a63-dc82-4ed7-850e-da21743cab7f", + "traceId": "e525f0a1c987410c8119ce5cd884fe7a", + "evidence": "", + "checkedAt": "2026-08-08T02:07:30.784Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "179aaaa0-2011-4833-80a8-f604195ee993, 9ce86d68-34b6-4f81-a09c-e65ce8a125ca", + "traceId": "0569474ffdeb4ba7b64ae915a11eac93", + "evidence": "", + "checkedAt": "2026-08-08T02:07:30.816Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9466818a-ac3e-4499-be20-a7b2d410168f, 4c8d5880-1f75-422e-bcc5-d180a85a8fe4", + "traceId": "e3524e1b21b34ccbb00151672781f1d7", + "evidence": "", + "checkedAt": "2026-08-08T02:07:30.842Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910731510317057?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9466818a-ac3e-4499-be20-a7b2d410168f, 4c8d5880-1f75-422e-bcc5-d180a85a8fe4", + "traceId": "e3524e1b21b34ccbb00151672781f1d7", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:07:30.842Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910740651782145?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d88ee081-aedf-45d9-aba9-4b6923b46c52, 4d7641dd-522e-4387-9a64-cdb51909664c", + "traceId": "991bd50b6a144d3ab9269b0d6df1239f", + "evidence": "inboundId=2085910740651782145, tenantId=10001", + "checkedAt": "2026-08-08T02:07:30.872Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910740651782145?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d88ee081-aedf-45d9-aba9-4b6923b46c52, 4d7641dd-522e-4387-9a64-cdb51909664c", + "traceId": "991bd50b6a144d3ab9269b0d6df1239f", + "evidence": "identity=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:07:30.872Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "生成箱唛 PDF 并冻结稳定箱码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085910740651782145/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13874 bytes (application/pdf)", + "requestId": "ecc18157-6c05-4a64-bd7d-c6f262112779, a890db30-bdd7-4fbd-828b-a35b788d3922, 54dbc17d-0d58-4924-8a8d-ddb46bcecf95", + "traceId": "ceb46f099c3742ad82ade7706ebc33ca, af07e51efa3949649be38b19e703d07a", + "evidence": "contentType=application/pdf, bytes=13874", + "checkedAt": "2026-08-08T02:07:31.037Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印后回查冻结箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910740651782145?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "111580b4-b7ca-4381-8b64-5f8a41b5985e, 10a7d515-7b75-4ae2-8910-9cf79b27acaa", + "traceId": "71acaab582a14c0fb7b6e67b67e6803f", + "evidence": "", + "checkedAt": "2026-08-08T02:07:31.065Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印按订单货物冻结原始总箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910740651782145?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "111580b4-b7ca-4381-8b64-5f8a41b5985e, 10a7d515-7b75-4ae2-8910-9cf79b27acaa", + "traceId": "71acaab582a14c0fb7b6e67b67e6803f", + "evidence": "inboundCodeStable=true, totalPackageCount=4", + "checkedAt": "2026-08-08T02:07:31.065Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复整单打印复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085910740651782145/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13874 bytes (application/pdf)", + "requestId": "199ba755-f8f1-425d-abd4-381a83baba16, 0e7994d5-a453-4df4-b278-6ebc93b66089, c1b4e5d6-c700-42be-a475-eef8979df411", + "traceId": "9540cbfce62e4746a1b523e35b8c61b9, aa35ba459cf940aba1443528a406f32c", + "evidence": "boxCode=RK-2085910731510317057#4-1, contentType=application/pdf, bytes=13874", + "checkedAt": "2026-08-08T02:07:31.210Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "指定第1箱补打复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085910740651782145/carton-label-pdf?tenantId=10001&cartonIndex=1" + }, + "http": 200, + "code": null, + "message": "7664 bytes (application/pdf)", + "requestId": "6346577c-6823-4129-9d48-5966e4cadc12, 9b637426-9c36-4c2a-bc43-cb370e2a0996, ce5c0a0d-2a39-4533-b855-724301aee2d5", + "traceId": "2d3afee3303e44bf88eac4d1af88c33b, 01228a746ffe447e9a72a21c7ff90cc0", + "evidence": "boxCode=RK-2085910731510317057#4-1, cartonIndex=1, contentType=application/pdf, bytes=7664", + "checkedAt": "2026-08-08T02:07:31.358Z" + }, + { + "module": "inbound-measurement", + "scenario": null, + "name": "模块执行", + "passed": false, + "deploymentBlocker": false, + "request": null, + "http": null, + "code": null, + "message": null, + "requestId": null, + "traceId": null, + "evidence": "ENOENT: no such file or directory, open 'C:\\Users\\BY-OY\\Desktop\\code\\chongchong-global\\baiyue-firstleg\\apps\\pda-uniapp\\static\\c7.png'", + "checkedAt": "2026-08-08T02:07:31.359Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020751.json b/reports/admin-test-env-acceptance-20260808020751.json new file mode 100644 index 000000000..f56f53674 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020751.json @@ -0,0 +1,1320 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020751178", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:07:55.760Z", + "startedAt": "2026-08-08T02:07:51.178Z", + "success": false, + "fatal": null, + "summary": { + "total": 67, + "passed": 64, + "failed": 3 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T02:07:51.553Z", + "finishedAt": "2026-08-08T02:07:54.945Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T02:07:54.946Z", + "finishedAt": "2026-08-08T02:07:55.760Z", + "success": false, + "passed": 18, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 18, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "fdd8e968-ffd6-4d26-8de9-a74da62e1f2d", + "traceId": "8ddff025f94e46eeab12aa8c4c85c75b" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "fdd8e968-ffd6-4d26-8de9-a74da62e1f2d", + "traceId": "8ddff025f94e46eeab12aa8c4c85c75b" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "草稿保存前置字段完整", + "evidence": "inboundDetailId=missing, imageFileId=2085910847071780865", + "code": "200", + "requestId": "0cd04e1c-2beb-45d4-b4e7-2d9f73063aee, 27be4598-2af0-4479-b64a-5828e4b8c433", + "traceId": "a19cb68d7f6844ed848f5a5915385dec" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808020751178", + "tenantId": "10001", + "orderId": "2085910832609820674", + "productImageFileId": "2085910832261693442", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085910841432518657", + "orderNo": "FL2085910832609820674", + "inboundCode": "RK-2085910832609820674", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085910841432518657", + "marker": "ADMIN-API-20260808020751178" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085910841432518657", + "marker": "ADMIN-API-20260808020751178" + } + }, + "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": "bddf109e-97be-48e4-9e67-b212fd1a6fab, 46c76686-8511-433e-9c4d-c9422f4d1bb7", + "traceId": "31b547b18ec44de694d59de7e77d20f2", + "evidence": "", + "checkedAt": "2026-08-08T02:07:51.552Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3e3870b-20cc-4da0-8cdc-1af260ea5d8c, c25ca15f-422d-4410-b451-aaa971a57a36", + "traceId": "4806e67c0a874ce1b733bc83a4b4f19e", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:07:51.898Z" + }, + { + "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": "fcded226-61de-498f-9fcc-d8f3cbb9eb87, 34643661-c4a9-45f1-898f-da3b65308f47", + "traceId": "584bc3ad1eea4dc281f7963f62fe4b0e", + "evidence": "", + "checkedAt": "2026-08-08T02:07:51.930Z" + }, + { + "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": "fcded226-61de-498f-9fcc-d8f3cbb9eb87, 34643661-c4a9-45f1-898f-da3b65308f47", + "traceId": "584bc3ad1eea4dc281f7963f62fe4b0e", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:07:51.930Z" + }, + { + "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": "1abb2a96-a80c-489d-a21e-40021fdc6056, e4767313-2b28-4063-a037-1d8117dfbc28", + "traceId": "5dfc5fcb652d4ddba7edff6da5cd91f5", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:07:51.954Z" + }, + { + "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": "1abb2a96-a80c-489d-a21e-40021fdc6056, e4767313-2b28-4063-a037-1d8117dfbc28", + "traceId": "5dfc5fcb652d4ddba7edff6da5cd91f5", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:07:51.955Z" + }, + { + "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": "558a1dc9-c780-4f0c-942d-db95819b5875, 700386c4-cdb8-43ee-a3d3-1f66dba58356", + "traceId": "9b6d9e8b176b4234ac2d462aabc6dcc5", + "evidence": "", + "checkedAt": "2026-08-08T02:07:51.994Z" + }, + { + "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": "558a1dc9-c780-4f0c-942d-db95819b5875, 700386c4-cdb8-43ee-a3d3-1f66dba58356", + "traceId": "9b6d9e8b176b4234ac2d462aabc6dcc5", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:07:51.994Z" + }, + { + "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": "07a76a48-59a6-47cb-bcbd-45b1611ec5e5, 8fd8d8ab-e719-4b82-9806-ac1be3d4c53f", + "traceId": "fcd0a5db8ed04436a7fa4347ddbc684f", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.063Z" + }, + { + "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": "07a76a48-59a6-47cb-bcbd-45b1611ec5e5, 8fd8d8ab-e719-4b82-9806-ac1be3d4c53f", + "traceId": "fcd0a5db8ed04436a7fa4347ddbc684f", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:07:52.063Z" + }, + { + "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": "c3463973-b1e2-4b49-b332-0dd66d9275c3, 2040cb78-1f17-491c-a3f8-b21a12d457ce", + "traceId": "44003f6008b343b8acb080972dddfed4", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.089Z" + }, + { + "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": "c3463973-b1e2-4b49-b332-0dd66d9275c3, 2040cb78-1f17-491c-a3f8-b21a12d457ce", + "traceId": "44003f6008b343b8acb080972dddfed4", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:07:52.089Z" + }, + { + "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": "ae541dc5-d0f1-48d3-971c-fe89ce3f446d, 6e98d854-4246-4029-acdd-439e8ca31f6a", + "traceId": "1ade7c1e5b34493a8857b25cd4621ff3", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.117Z" + }, + { + "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": "82adc363-8959-4f13-8dff-24fd791c5079, 52e92232-449a-452a-a47a-8e11cdb1ca48", + "traceId": "1523fd8ee8ac42c7a1f119040587445c", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:07:52.159Z" + }, + { + "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": "82adc363-8959-4f13-8dff-24fd791c5079, 52e92232-449a-452a-a47a-8e11cdb1ca48", + "traceId": "1523fd8ee8ac42c7a1f119040587445c", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:07:52.159Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085910832261693442" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "de3d259f-9f67-4761-9c26-116b924a24d5, 9dd2075a-1afc-4f48-9561-bea7adfae47a", + "traceId": "61c9e79bfa53417a8d4e475741338bbd", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:07:52.182Z" + }, + { + "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": "14747533-7b1b-4755-be2a-7775b8cc6787, 43a354d6-ae58-45e5-95d5-bd2c76e973d1", + "traceId": "03700effb1a4464d8394ec8cdff36ddb", + "evidence": "marker=ADMIN-API-20260808020751178", + "checkedAt": "2026-08-08T02:07:52.242Z" + }, + { + "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": "4805b847-99ef-4a41-89b4-e2e7e46f717d, 7517413a-cbd4-4bd9-8131-8a41b5d83849", + "traceId": "c3db5d6fbd8f43829512af0534351a4b", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.276Z" + }, + { + "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": "4805b847-99ef-4a41-89b4-e2e7e46f717d, 7517413a-cbd4-4bd9-8131-8a41b5d83849", + "traceId": "c3db5d6fbd8f43829512af0534351a4b", + "evidence": "orderId=2085910832609820674, replayedId=2085910832609820674", + "checkedAt": "2026-08-08T02:07:52.276Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910832609820674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "79a5271d-84ca-4951-a647-695bfc96ad8b, f1f07581-ee09-41f7-a901-d039dd2c879a", + "traceId": "3cc4b0b7016c48c5a603695995163753", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.304Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910832609820674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "79a5271d-84ca-4951-a647-695bfc96ad8b, f1f07581-ee09-41f7-a901-d039dd2c879a", + "traceId": "3cc4b0b7016c48c5a603695995163753", + "evidence": "orderNo=FL2085910832609820674, status=DRAFT", + "checkedAt": "2026-08-08T02:07:52.304Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910832609820674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "79a5271d-84ca-4951-a647-695bfc96ad8b, f1f07581-ee09-41f7-a901-d039dd2c879a", + "traceId": "3cc4b0b7016c48c5a603695995163753", + "evidence": "cargoes=4, imageFileId=2085910832261693442", + "checkedAt": "2026-08-08T02:07:52.304Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085910832609820674/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "766382c7-bca2-4387-bb5b-df632a8bfeee, 161e766f-9207-40a7-9a08-2c96b2bd9344", + "traceId": "70d3d507bced4106b22a4e3b6ddb957b", + "evidence": "orderId=2085910832609820674", + "checkedAt": "2026-08-08T02:07:52.363Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910832609820674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7282d74b-f95b-42a5-8db1-11b76740a886, ba5239ed-5799-4bfa-b350-af63a7bec054", + "traceId": "669c953d15cd45d69ceca2e89046131e", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.400Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085910832609820674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7282d74b-f95b-42a5-8db1-11b76740a886, ba5239ed-5799-4bfa-b350-af63a7bec054", + "traceId": "669c953d15cd45d69ceca2e89046131e", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:07:52.400Z" + }, + { + "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=FL2085910832609820674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "76097d8b-fe5d-4778-a1c8-da558cc33921, d9d71d7e-ac0a-459e-b4ac-36e43eb37332", + "traceId": "6ce4c30433924d42aace9cd2b1fa5e45", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.439Z" + }, + { + "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=FL2085910832609820674" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "76097d8b-fe5d-4778-a1c8-da558cc33921, d9d71d7e-ac0a-459e-b4ac-36e43eb37332", + "traceId": "6ce4c30433924d42aace9cd2b1fa5e45", + "evidence": "orderId=2085910832609820674, found=true", + "checkedAt": "2026-08-08T02:07:52.439Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "125dd469-f08a-4f32-81d0-3ecbe42a4719, 427d631e-bdac-4455-b1dd-6273ca71e7f6", + "traceId": "d29bef7585f4415c8edfde41354864df", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.464Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "125dd469-f08a-4f32-81d0-3ecbe42a4719, 427d631e-bdac-4455-b1dd-6273ca71e7f6", + "traceId": "d29bef7585f4415c8edfde41354864df", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:07:52.464Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910832609820674&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e10d963-8245-43a1-ae4d-905e1ef8597a, 4c66d736-2129-416e-91fc-3b876ce88bf1", + "traceId": "56501abfca37465eaa867c40781329da", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.494Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085910832609820674&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e10d963-8245-43a1-ae4d-905e1ef8597a, 4c66d736-2129-416e-91fc-3b876ce88bf1", + "traceId": "56501abfca37465eaa867c40781329da", + "evidence": "orderId=2085910832609820674, found=true", + "checkedAt": "2026-08-08T02:07:52.494Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b33fead0-9f38-42b9-81c9-e594d0c413eb, 791dff0c-ca1f-463d-a319-4cf243f783d1", + "traceId": "9d5d2f6f1d67422a98535a225e61e647", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.524Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b33fead0-9f38-42b9-81c9-e594d0c413eb, 791dff0c-ca1f-463d-a319-4cf243f783d1", + "traceId": "9d5d2f6f1d67422a98535a225e61e647", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:07:52.524Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b33fead0-9f38-42b9-81c9-e594d0c413eb, 791dff0c-ca1f-463d-a319-4cf243f783d1", + "traceId": "9d5d2f6f1d67422a98535a225e61e647", + "evidence": "cargoes=4, imageFileId=2085910832261693442", + "checkedAt": "2026-08-08T02:07:52.524Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eb5d1063-a0f2-4df5-990b-bbf32636bb27, faba8fc3-51aa-4a75-a0b5-3dab74c0ce39", + "traceId": "798902d1c2fe4088a731bd23e2be0b0f", + "evidence": "", + "checkedAt": "2026-08-08T02:07:52.559Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c6a287d5-25c6-479b-834a-b4019bba6a7c, d2471bd5-1173-4b50-8890-4606dce599e4", + "traceId": "b14205e8fdbd41c4bdbd18ec9e1293e7", + "evidence": "orderId=2085910832609820674", + "checkedAt": "2026-08-08T02:07:52.590Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9cf17af1-29e8-49fe-ac4f-f7b1040f40fc, 80474b83-b23a-4f3c-af9b-acc2b4d6bc92", + "traceId": "3b77e6e472ce4ce393691aea2799420d", + "evidence": "inboundId=2085910841432518657", + "checkedAt": "2026-08-08T02:07:54.750Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910841432518657?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0164806-c48d-4deb-8bca-7d57f6654d62, abbb8ebc-0b8b-4dc7-bde5-f7038017fba3", + "traceId": "11e823449c394e609489322ffbaa16e8", + "evidence": "inboundId=2085910841432518657", + "checkedAt": "2026-08-08T02:07:54.775Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910841432518657?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0164806-c48d-4deb-8bca-7d57f6654d62, abbb8ebc-0b8b-4dc7-bde5-f7038017fba3", + "traceId": "11e823449c394e609489322ffbaa16e8", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:07:54.775Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910841432518657?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0164806-c48d-4deb-8bca-7d57f6654d62, abbb8ebc-0b8b-4dc7-bde5-f7038017fba3", + "traceId": "11e823449c394e609489322ffbaa16e8", + "evidence": "inboundId=2085910841432518657, history=1", + "checkedAt": "2026-08-08T02:07:54.775Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910832609820674&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "73a04991-3043-41e5-952f-544844664c5a, bb0b4267-71ad-413f-95be-46f812d94ddd", + "traceId": "6e2bfcf280644fec8e827cd7cd82aae8", + "evidence": "", + "checkedAt": "2026-08-08T02:07:54.801Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085910832609820674&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "73a04991-3043-41e5-952f-544844664c5a, bb0b4267-71ad-413f-95be-46f812d94ddd", + "traceId": "6e2bfcf280644fec8e827cd7cd82aae8", + "evidence": "inboundId=2085910841432518657, total=1", + "checkedAt": "2026-08-08T02:07:54.801Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "fdd8e968-ffd6-4d26-8de9-a74da62e1f2d", + "traceId": "8ddff025f94e46eeab12aa8c4c85c75b", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:07:54.836Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "fdd8e968-ffd6-4d26-8de9-a74da62e1f2d", + "traceId": "8ddff025f94e46eeab12aa8c4c85c75b", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:07:54.836Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "13ed2a14-2695-41ab-b6ff-49f404d4eb91, 690da95b-e935-4e52-bfcb-c17bdc315cc2", + "traceId": "eda5f4125d7a41a08b924c70e04eabf1", + "evidence": "", + "checkedAt": "2026-08-08T02:07:54.869Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e6fd649c-8577-45ce-8774-897cd1b47ed9, 8594d40a-b8fe-4b63-b2df-70343427f57c", + "traceId": "964592755afb46f58e715e4639819ea3", + "evidence": "", + "checkedAt": "2026-08-08T02:07:54.899Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b64f2bd-a22e-489d-9d41-00e4b635f767, 4d97d479-dabc-47bb-8423-94396fc3a02f", + "traceId": "25721448ce3b491d9bf548af1d2947d6", + "evidence": "", + "checkedAt": "2026-08-08T02:07:54.944Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085910832609820674?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b64f2bd-a22e-489d-9d41-00e4b635f767, 4d97d479-dabc-47bb-8423-94396fc3a02f", + "traceId": "25721448ce3b491d9bf548af1d2947d6", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:07:54.945Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910841432518657?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f7b0d668-dccb-405c-afb8-0e4e0fe97961, 8eced90f-33cb-48ed-aabb-ceaa40163871", + "traceId": "998285f5d692464ead57ffdf11df645f", + "evidence": "inboundId=2085910841432518657, tenantId=10001", + "checkedAt": "2026-08-08T02:07:54.991Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910841432518657?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f7b0d668-dccb-405c-afb8-0e4e0fe97961, 8eced90f-33cb-48ed-aabb-ceaa40163871", + "traceId": "998285f5d692464ead57ffdf11df645f", + "evidence": "identity=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:07:54.991Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "生成箱唛 PDF 并冻结稳定箱码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085910841432518657/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13818 bytes (application/pdf)", + "requestId": "27a4bbe7-b791-4895-b6bc-8e6a01593c6e, 5c01e57d-daeb-4b12-a860-ed565d681fa8, 0e1ddc55-dd8d-46cc-899c-351bd0ce7deb", + "traceId": "c68dc651ae524ec2bce2106a57b4baea, d79fda7f716440afae182a1647cf7426", + "evidence": "contentType=application/pdf, bytes=13818", + "checkedAt": "2026-08-08T02:07:55.148Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印后回查冻结箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910841432518657?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "beb49bc2-3a4d-46fc-a790-1fdac8985c73, 81412c63-5f01-47e9-945c-97d969b3a4e4", + "traceId": "3e6d65ceb1a945c593dabf55c5b52a42", + "evidence": "", + "checkedAt": "2026-08-08T02:07:55.180Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印按订单货物冻结原始总箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085910841432518657?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "beb49bc2-3a4d-46fc-a790-1fdac8985c73, 81412c63-5f01-47e9-945c-97d969b3a4e4", + "traceId": "3e6d65ceb1a945c593dabf55c5b52a42", + "evidence": "inboundCodeStable=true, totalPackageCount=4", + "checkedAt": "2026-08-08T02:07:55.181Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复整单打印复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085910841432518657/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13818 bytes (application/pdf)", + "requestId": "45f3dc8d-559d-410a-8235-40ba95301a35, ed3a022b-39ab-4011-8f39-b618225ae270, 56bb95c0-180d-4921-b19b-c2ddb4d35751", + "traceId": "251b6106a3c54f0683087bb62aef70f8, ede846fe7fb44da7bdc6b8d34f0523f1", + "evidence": "boxCode=RK-2085910832609820674#4-1, contentType=application/pdf, bytes=13818", + "checkedAt": "2026-08-08T02:07:55.321Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "指定第1箱补打复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085910841432518657/carton-label-pdf?tenantId=10001&cartonIndex=1" + }, + "http": 200, + "code": null, + "message": "7779 bytes (application/pdf)", + "requestId": "9abbbcad-ab1a-457a-b88d-89d4d10c44a1, 9f62f7a4-6889-49ad-8ed4-f715edaf22dc, ed708d02-5efc-49c2-8967-4de69e7daf9b", + "traceId": "695adf82c54c4f0fb3139c18ff75472d, 17f1a3617a9c48d58723c49669942942", + "evidence": "boxCode=RK-2085910832609820674#4-1, cartonIndex=1, contentType=application/pdf, bytes=7779", + "checkedAt": "2026-08-08T02:07:55.431Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "模拟墨家首次扫描单箱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4265dc27-574a-48e5-a288-4efe9e3a52e0, a3d6e167-e5a9-4122-9ee1-1baa7a7dab5c", + "traceId": "05331d360728479e8be53d7a9e597155", + "evidence": "boxCode=RK-2085910832609820674#4-1, machineNo=MJ-ADMIN-E2E-01", + "checkedAt": "2026-08-08T02:07:55.525Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次扫描新增一条且默认代表1箱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4265dc27-574a-48e5-a288-4efe9e3a52e0, a3d6e167-e5a9-4122-9ee1-1baa7a7dab5c", + "traceId": "05331d360728479e8be53d7a9e597155", + "evidence": "created=true, confirmedPackageCount=1", + "checkedAt": "2026-08-08T02:07:55.525Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复打印及指定箱补打后原箱码仍可解析", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4265dc27-574a-48e5-a288-4efe9e3a52e0, a3d6e167-e5a9-4122-9ee1-1baa7a7dab5c", + "traceId": "05331d360728479e8be53d7a9e597155", + "evidence": "boxCodeStable=true, resolvedInboundId=2085910841432518657", + "checkedAt": "2026-08-08T02:07:55.525Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询箱级测量详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0faa11b4-e2d1-485c-a0bd-393babb996ed, 81814250-9fbe-4fca-83c2-29777dd7ea60", + "traceId": "b46e8db2d4cf4fadba76a57316860079", + "evidence": "measurementId=2085910846377603074", + "checkedAt": "2026-08-08T02:07:55.556Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱级查询回显箱码、尺寸、图片与设备信息", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0faa11b4-e2d1-485c-a0bd-393babb996ed, 81814250-9fbe-4fca-83c2-29777dd7ea60", + "traceId": "b46e8db2d4cf4fadba76a57316860079", + "evidence": "itemFound=true, imageFileId=2085910846341971969", + "checkedAt": "2026-08-08T02:07:55.557Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "人工确认当前测量代表箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement/items/2085910846377603075/confirmed-package-count?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bc034609-775f-4184-9566-698f1d5fae48, 44e447ea-f89c-4afd-89e3-327c41be57b1", + "traceId": "7daaac78f40e488184c3f62ec8fbc047", + "evidence": "confirmedPackageCount=4", + "checkedAt": "2026-08-08T02:07:55.620Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "人工箱数更新且测量版本递增", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement/items/2085910846377603075/confirmed-package-count?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bc034609-775f-4184-9566-698f1d5fae48, 44e447ea-f89c-4afd-89e3-327c41be57b1", + "traceId": "7daaac78f40e488184c3f62ec8fbc047", + "evidence": "version=2", + "checkedAt": "2026-08-08T02:07:55.620Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "同箱号重新扫描覆盖当前记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "485c183a-229c-40e9-bddc-a4de7cf2722d, ae52db73-61de-4779-9dc9-556954e4a670", + "traceId": "1f8226d168b24eb3a859a0172bf56817", + "evidence": "boxCode=RK-2085910832609820674#4-1, machineNo=MJ-ADMIN-E2E-02", + "checkedAt": "2026-08-08T02:07:55.711Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "覆盖保留同一条记录和人工箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "485c183a-229c-40e9-bddc-a4de7cf2722d, ae52db73-61de-4779-9dc9-556954e4a670", + "traceId": "1f8226d168b24eb3a859a0172bf56817", + "evidence": "sameItem=true, confirmedPackageCount=4", + "checkedAt": "2026-08-08T02:07:55.711Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "回查覆盖后的尺寸与体积结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0cd04e1c-2beb-45d4-b4e7-2d9f73063aee, 27be4598-2af0-4479-b64a-5828e4b8c433", + "traceId": "a19cb68d7f6844ed848f5a5915385dec", + "evidence": "", + "checkedAt": "2026-08-08T02:07:55.760Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "覆盖尺寸、箱数和服务端体积公式正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0cd04e1c-2beb-45d4-b4e7-2d9f73063aee, 27be4598-2af0-4479-b64a-5828e4b8c433", + "traceId": "a19cb68d7f6844ed848f5a5915385dec", + "evidence": "unitVolume=0.0788, totalVolume=0.3152, volumeWeight=52.639, girth=206.1", + "checkedAt": "2026-08-08T02:07:55.760Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "草稿保存前置字段完整", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085910841432518657/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0cd04e1c-2beb-45d4-b4e7-2d9f73063aee, 27be4598-2af0-4479-b64a-5828e4b8c433", + "traceId": "a19cb68d7f6844ed848f5a5915385dec", + "evidence": "inboundDetailId=missing, imageFileId=2085910847071780865", + "checkedAt": "2026-08-08T02:07:55.760Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808020947.json b/reports/admin-test-env-acceptance-20260808020947.json new file mode 100644 index 000000000..034bb991c --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808020947.json @@ -0,0 +1,1526 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808020947699", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:09:53.456Z", + "startedAt": "2026-08-08T02:09:47.699Z", + "success": false, + "fatal": null, + "summary": { + "total": 78, + "passed": 75, + "failed": 3 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T02:09:48.073Z", + "finishedAt": "2026-08-08T02:09:52.589Z", + "success": false, + "passed": 45, + "failed": 2, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T02:09:52.590Z", + "finishedAt": "2026-08-08T02:09:53.456Z", + "success": false, + "passed": 29, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 29, + "failed": 1 + } + ], + "deploymentBlockers": [ + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "evidence": "新订单应生成可查询的履约任务", + "code": "A0404", + "requestId": "0bcdfff8-f6ea-422b-8acd-31d27652e191", + "traceId": "b77bc92245d248b19a8c30f816307caf" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "evidence": "taskId=missing, status=missing", + "code": "A0404", + "requestId": "0bcdfff8-f6ea-422b-8acd-31d27652e191", + "traceId": "b77bc92245d248b19a8c30f816307caf" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "审核后入库与测量状态闭环且结果未变化", + "evidence": "processStatus=WAIT_SPLIT, measurementStatus=APPROVED, packages=4", + "code": "200", + "requestId": "00eacf5b-78af-4514-970e-4b201ea1c9ac, 3a39b11a-6356-4fdc-8fd4-9769ac7edc06", + "traceId": "e29fd0af60b34910b982c71bd68541c2" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808020947699", + "tenantId": "10001", + "orderId": "2085911321565003778", + "productImageFileId": "2085911321258819585", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085911332455493634", + "orderNo": "FL2085911321565003778", + "inboundCode": "RK-2085911321565003778", + "processStatus": "WAIT_MEASURE" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085911332455493634", + "marker": "ADMIN-API-20260808020947699" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085911332455493634", + "marker": "ADMIN-API-20260808020947699" + }, + "inboundMeasurement": { + "marker": "ADMIN-API-20260808020947699", + "tenantId": "10001", + "inboundId": "2085911332455493634", + "measurementId": "2085911339367706626", + "boxCode": "RK-2085911321565003778#4-1", + "finalStatus": "APPROVED" + } + }, + "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": "77ba71d2-8ccf-4d99-95d3-63c8ac0a1f70, 1dce5034-3f81-46c9-abbb-aebf6ccbe10a", + "traceId": "88bd7bc635d2416496e9dfc866d5c77a", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.071Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f87da53d-ee35-4a33-9f8b-a2daa3823254, 24255c9b-a03e-4fb9-9532-6736f5d1f2ea", + "traceId": "62d08d99442641b7baf2c65732bf3b57", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T02:09:48.412Z" + }, + { + "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": "18eb7bd4-11bb-4be4-9328-0170ad51f164, 4e56167a-9c9a-43d1-9591-c455c887948c", + "traceId": "5f7f9fbe1e8d4571bbbceeadbf73f1cc", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.441Z" + }, + { + "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": "18eb7bd4-11bb-4be4-9328-0170ad51f164, 4e56167a-9c9a-43d1-9591-c455c887948c", + "traceId": "5f7f9fbe1e8d4571bbbceeadbf73f1cc", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T02:09:48.441Z" + }, + { + "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": "50f45907-11b4-41e0-9206-bf0eeb5a3280, 69584929-e562-4d04-af0f-daa024d5d25d", + "traceId": "126fbe29bcaf4fd2b0744d7e077af52e", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T02:09:48.477Z" + }, + { + "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": "50f45907-11b4-41e0-9206-bf0eeb5a3280, 69584929-e562-4d04-af0f-daa024d5d25d", + "traceId": "126fbe29bcaf4fd2b0744d7e077af52e", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T02:09:48.477Z" + }, + { + "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": "4a57e590-c844-4e88-93a5-b360a96b259f, 328218e5-9d38-497a-b6b5-4c045c4afb93", + "traceId": "0572db09e377491dbf53bbc30613df0c", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.509Z" + }, + { + "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": "4a57e590-c844-4e88-93a5-b360a96b259f, 328218e5-9d38-497a-b6b5-4c045c4afb93", + "traceId": "0572db09e377491dbf53bbc30613df0c", + "evidence": "count=2", + "checkedAt": "2026-08-08T02:09:48.509Z" + }, + { + "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": "77fbfbd1-d5f7-46b4-ae7f-9aad48109acf, f94e6498-2dcf-4bf2-afe2-93ff1b68358e", + "traceId": "928a4892426f435fb37c3b5a2f141469", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.639Z" + }, + { + "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": "77fbfbd1-d5f7-46b4-ae7f-9aad48109acf, f94e6498-2dcf-4bf2-afe2-93ff1b68358e", + "traceId": "928a4892426f435fb37c3b5a2f141469", + "evidence": "count=200", + "checkedAt": "2026-08-08T02:09:48.639Z" + }, + { + "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": "424b0a14-95bd-4bd5-8a91-2861878cb3ea, db3f5372-046c-406b-a4ea-b86fb03a810f", + "traceId": "c8f2f99c6cb24f0481b3cf12f0ad5c1e", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.678Z" + }, + { + "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": "424b0a14-95bd-4bd5-8a91-2861878cb3ea, db3f5372-046c-406b-a4ea-b86fb03a810f", + "traceId": "c8f2f99c6cb24f0481b3cf12f0ad5c1e", + "evidence": "count=15", + "checkedAt": "2026-08-08T02:09:48.678Z" + }, + { + "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": "d7072117-55d3-4a71-bf62-216fe50e3a60, d75bc180-fdde-4c8d-9dfd-b3435c02898e", + "traceId": "3e2553009f184045a8289ca0f7ac7b7c", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.711Z" + }, + { + "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": "f26353e0-0432-4259-baab-7199d6dce83b, 267a867c-dfae-4e93-9e36-fe8e812dddf8", + "traceId": "4fe46afcafd241ad897c5a8c8e1661ee", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T02:09:48.740Z" + }, + { + "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": "f26353e0-0432-4259-baab-7199d6dce83b, 267a867c-dfae-4e93-9e36-fe8e812dddf8", + "traceId": "4fe46afcafd241ad897c5a8c8e1661ee", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T02:09:48.740Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085911321258819585" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "672724a8-d465-449e-acb5-739b31ea7bd8, 7cf5604f-d37b-436c-b8da-c726727ffb0b", + "traceId": "f218f5baf9ca4f77b40d2c59767554d2", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T02:09:48.761Z" + }, + { + "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": "c5ab2925-acb0-4024-bf4a-eac4c0609977, c85e4405-fff1-4296-a9f7-d8f3031b46ad", + "traceId": "845142e2340844169f2c06470795bc70", + "evidence": "marker=ADMIN-API-20260808020947699", + "checkedAt": "2026-08-08T02:09:48.816Z" + }, + { + "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": "dc00a949-db2b-4b8d-89db-adaa5a64292c, 5860d11f-5049-458f-be48-7e6d39e61945", + "traceId": "e21862bf99b44ca78e25d4199a63bd80", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.859Z" + }, + { + "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": "dc00a949-db2b-4b8d-89db-adaa5a64292c, 5860d11f-5049-458f-be48-7e6d39e61945", + "traceId": "e21862bf99b44ca78e25d4199a63bd80", + "evidence": "orderId=2085911321565003778, replayedId=2085911321565003778", + "checkedAt": "2026-08-08T02:09:48.860Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085911321565003778" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c5923fae-7af0-4542-9afe-74c9ebed558c, f9b424e3-c351-4600-b939-569fb9f14d9d", + "traceId": "713e0e0ddb1a4c628b5fa8dc20171d81", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.897Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085911321565003778" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c5923fae-7af0-4542-9afe-74c9ebed558c, f9b424e3-c351-4600-b939-569fb9f14d9d", + "traceId": "713e0e0ddb1a4c628b5fa8dc20171d81", + "evidence": "orderNo=FL2085911321565003778, status=DRAFT", + "checkedAt": "2026-08-08T02:09:48.897Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085911321565003778" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c5923fae-7af0-4542-9afe-74c9ebed558c, f9b424e3-c351-4600-b939-569fb9f14d9d", + "traceId": "713e0e0ddb1a4c628b5fa8dc20171d81", + "evidence": "cargoes=4, imageFileId=2085911321258819585", + "checkedAt": "2026-08-08T02:09:48.897Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085911321565003778/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7ab0d7cb-cf72-41df-a9a6-b6b288ec84f0, 7edb9207-b6e8-4237-a838-1742e3a64292", + "traceId": "16eb092729834a87bf16f4b23b17c8ce", + "evidence": "orderId=2085911321565003778", + "checkedAt": "2026-08-08T02:09:48.962Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085911321565003778" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1c5fa12b-14df-4147-a8df-3e10bb0525c8, af3a10d8-0107-4415-bd57-191c1c8b3bab", + "traceId": "d43df676f5ab42c1a693f4c139a26885", + "evidence": "", + "checkedAt": "2026-08-08T02:09:48.991Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085911321565003778" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1c5fa12b-14df-4147-a8df-3e10bb0525c8, af3a10d8-0107-4415-bd57-191c1c8b3bab", + "traceId": "d43df676f5ab42c1a693f4c139a26885", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T02:09:48.991Z" + }, + { + "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=FL2085911321565003778" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9f6feaef-2dea-4b9a-a302-5cf2a6cb94b3, 8c17a5ce-7940-4608-81a9-7584a0eb7f69", + "traceId": "995dfbbea5b04f639ae29382e4fd06af", + "evidence": "", + "checkedAt": "2026-08-08T02:09:49.029Z" + }, + { + "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=FL2085911321565003778" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9f6feaef-2dea-4b9a-a302-5cf2a6cb94b3, 8c17a5ce-7940-4608-81a9-7584a0eb7f69", + "traceId": "995dfbbea5b04f639ae29382e4fd06af", + "evidence": "orderId=2085911321565003778, found=true", + "checkedAt": "2026-08-08T02:09:49.029Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "abf877db-8e46-470e-b059-6a10f376f105, 06e73270-80ac-47b5-aa79-2cbd99a9968b", + "traceId": "39d15e3993b9413baaf0d521bbe03f54", + "evidence": "", + "checkedAt": "2026-08-08T02:09:49.057Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "abf877db-8e46-470e-b059-6a10f376f105, 06e73270-80ac-47b5-aa79-2cbd99a9968b", + "traceId": "39d15e3993b9413baaf0d521bbe03f54", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T02:09:49.057Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085911321565003778&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49daf389-cae0-4fd4-8c72-0e22f2bb1905, fe39e272-7d3c-47bc-874a-26574ff5e604", + "traceId": "3a230e44bdc241cc91308ab267e61256", + "evidence": "", + "checkedAt": "2026-08-08T02:09:49.088Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085911321565003778&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49daf389-cae0-4fd4-8c72-0e22f2bb1905, fe39e272-7d3c-47bc-874a-26574ff5e604", + "traceId": "3a230e44bdc241cc91308ab267e61256", + "evidence": "orderId=2085911321565003778, found=true", + "checkedAt": "2026-08-08T02:09:49.089Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "310bd517-4623-4811-83ae-9e86bf8b0e87, 9496fd04-c34e-4383-8d42-1380114c7d3c", + "traceId": "323f4551ab0744aab4cd3555cc682210", + "evidence": "", + "checkedAt": "2026-08-08T02:09:49.120Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "310bd517-4623-4811-83ae-9e86bf8b0e87, 9496fd04-c34e-4383-8d42-1380114c7d3c", + "traceId": "323f4551ab0744aab4cd3555cc682210", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T02:09:49.120Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "310bd517-4623-4811-83ae-9e86bf8b0e87, 9496fd04-c34e-4383-8d42-1380114c7d3c", + "traceId": "323f4551ab0744aab4cd3555cc682210", + "evidence": "cargoes=4, imageFileId=2085911321258819585", + "checkedAt": "2026-08-08T02:09:49.121Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cdd3105f-8de8-47be-bc85-aa99d33bc7f8, 7f717641-b063-459a-8ab2-b149e36ee4dd", + "traceId": "9b3342b8dca84db99bf54a3fe614473b", + "evidence": "", + "checkedAt": "2026-08-08T02:09:49.153Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b0b42f0e-ecac-449b-8dff-a9526e8abf90, a1f4665a-3040-46a3-b545-0d7dc3fff98a", + "traceId": "0689ea7a73e64380a85e5b2a58ed4772", + "evidence": "orderId=2085911321565003778", + "checkedAt": "2026-08-08T02:09:49.184Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7d3a19f3-2cde-4de3-9621-2f7ef89420b7, 3f523e9e-d51e-4c26-b8ef-872aa7d3f130", + "traceId": "da15c3634d7c43cbaa0a300220477e22", + "evidence": "inboundId=2085911332455493634", + "checkedAt": "2026-08-08T02:09:52.384Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8162a7d4-c987-4d1f-bec5-185edc36e310, a58ba726-d355-4fbc-bac8-c2f87b67f42d", + "traceId": "ed77fdb985244d9bb2777d664c8ec3cd", + "evidence": "inboundId=2085911332455493634", + "checkedAt": "2026-08-08T02:09:52.416Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8162a7d4-c987-4d1f-bec5-185edc36e310, a58ba726-d355-4fbc-bac8-c2f87b67f42d", + "traceId": "ed77fdb985244d9bb2777d664c8ec3cd", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:09:52.416Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8162a7d4-c987-4d1f-bec5-185edc36e310, a58ba726-d355-4fbc-bac8-c2f87b67f42d", + "traceId": "ed77fdb985244d9bb2777d664c8ec3cd", + "evidence": "inboundId=2085911332455493634, history=1", + "checkedAt": "2026-08-08T02:09:52.416Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085911321565003778&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "75c5b2a6-8368-450e-95c8-d5d97af9761b, f80f29aa-55c5-41e3-8a72-d2b6072cd395", + "traceId": "7dc877c6f8374758b6ea784155f74124", + "evidence": "", + "checkedAt": "2026-08-08T02:09:52.448Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085911321565003778&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "75c5b2a6-8368-450e-95c8-d5d97af9761b, f80f29aa-55c5-41e3-8a72-d2b6072cd395", + "traceId": "7dc877c6f8374758b6ea784155f74124", + "evidence": "inboundId=2085911332455493634, total=1", + "checkedAt": "2026-08-08T02:09:52.448Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "0bcdfff8-f6ea-422b-8acd-31d27652e191", + "traceId": "b77bc92245d248b19a8c30f816307caf", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T02:09:52.477Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "A0404", + "message": "头程履约任务不存在", + "requestId": "0bcdfff8-f6ea-422b-8acd-31d27652e191", + "traceId": "b77bc92245d248b19a8c30f816307caf", + "evidence": "taskId=missing, status=missing", + "checkedAt": "2026-08-08T02:09:52.477Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ccafcf1e-cf55-423a-8a91-3cd0eadb4d47, fff8e111-ffaa-44c7-96db-af0cebd10ae3", + "traceId": "79a3b7a750b5482ebe6521fb503eba90", + "evidence": "", + "checkedAt": "2026-08-08T02:09:52.518Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc699709-46a3-4865-855b-66171d4245c9, 22947888-5f98-41b2-9480-e4e70c07afe7", + "traceId": "2abe5de3c7e045698cc8e3760b3fdff1", + "evidence": "", + "checkedAt": "2026-08-08T02:09:52.561Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "885ce30d-5df7-46cf-a744-f5e5b5bcf059, 40231edc-e2e0-4e2a-9f36-ec746c8d6043", + "traceId": "f416478d0e4d4b779d95ae70696f66db", + "evidence": "", + "checkedAt": "2026-08-08T02:09:52.589Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "885ce30d-5df7-46cf-a744-f5e5b5bcf059, 40231edc-e2e0-4e2a-9f36-ec746c8d6043", + "traceId": "f416478d0e4d4b779d95ae70696f66db", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T02:09:52.589Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f3b06979-e316-4480-a260-00611bddbf0f, 3f37f823-8f67-4d33-8c39-3d8cfbb270a8", + "traceId": "80fb13cfbbe645ccb4e955ed9da68d93", + "evidence": "inboundId=2085911332455493634, tenantId=10001", + "checkedAt": "2026-08-08T02:09:52.619Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f3b06979-e316-4480-a260-00611bddbf0f, 3f37f823-8f67-4d33-8c39-3d8cfbb270a8", + "traceId": "80fb13cfbbe645ccb4e955ed9da68d93", + "evidence": "identity=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T02:09:52.619Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "生成箱唛 PDF 并冻结稳定箱码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085911332455493634/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13983 bytes (application/pdf)", + "requestId": "21aab6c9-d669-4d05-8369-ffd9452ebcca, c5423340-ef23-47e9-bac4-b02e875422cd, cb6c5b86-8ecb-4f24-810a-321a1d7d1e10", + "traceId": "7b87e5598b5c458db0143002ad4170b1, 80e73942d8444734b26d80a03e488735", + "evidence": "contentType=application/pdf, bytes=13983", + "checkedAt": "2026-08-08T02:09:52.751Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印后回查冻结箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d8067409-32bd-439b-abb8-6e12902e8c93, 7ebcc81e-f4b1-4b5d-b096-a11a303dad4e", + "traceId": "ec89d0a642f743aca9c94e8bb7253154", + "evidence": "", + "checkedAt": "2026-08-08T02:09:52.793Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印按订单货物冻结原始总箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d8067409-32bd-439b-abb8-6e12902e8c93, 7ebcc81e-f4b1-4b5d-b096-a11a303dad4e", + "traceId": "ec89d0a642f743aca9c94e8bb7253154", + "evidence": "inboundCodeStable=true, totalPackageCount=4", + "checkedAt": "2026-08-08T02:09:52.793Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复整单打印复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085911332455493634/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13983 bytes (application/pdf)", + "requestId": "a5da840c-9c08-4799-9386-8233539b562a, 732bc88b-e180-4a0f-a82b-afe267b121fb, d18957d9-547b-4c80-ad5b-f8442359bd02", + "traceId": "02bb1bced3d449acb3349ba24e0ab22f, 7ffe9dd50b884769a542190e82e01171", + "evidence": "boxCode=RK-2085911321565003778#4-1, contentType=application/pdf, bytes=13983", + "checkedAt": "2026-08-08T02:09:52.908Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "指定第1箱补打复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085911332455493634/carton-label-pdf?tenantId=10001&cartonIndex=1" + }, + "http": 200, + "code": null, + "message": "7792 bytes (application/pdf)", + "requestId": "6fc7d201-b6db-4b94-8ff0-94621bd87152, a936cbd9-6b34-42cf-bfc0-d8402bbfb19d, add1d1d6-169c-4e24-9ea3-2d59e8aff895", + "traceId": "eb5b8ff4b0064695876fbccca2bea7f0, bd6125f737724bdf898d3a2f68d5fa6d", + "evidence": "boxCode=RK-2085911321565003778#4-1, cartonIndex=1, contentType=application/pdf, bytes=7792", + "checkedAt": "2026-08-08T02:09:53.012Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "模拟墨家首次扫描单箱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7188976c-6138-4228-a3bb-76875bcfcc13, dfe1f6fa-452e-4ce8-9a03-18d21232e084", + "traceId": "3989b753123e4724968fc9b27db7bffe", + "evidence": "boxCode=RK-2085911321565003778#4-1, machineNo=MJ-ADMIN-E2E-01", + "checkedAt": "2026-08-08T02:09:53.059Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次扫描新增一条且默认代表1箱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7188976c-6138-4228-a3bb-76875bcfcc13, dfe1f6fa-452e-4ce8-9a03-18d21232e084", + "traceId": "3989b753123e4724968fc9b27db7bffe", + "evidence": "created=true, confirmedPackageCount=1", + "checkedAt": "2026-08-08T02:09:53.060Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复打印及指定箱补打后原箱码仍可解析", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7188976c-6138-4228-a3bb-76875bcfcc13, dfe1f6fa-452e-4ce8-9a03-18d21232e084", + "traceId": "3989b753123e4724968fc9b27db7bffe", + "evidence": "boxCodeStable=true, resolvedInboundId=2085911332455493634", + "checkedAt": "2026-08-08T02:09:53.060Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询箱级测量详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d0a4ae57-e552-479f-9539-a1e999b22849, 5d2f2cf2-ca81-410b-aca6-3285b7ff5a2c", + "traceId": "b9fa8de9eab24be28aea6beb35b8d6e2", + "evidence": "measurementId=2085911339367706626", + "checkedAt": "2026-08-08T02:09:53.088Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "箱级查询回显箱码、尺寸、图片与设备信息", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d0a4ae57-e552-479f-9539-a1e999b22849, 5d2f2cf2-ca81-410b-aca6-3285b7ff5a2c", + "traceId": "b9fa8de9eab24be28aea6beb35b8d6e2", + "evidence": "itemFound=true, imageFileId=2085911339332075522", + "checkedAt": "2026-08-08T02:09:53.088Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "人工确认当前测量代表箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/items/2085911339371900929/confirmed-package-count?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d1ba611f-94d7-472a-91c0-25c0e0451f06, 00e95af9-e418-42d3-9320-8a7bb725c09e", + "traceId": "cc4a73cc7ddf43e9b3490ebf2996e7dd", + "evidence": "confirmedPackageCount=4", + "checkedAt": "2026-08-08T02:09:53.122Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "人工箱数更新且测量版本递增", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/items/2085911339371900929/confirmed-package-count?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d1ba611f-94d7-472a-91c0-25c0e0451f06, 00e95af9-e418-42d3-9320-8a7bb725c09e", + "traceId": "cc4a73cc7ddf43e9b3490ebf2996e7dd", + "evidence": "version=2", + "checkedAt": "2026-08-08T02:09:53.123Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "同箱号重新扫描覆盖当前记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af20a366-5324-4e1a-963b-be573a6dbc46, 59e664ba-a11a-43b7-9201-0c4822d82bcb", + "traceId": "fb4709ce87464383a3d823287096a790", + "evidence": "boxCode=RK-2085911321565003778#4-1, machineNo=MJ-ADMIN-E2E-02", + "checkedAt": "2026-08-08T02:09:53.194Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "覆盖保留同一条记录和人工箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af20a366-5324-4e1a-963b-be573a6dbc46, 59e664ba-a11a-43b7-9201-0c4822d82bcb", + "traceId": "fb4709ce87464383a3d823287096a790", + "evidence": "sameItem=true, confirmedPackageCount=4", + "checkedAt": "2026-08-08T02:09:53.194Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "回查覆盖后的尺寸与体积结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "73d8f01e-e089-4cb6-9367-fbc60c38157f, 629675b7-3f11-403e-a469-acf46aea2c9d", + "traceId": "6b43ca1ef2d6437a87157f5635141df7", + "evidence": "", + "checkedAt": "2026-08-08T02:09:53.219Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "覆盖尺寸、箱数和服务端体积公式正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "73d8f01e-e089-4cb6-9367-fbc60c38157f, 629675b7-3f11-403e-a469-acf46aea2c9d", + "traceId": "6b43ca1ef2d6437a87157f5635141df7", + "evidence": "unitVolume=0.0788, totalVolume=0.3152, volumeWeight=52.639, girth=206.1", + "checkedAt": "2026-08-08T02:09:53.219Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "测量详情缺少货物ID时回查隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "05c736d8-c3ce-49a1-91a1-1f50df0c0cd4, b402b06e-63f8-4570-a0c0-a28993fb8575", + "traceId": "7d5aa68a2b1f4c13ba03e79ea4d4207b", + "evidence": "orderId=2085911321565003778", + "checkedAt": "2026-08-08T02:09:53.255Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "草稿绑定本轮箱码对应的隔离货物", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085911321565003778?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "05c736d8-c3ce-49a1-91a1-1f50df0c0cd4, b402b06e-63f8-4570-a0c0-a28993fb8575", + "traceId": "7d5aa68a2b1f4c13ba03e79ea4d4207b", + "evidence": "cargoCount=4, markerMatched=true, inboundDetailId=2085911321569198081", + "checkedAt": "2026-08-08T02:09:53.255Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "保存同一测量批次草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/draft?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fe46f651-3170-437a-b384-419f72559ffc, d9db9692-420e-413f-b800-662e15d0c909", + "traceId": "b304cebb7a5f432b8a4fb325f97b6be3", + "evidence": "measurementId=2085911339367706626, items=1", + "checkedAt": "2026-08-08T02:09:53.308Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "草稿沿用批次并递增版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/draft?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fe46f651-3170-437a-b384-419f72559ffc, d9db9692-420e-413f-b800-662e15d0c909", + "traceId": "b304cebb7a5f432b8a4fb325f97b6be3", + "evidence": "status=DRAFT, version=4", + "checkedAt": "2026-08-08T02:09:53.308Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "提交测量审核", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/submit?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "896b156a-584c-4d03-8e2e-ffc44860ab7d, c3f08e3b-60a6-418d-9d17-cc8a852c3f3f", + "traceId": "80fdd61b5cc142aba5d36c3881bbd6e3", + "evidence": "measurementId=2085911339367706626", + "checkedAt": "2026-08-08T02:09:53.337Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "提交后进入待测量审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/submit?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "896b156a-584c-4d03-8e2e-ffc44860ab7d, c3f08e3b-60a6-418d-9d17-cc8a852c3f3f", + "traceId": "80fdd61b5cc142aba5d36c3881bbd6e3", + "evidence": "processStatus=MEASURE_PENDING, reviewStatus=PENDING", + "checkedAt": "2026-08-08T02:09:53.337Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "测量提交后拒绝设备覆盖并返回中文提示", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "测量已提交,设备不能新增或覆盖数据", + "requestId": "e7ad994b-a372-482b-af6f-047d3ab1fa8d", + "traceId": "12c5ac94e1db4a8da08a5317ab399605", + "evidence": "HTTP=200, code=A0409, chineseMessage=true", + "checkedAt": "2026-08-08T02:09:53.363Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "审核前读取最新入库单版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dce6feae-a43b-4d78-acbc-a3e9a1f2b845, 857fd6f7-7249-4b44-952d-9f37a70c5fb2", + "traceId": "6214435d9fea4ccd90a76ee3486ebcff", + "evidence": "", + "checkedAt": "2026-08-08T02:09:53.395Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "审核前状态和版本有效", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085911332455493634?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "dce6feae-a43b-4d78-acbc-a3e9a1f2b845, 857fd6f7-7249-4b44-952d-9f37a70c5fb2", + "traceId": "6214435d9fea4ccd90a76ee3486ebcff", + "evidence": "status=MEASURE_PENDING, version=2", + "checkedAt": "2026-08-08T02:09:53.395Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "Admin 审核通过墨家测量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/inbounds/2085911332455493634/measurements/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c6e02229-3156-4a6e-bd5b-f9c4210bce16, eb2775d4-44c0-4ed4-9120-ad2be644a67e", + "traceId": "7d8d68a69f6042bab90e5ea669484d5e", + "evidence": "measurementId=2085911339367706626", + "checkedAt": "2026-08-08T02:09:53.431Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询审核后的最终测量状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "00eacf5b-78af-4514-970e-4b201ea1c9ac, 3a39b11a-6356-4fdc-8fd4-9769ac7edc06", + "traceId": "e29fd0af60b34910b982c71bd68541c2", + "evidence": "", + "checkedAt": "2026-08-08T02:09:53.456Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "审核后入库与测量状态闭环且结果未变化", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085911332455493634/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "00eacf5b-78af-4514-970e-4b201ea1c9ac, 3a39b11a-6356-4fdc-8fd4-9769ac7edc06", + "traceId": "e29fd0af60b34910b982c71bd68541c2", + "evidence": "processStatus=WAIT_SPLIT, measurementStatus=APPROVED, packages=4", + "checkedAt": "2026-08-08T02:09:53.456Z" + } + ] +} diff --git a/reports/client-test-env-20260808013900-7c6144bd.json b/reports/client-test-env-20260808013900-7c6144bd.json new file mode 100644 index 000000000..ea63e5d70 --- /dev/null +++ b/reports/client-test-env-20260808013900-7c6144bd.json @@ -0,0 +1,1076 @@ +{ + "marker": "20260808013900-7c6144bd", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:39:00.467Z", + "completedAt": "2026-08-08T01:39:04.184Z", + "success": true, + "fatal": null, + "testAccount": { + "username": "client_20260808013900_8ff529", + "companyName": "客户端全链路测试企业-20260808013900-7c6144bd", + "legalPhone": "13953140469" + }, + "resources": { + "tenantId": "2085903570590879745", + "membershipId": "2085903570590879747", + "reviewId": "2085903574869069825", + "productImageFileId": "2085903579819343873", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "orderIds": [ + "2085903574018621441", + "2085903580343631874", + "2085903582721802241" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:00.469Z", + "durationMs": 390, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-95abd3b6-102c-49b9-ba03-0ace23e786fc, client-e2e-95abd3b6-102c-49b9-ba03-0ace23e786fc", + "traceId": "8869e51fc9b94ffc93f84be57a63487b", + "evidence": { + "tenantId": "2085903570590879745", + "membershipId": "2085903570590879747", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:00.859Z", + "durationMs": 36, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-5ef1d169-e524-456d-a483-6cdd9888e056, client-e2e-5ef1d169-e524-456d-a483-6cdd9888e056", + "traceId": "bec71e53f9864b1eb86e369426de7c3f", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:00.895Z", + "durationMs": 329, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-88ad0ade-a91f-4309-a6ab-809c25c04e30, client-e2e-88ad0ade-a91f-4309-a6ab-809c25c04e30", + "traceId": "3c79fb64e38f444b8b10051e6bd6ac94", + "evidence": { + "username": "client_20260808013900_8ff529" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.224Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9738992b-3555-4f34-ab50-e086c34ba950, client-e2e-9738992b-3555-4f34-ab50-e086c34ba950", + "traceId": "7c7e3f223e2f4a90a64db06c2c3ac88f", + "evidence": { + "id": "2085903570590879745", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808013900-7c6144bd" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.247Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8c74030b-5708-4efa-bf1d-a9009386e0ce, client-e2e-8c74030b-5708-4efa-bf1d-a9009386e0ce", + "traceId": "40e333062f954c549ed3642622ebb71c", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.288Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f216c2aa-18b1-4c64-a42f-d101ddc01c12, client-e2e-f216c2aa-18b1-4c64-a42f-d101ddc01c12", + "traceId": "7ce5652505c444a483e7f1f8f6977b2d", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.350Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-de483567-1c30-4f31-91bd-6e4a72566623, client-e2e-de483567-1c30-4f31-91bd-6e4a72566623", + "traceId": "481b2cd22ab44024971f7f2e7cea3c19", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.390Z", + "durationMs": 48, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-696ef0e2-7163-4491-857c-60f7ee48b8b7, client-e2e-696ef0e2-7163-4491-857c-60f7ee48b8b7", + "traceId": "3afcbababf4043ac9598910ad0002e85", + "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-08T01:39:01.438Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ef64f66b-25c1-41e2-ad3a-f1188e33b536, client-e2e-ef64f66b-25c1-41e2-ad3a-f1188e33b536", + "traceId": "df4174169d21452eaf1b3aaa6792584a", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.481Z", + "durationMs": 49, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-866a68db-4bab-4618-8e33-eeee8a6cfb37, client-e2e-866a68db-4bab-4618-8e33-eeee8a6cfb37", + "traceId": "b144dba0f6e34034b637d76dffc334ad", + "evidence": { + "fileId": "2085903573532082178", + "fileName": "product-20260808013900-7c6144bd.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.531Z", + "durationMs": 39, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-ab208c7d-ee87-47d6-950b-3f5b7db690e3, client-e2e-ab208c7d-ee87-47d6-950b-3f5b7db690e3", + "traceId": "fc2f3993c0564a8287ee1791eb93af52", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.570Z", + "durationMs": 83, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-792cb344-a0ca-479f-935b-5724efca8e70, client-e2e-792cb344-a0ca-479f-935b-5724efca8e70", + "traceId": "86e56e45820a46dea3cb39ca467e7890", + "evidence": { + "orderId": "2085903574018621441", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.653Z", + "durationMs": 46, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a7db17bb-ef46-441a-8ed0-b91f05157acb, client-e2e-a7db17bb-ef46-441a-8ed0-b91f05157acb", + "traceId": "21fdde83042243e19f43af864afa4dc1", + "evidence": { + "orderId": "2085903574018621441", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.699Z", + "durationMs": 49, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-6ceb29b0-4678-4e3d-b52a-2ffb4aea6fd6, client-e2e-6ceb29b0-4678-4e3d-b52a-2ffb4aea6fd6", + "traceId": "052a3a410f5149a482ca4c70bb899ced", + "evidence": { + "orderId": "2085903574018621441", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.748Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-54604810-63fc-4ae4-b83f-3751410c6e90, client-e2e-54604810-63fc-4ae4-b83f-3751410c6e90", + "traceId": "0bf80c7ef88342e38e99acdfe154ba4e", + "evidence": { + "businessLicenseQualificationId": "2085903574588051457", + "legalPersonIdQualificationId": "2085903574592245761", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.788Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e427db1f-8f26-4207-9d30-4dc9c63ce5e0, client-e2e-e427db1f-8f26-4207-9d30-4dc9c63ce5e0", + "traceId": "ba41f53c10ef4e9a9388544c523db93f", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085903574588051457", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085903574592245761", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.812Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e070a759-336c-405f-8bf1-c664da80472c, client-e2e-e070a759-336c-405f-8bf1-c664da80472c", + "traceId": "68c96f775cd74da3a4d932bea74bb823", + "evidence": { + "tenantId": "2085903570590879745", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:01.853Z", + "durationMs": 344, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4cb5e847-22a5-428c-b841-77d978e28c2f, client-e2e-4cb5e847-22a5-428c-b841-77d978e28c2f", + "traceId": "768faa0bb61548fda976fef3014afe02", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.197Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0dd0c4f5-a2e2-4766-abb4-15e82a92f3f3, client-e2e-0dd0c4f5-a2e2-4766-abb4-15e82a92f3f3", + "traceId": "91e7447c601e418f87d2864f6a797ec0", + "evidence": { + "reviewId": "2085903574869069825", + "tenantId": "2085903570590879745", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.231Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c82882bc-9b5a-4f0c-9777-06088dec1d40, client-e2e-c82882bc-9b5a-4f0c-9777-06088dec1d40", + "traceId": "1cd71be1947b443089d35d737000e47f", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085903574588051457", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085903574592245761", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.262Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3340ca40-2bda-490b-b43b-4c08d58cb96c, client-e2e-3340ca40-2bda-490b-b43b-4c08d58cb96c", + "traceId": "4b49cd62e24442fdb9b468867bf0d912", + "evidence": { + "tenantId": "2085903570590879745", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.309Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-86b7eb33-dc5d-4133-a282-492c1b2ee51c, client-e2e-86b7eb33-dc5d-4133-a282-492c1b2ee51c", + "traceId": "cde0c3472cc747599f38ef29d2c150fa", + "evidence": { + "membershipId": "2085903570590879747", + "username": "client_20260808013900_8ff529", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.347Z", + "durationMs": 348, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d74dd66a-2b1a-4f2e-b0f4-57f6de07bc58, client-e2e-d74dd66a-2b1a-4f2e-b0f4-57f6de07bc58", + "traceId": "73f8870b801f4a4bb49e1cf7a1be4bb7", + "evidence": { + "username": "client_20260808013900_8ff529" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.695Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-034871b9-751f-4c1a-bf70-5d8546cad891, client-e2e-034871b9-751f-4c1a-bf70-5d8546cad891", + "traceId": "e645ca8fa2814e22aedfe001ef1a2990", + "evidence": { + "id": "2085903570590879745", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808013900-7c6144bd" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.728Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7d558652-07d9-469c-9a21-10f35d729e16, client-e2e-7d558652-07d9-469c-9a21-10f35d729e16", + "traceId": "191e54e6fc91481e96204e1dbe9decbf", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085903574588051457", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085903574592245761", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.763Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-00819289-8497-41e0-9b25-a68d4bd4d6f4, client-e2e-00819289-8497-41e0-9b25-a68d4bd4d6f4", + "traceId": "8a432232415747b0a7b57de05117a259", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.800Z", + "durationMs": 78, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-51f6f62d-b121-41dd-9cad-5041f65984bb, client-e2e-51f6f62d-b121-41dd-9cad-5041f65984bb", + "traceId": "a37bd144ff104f0fa9975f9a51b0c1fa", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.878Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4b2434d1-d06d-477a-a818-d05eb804199f, client-e2e-4b2434d1-d06d-477a-a818-d05eb804199f", + "traceId": "28a32fe5fd994bd89c8995eec1755d01", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.905Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-10da604f-41a7-4d39-badd-7ca6d91dbe09, client-e2e-10da604f-41a7-4d39-badd-7ca6d91dbe09", + "traceId": "cec6b1c5e2194c52a93fa8611520bc31", + "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-08T01:39:02.958Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f8ee393f-56e1-491f-9b9b-786bfd999ddc, client-e2e-f8ee393f-56e1-491f-9b9b-786bfd999ddc", + "traceId": "74f06b4d528c4dc9acc6d388e723c9d5", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "order-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:02.994Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-38c4c8b7-c107-4417-92de-7ce963a7c779, client-e2e-38c4c8b7-c107-4417-92de-7ce963a7c779", + "traceId": "9968cc0c5c8f4c95a0ae1b6d28ea786f", + "evidence": { + "fileId": "2085903579819343873", + "fileName": "product-20260808013900-7c6144bd.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.032Z", + "durationMs": 38, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-95c99a81-8a8a-431f-8a8c-47beba469082, client-e2e-95c99a81-8a8a-431f-8a8c-47beba469082", + "traceId": "3b9773541b564acca8c295d13a97b126", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.070Z", + "durationMs": 97, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8e56579e-020a-46cb-860e-362d9795a7bc, client-e2e-8e56579e-020a-46cb-860e-362d9795a7bc", + "traceId": "8d1fef33765943f297564b5a2902488a", + "evidence": { + "orderId": "2085903580343631874" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.167Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fda657ea-fa9a-4f82-9548-4cc329dc750b, client-e2e-fda657ea-fa9a-4f82-9548-4cc329dc750b", + "traceId": "82c5abe808bf46189b2206f48c94dff2", + "evidence": { + "orderId": "2085903580343631874", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.200Z", + "durationMs": 101, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1f0401d4-10da-4488-93ac-196e1da38e90, client-e2e-1f0401d4-10da-4488-93ac-196e1da38e90", + "traceId": "eda87367437949919a01b8c3155e53a5", + "evidence": { + "orderId": "2085903580343631874", + "customerRemark": "edited-20260808013900-7c6144bd" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.301Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f051d1d8-a353-4676-b9a2-12a2f6b32fd4, client-e2e-f051d1d8-a353-4676-b9a2-12a2f6b32fd4", + "traceId": "d1d46a33341e429da03ce9c351de5ac7", + "evidence": { + "orderId": "2085903580343631874", + "orderNo": "FL2085903580343631874", + "status": "DRAFT", + "cargo": { + "id": "2085903580943417346", + "skuNo": "SKU-ACTIVE-20260808013900-7c6144bd", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808013900-7c6144bd", + "referenceId": "REF-ACTIVE-20260808013900-7c6144bd", + "productImageFileId": "2085903579819343873" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.341Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bc8f92c9-7ddd-4e5a-8454-0b1562c5f897, client-e2e-bc8f92c9-7ddd-4e5a-8454-0b1562c5f897", + "traceId": "6f45f2951cc54f2dbc31f430965884ac", + "evidence": { + "total": "1", + "orderId": "2085903580343631874", + "orderNo": "FL2085903580343631874", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.403Z", + "durationMs": 149, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b44450ba-203a-4448-a131-893eed7bb6ac, client-e2e-b44450ba-203a-4448-a131-893eed7bb6ac", + "traceId": "b3edec42edb74bef9c770ca3637419e7", + "evidence": { + "orderId": "2085903580343631874" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.552Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-abc97d69-66d0-48e3-8eb3-35c5a14e7bcf, client-e2e-abc97d69-66d0-48e3-8eb3-35c5a14e7bcf", + "traceId": "87ee741e171545f6b5c8954503b687e2", + "evidence": { + "orderId": "2085903580343631874", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.588Z", + "durationMs": 45, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7de16c22-f929-4e2f-a7ae-dcb37e32b75e, client-e2e-7de16c22-f929-4e2f-a7ae-dcb37e32b75e", + "traceId": "e8216af96003457a944e6d4700e0352a", + "evidence": { + "orderId": "2085903580343631874", + "orderNo": "FL2085903580343631874", + "status": "SUBMITTED" + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.633Z", + "durationMs": 95, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b13523df-539d-49c7-8cdd-df8e0b4f124f, client-e2e-b13523df-539d-49c7-8cdd-df8e0b4f124f", + "traceId": "243574402bd0465199f51fe70eb399ea", + "evidence": { + "orderId": "2085903582721802241" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.728Z", + "durationMs": 49, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-55e242b8-78c4-4342-a8e7-02e1b3dcc8ec, client-e2e-55e242b8-78c4-4342-a8e7-02e1b3dcc8ec", + "traceId": "1e88e78a29eb410cb192f15ed3b8d582", + "evidence": { + "orderId": "2085903582721802241" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.777Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-88792e80-addd-4171-8c41-d9807d2f4641, client-e2e-88792e80-addd-4171-8c41-d9807d2f4641", + "traceId": "ae2935dd55e94951b87e3e3fc6cddbee", + "evidence": { + "orderId": "2085903582721802241", + "status": "CANCELLED" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:03.818Z", + "durationMs": 328, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0fd456ae-5ca1-4c2e-abfb-8097995ac738, client-e2e-0fd456ae-5ca1-4c2e-abfb-8097995ac738", + "traceId": "f7aaf30a15d24576985a5635c9e54d19", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:39:04.146Z", + "durationMs": 38, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-03eb83f5-5571-4073-9a8a-2071864bf8fa, client-e2e-03eb83f5-5571-4073-9a8a-2071864bf8fa", + "traceId": "3e222bfe4d3a48dc82b21dcaca210e5c", + "evidence": { + "orderId": "2085903580343631874", + "rejectionCode": "A0404" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808014530-5a43cd64.json b/reports/client-test-env-20260808014530-5a43cd64.json new file mode 100644 index 000000000..5c1de4e6b --- /dev/null +++ b/reports/client-test-env-20260808014530-5a43cd64.json @@ -0,0 +1,771 @@ +{ + "marker": "20260808014530-5a43cd64", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:45:30.640Z", + "completedAt": "2026-08-08T01:45:33.768Z", + "success": false, + "fatal": { + "name": "Error", + "message": "system role is required" + }, + "testAccount": { + "username": "client_20260808014530_c35db3", + "companyName": "客户端全链路测试企业-20260808014530-5a43cd64", + "legalPhone": "13953530641" + }, + "resources": { + "tenantId": "2085905207086665730", + "membershipId": "2085905207086665732", + "reviewId": "2085905211088031745", + "productImageFileId": "2085905209935593474", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": null, + "orderIds": [ + "2085905210350829570" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:30.641Z", + "durationMs": 385, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c7794425-ab36-4269-a9b5-f5b4f86a3137, client-e2e-c7794425-ab36-4269-a9b5-f5b4f86a3137", + "traceId": "1d05138199574e85959dc74fd1a1b591", + "evidence": { + "tenantId": "2085905207086665730", + "membershipId": "2085905207086665732", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.026Z", + "durationMs": 34, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-fb418bb4-bc3b-46c9-9142-d1ee80c3e2c4, client-e2e-fb418bb4-bc3b-46c9-9142-d1ee80c3e2c4", + "traceId": "3872c33ca42b4df2aec314d50ffbd617", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.061Z", + "durationMs": 342, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3b1567e4-778b-40f8-9d2c-c1a9305f5a15, client-e2e-3b1567e4-778b-40f8-9d2c-c1a9305f5a15", + "traceId": "77778d9ae75d4796ac6091eff4419277", + "evidence": { + "username": "client_20260808014530_c35db3" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.403Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fdea7af8-745a-4164-8ff1-f151a514dbb8, client-e2e-fdea7af8-745a-4164-8ff1-f151a514dbb8", + "traceId": "6bcc058353464d868420c6200d381ddb", + "evidence": { + "id": "2085905207086665730", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808014530-5a43cd64" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.431Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5da4d470-0c10-4c49-8e73-8e252fd63dc6, client-e2e-5da4d470-0c10-4c49-8e73-8e252fd63dc6", + "traceId": "ad9e049be6934a08aad12c88a2fdb252", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.463Z", + "durationMs": 73, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-67d8254c-9b79-42d5-8df5-48df4b81d931, client-e2e-67d8254c-9b79-42d5-8df5-48df4b81d931", + "traceId": "e24f5f82f419469e877a29b4f696a18f", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.536Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b8d9aacc-fef5-40ee-8e77-7784ef3db66f, client-e2e-b8d9aacc-fef5-40ee-8e77-7784ef3db66f", + "traceId": "9d954f424b504b7bb978f01684cdf8ee", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.567Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-41874113-4ffb-4523-aa2e-dd1aac001f30, client-e2e-41874113-4ffb-4523-aa2e-dd1aac001f30", + "traceId": "325f2af177f64eefac20083ee9840d03", + "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-08T01:45:31.609Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0fc5f34b-4873-4bbf-971d-f2eb852f9979, client-e2e-0fc5f34b-4873-4bbf-971d-f2eb852f9979", + "traceId": "dc27cbd326cc477fae138ca02c1ba745", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.645Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-38af106a-fc7e-4c06-bdf3-67506fe7556b, client-e2e-38af106a-fc7e-4c06-bdf3-67506fe7556b", + "traceId": "bee77f8cfa2a4e5fa2f57bbc48000808", + "evidence": { + "fileId": "2085905209935593474", + "fileName": "product-20260808014530-5a43cd64.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.682Z", + "durationMs": 29, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-e3a22c2a-5b4d-43bc-ba4f-a6fed0cdc1ad, client-e2e-e3a22c2a-5b4d-43bc-ba4f-a6fed0cdc1ad", + "traceId": "13991b6b039144ddbb87428938824b2f", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.712Z", + "durationMs": 75, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3cf5d757-9ff8-4478-8f45-d6df37f04f2b, client-e2e-3cf5d757-9ff8-4478-8f45-d6df37f04f2b", + "traceId": "7e68c91e2f5147688862d71ad961870e", + "evidence": { + "orderId": "2085905210350829570", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.787Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-634721a6-f68a-44f7-a220-2067585f9ef9, client-e2e-634721a6-f68a-44f7-a220-2067585f9ef9", + "traceId": "6df3ed2d9b13433a810ef9d3be6420f4", + "evidence": { + "orderId": "2085905210350829570", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.816Z", + "durationMs": 29, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-5b65d3ca-0edf-4be8-96d1-5299af7a5a72, client-e2e-5b65d3ca-0edf-4be8-96d1-5299af7a5a72", + "traceId": "50b158e39c564395aa2c36af7f5e08a8", + "evidence": { + "orderId": "2085905210350829570", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.845Z", + "durationMs": 49, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-85dddf86-f87e-4ca6-af55-70ff44d67078, client-e2e-85dddf86-f87e-4ca6-af55-70ff44d67078", + "traceId": "a1d8108021514d4cabe14a4c206b1ab0", + "evidence": { + "businessLicenseQualificationId": "2085905210794430466", + "legalPersonIdQualificationId": "2085905210798624769", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.894Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-60e34c44-4eee-4365-a039-3653840f7806, client-e2e-60e34c44-4eee-4365-a039-3653840f7806", + "traceId": "c7da811803f04c118926f42e284b7680", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905210794430466", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905210798624769", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.920Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-36cbbcb1-6413-4da3-88ee-b260bcd8393f, client-e2e-36cbbcb1-6413-4da3-88ee-b260bcd8393f", + "traceId": "bccae7d6b31f4223afca1d2c024b884d", + "evidence": { + "tenantId": "2085905207086665730", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:31.958Z", + "durationMs": 570, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3ffc0660-9bc8-4094-ad82-7c5d4ca74f15, client-e2e-3ffc0660-9bc8-4094-ad82-7c5d4ca74f15", + "traceId": "d6f120c86bc1408394ebe84803cdf112", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:32.528Z", + "durationMs": 21, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-11539108-592a-440b-8849-31b751d3b0a5, client-e2e-11539108-592a-440b-8849-31b751d3b0a5", + "traceId": "590c16ed44c8495c88d0d29a52b68f44", + "evidence": { + "reviewId": "2085905211088031745", + "tenantId": "2085905207086665730", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:32.549Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c99aba15-c0d9-429c-b417-2dbfb1ec456f, client-e2e-c99aba15-c0d9-429c-b417-2dbfb1ec456f", + "traceId": "4e805a99bf134ff5be1aa9c1d091e5cc", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905210794430466", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905210798624769", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:32.586Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1c9e31f9-16cd-4a1f-a96b-6cc1c204c195, client-e2e-1c9e31f9-16cd-4a1f-a96b-6cc1c204c195", + "traceId": "b6e371ef58704f3a827dcf3919d416c9", + "evidence": { + "tenantId": "2085905207086665730", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:32.622Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2cc4f5e3-fa0d-410b-8c97-a9be991fc68f, client-e2e-2cc4f5e3-fa0d-410b-8c97-a9be991fc68f", + "traceId": "77418746198a44b282efcd740ae67fe6", + "evidence": { + "membershipId": "2085905207086665732", + "username": "client_20260808014530_c35db3", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:32.654Z", + "durationMs": 330, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4575fcf9-7c1d-42b8-af71-0a8320480c3e, client-e2e-4575fcf9-7c1d-42b8-af71-0a8320480c3e", + "traceId": "01426a07828a4cfa833fa0a55f45f1a2", + "evidence": { + "username": "client_20260808014530_c35db3" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:32.984Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-45c80e5b-518e-4c79-a002-8895b07e934a, client-e2e-45c80e5b-518e-4c79-a002-8895b07e934a", + "traceId": "33835089a75346259faf3e4be7fc4cab", + "evidence": { + "id": "2085905207086665730", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808014530-5a43cd64" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.019Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b5ca7293-3bc8-4fe9-acec-ba780b883598, client-e2e-b5ca7293-3bc8-4fe9-acec-ba780b883598", + "traceId": "e9dde9eb1c304d59a84a119073150341", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905210794430466", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085905210798624769", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.052Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0a73393c-f9ae-4b14-88ab-55935757a54a, client-e2e-0a73393c-f9ae-4b14-88ab-55935757a54a", + "traceId": "452e015390f940238d2568ad4916b89b", + "evidence": { + "id": "2085905207086665730", + "tenantName": "客户端全链路测试企业-20260808014530-5a43cd64", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.082Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-80ee9d05-b29b-4a40-afbd-555bcccd5556, client-e2e-80ee9d05-b29b-4a40-afbd-555bcccd5556", + "traceId": "5ff4bf3c6368427cbdc31b5834f5271d", + "evidence": { + "id": "2085905207086665730", + "tenantName": "客户端全链路测试企业-20260808014530-5a43cd64-已编辑", + "contactName": "企业联系人-20260808014530-5a43cd64", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.125Z", + "durationMs": 21, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ec89642c-289d-4126-a0dd-150240edada4, client-e2e-ec89642c-289d-4126-a0dd-150240edada4", + "traceId": "da8dda311d904eb59942aff9069de6e3", + "evidence": { + "id": "2085905207086665730", + "tenantName": "客户端全链路测试企业-20260808014530-5a43cd64-已编辑", + "contactEmail": "company_202608080145305a43cd64@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.146Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-76865186-3db6-4172-8ebc-3df342f78665, client-e2e-76865186-3db6-4172-8ebc-3df342f78665", + "traceId": "3771e32c220e439fb3f2ebff0a7e752d", + "evidence": { + "userId": "2085905207086665731", + "username": "client_20260808014530_c35db3", + "displayName": "测试管理员-20260808014530-5a43cd64" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.173Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ced218a9-a8d8-4991-9122-bb10e574006a, client-e2e-ced218a9-a8d8-4991-9122-bb10e574006a", + "traceId": "bfdc316613204a13b2f1be04c4ac8095", + "evidence": { + "userId": "2085905207086665731", + "username": "client_20260808014530_c35db3", + "displayName": "测试企业管理员-20260808014530-5a43cd64" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.215Z", + "durationMs": 346, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-40c1f77b-720f-414a-b4e9-9f6832fc6860, client-e2e-40c1f77b-720f-414a-b4e9-9f6832fc6860", + "traceId": "952b1d17ba8742898b658b6358d16867", + "evidence": { + "username": "client_20260808014530_c35db3" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.561Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-43d40bc7-8036-4bab-ad8e-13cf29b4671e, client-e2e-43d40bc7-8036-4bab-ad8e-13cf29b4671e", + "traceId": "c76ed4050f5e49269489ff80cc76436d", + "evidence": { + "userId": "2085905207086665731", + "username": "client_20260808014530_c35db3", + "displayName": "测试企业管理员-20260808014530-5a43cd64" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.599Z", + "durationMs": 138, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d341aa52-7250-4f4b-b8e0-a70303366d06, client-e2e-d341aa52-7250-4f4b-b8e0-a70303366d06", + "traceId": "f582262ec52c4239b2d025c6e85f977f", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:45:33.737Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-235e0999-bffc-4926-93af-9a61f7fa2223, client-e2e-235e0999-bffc-4926-93af-9a61f7fa2223", + "traceId": "ccc2bed8eaaf48029a9cb40705a9da90", + "evidence": { + "roleCount": 0 + }, + "error": { + "name": "Error", + "message": "system role is required" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808014601-8393184f.json b/reports/client-test-env-20260808014601-8393184f.json new file mode 100644 index 000000000..fe423a119 --- /dev/null +++ b/reports/client-test-env-20260808014601-8393184f.json @@ -0,0 +1,1125 @@ +{ + "marker": "20260808014601-8393184f", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:46:01.443Z", + "completedAt": "2026-08-08T01:46:06.925Z", + "success": false, + "fatal": { + "name": "Error", + "message": "unexpected HTTP status 401" + }, + "testAccount": { + "username": "client_20260808014601_17673d", + "companyName": "客户端全链路测试企业-20260808014601-8393184f", + "legalPhone": "13953561444" + }, + "resources": { + "tenantId": "2085905336283811841", + "membershipId": "2085905336283811843", + "reviewId": "2085905340360675330", + "productImageFileId": "2085905339128545282", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": "2085905346656325633", + "testMembershipId": "2085905347470020611", + "orderIds": [ + "2085905339543781378" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:01.445Z", + "durationMs": 391, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-57c4d310-39f1-4f72-8119-81775ff24163, client-e2e-57c4d310-39f1-4f72-8119-81775ff24163", + "traceId": "673393448ac9489a9d91bb270c43fe67", + "evidence": { + "tenantId": "2085905336283811841", + "membershipId": "2085905336283811843", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:01.836Z", + "durationMs": 39, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-4e273064-2072-48b1-998e-2c7c496f7249, client-e2e-4e273064-2072-48b1-998e-2c7c496f7249", + "traceId": "1f9e3255cf9f42728c06ca66d936e8ec", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:01.875Z", + "durationMs": 338, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ec13b85e-4075-46aa-beef-ab853b75a9f6, client-e2e-ec13b85e-4075-46aa-beef-ab853b75a9f6", + "traceId": "3ff987ff26bb40d6a2193f902bdeda42", + "evidence": { + "username": "client_20260808014601_17673d" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.213Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a5e1f128-ba2c-4fe9-ab8a-f942ddcd3c3b, client-e2e-a5e1f128-ba2c-4fe9-ab8a-f942ddcd3c3b", + "traceId": "df6c32ae8f834eab88ca5d941b28f570", + "evidence": { + "id": "2085905336283811841", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808014601-8393184f" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.235Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a2fc6d6e-2f93-47f2-87c7-7cd8f98c0095, client-e2e-a2fc6d6e-2f93-47f2-87c7-7cd8f98c0095", + "traceId": "cf0a755f67174d76a8b789951bedbf05", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.268Z", + "durationMs": 60, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-21bba651-c037-49f2-92fa-8c6715aaa587, client-e2e-21bba651-c037-49f2-92fa-8c6715aaa587", + "traceId": "c28a24f00a8f4e868be88bd1c9058ec9", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.328Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9959711b-40b0-4c2c-bfb6-6661855ac14a, client-e2e-9959711b-40b0-4c2c-bfb6-6661855ac14a", + "traceId": "7b9d015233ca4275b9899c2c27c46e5d", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.370Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c0b96a1a-2e3e-4562-82bc-7f07e44e88de, client-e2e-c0b96a1a-2e3e-4562-82bc-7f07e44e88de", + "traceId": "1846b685a34d4929bcfaca0ffd0889a9", + "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-08T01:46:02.408Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-46fe5e3d-26bb-47fa-a6e4-3647e99ac0ca, client-e2e-46fe5e3d-26bb-47fa-a6e4-3647e99ac0ca", + "traceId": "c5bf9f1372964370b3f0f36f9ec45eec", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.450Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-317de09b-78ad-425a-ac09-c60968125f25, client-e2e-317de09b-78ad-425a-ac09-c60968125f25", + "traceId": "3976ac7220724e9586a9941a2c9fabbc", + "evidence": { + "fileId": "2085905339128545282", + "fileName": "product-20260808014601-8393184f.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.484Z", + "durationMs": 23, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-79be218b-29a7-4a0f-80d4-c4f6657f693c, client-e2e-79be218b-29a7-4a0f-80d4-c4f6657f693c", + "traceId": "2b41f4c4071e4ecca779b90a768ea1ef", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.507Z", + "durationMs": 83, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c7aad3a6-952b-4e32-9637-b857555d7a5b, client-e2e-c7aad3a6-952b-4e32-9637-b857555d7a5b", + "traceId": "c9bab3cc95974d1ea046d56ed8b5d597", + "evidence": { + "orderId": "2085905339543781378", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.590Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-76baa5b0-0b5d-42b2-9a9e-ce163c8efa72, client-e2e-76baa5b0-0b5d-42b2-9a9e-ce163c8efa72", + "traceId": "ee05c3e1aaba447ba7d2a006d580a65f", + "evidence": { + "orderId": "2085905339543781378", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.619Z", + "durationMs": 37, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-d06185d1-ee4c-4e8e-8fa7-53f43541bfaa, client-e2e-d06185d1-ee4c-4e8e-8fa7-53f43541bfaa", + "traceId": "d3d635766add4f3c9c828619ebb6c8db", + "evidence": { + "orderId": "2085905339543781378", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.656Z", + "durationMs": 54, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d356ee9d-edaf-4d22-a34d-c9007d3e6003, client-e2e-d356ee9d-edaf-4d22-a34d-c9007d3e6003", + "traceId": "e77868c8db744113b3efb8e3290f6d2e", + "evidence": { + "businessLicenseQualificationId": "2085905340058685441", + "legalPersonIdQualificationId": "2085905340062879746", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.710Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-004bb333-cd3f-4fca-b1c4-c673c88aad51, client-e2e-004bb333-cd3f-4fca-b1c4-c673c88aad51", + "traceId": "7e350c0b0bad48a2aa2b7ac8a2175e87", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905340058685441", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905340062879746", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.740Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b3ae32de-58f1-43c2-8fa8-ed6f5d2ae0b2, client-e2e-b3ae32de-58f1-43c2-8fa8-ed6f5d2ae0b2", + "traceId": "e6383c9e217b4219949f53d1c1afe187", + "evidence": { + "tenantId": "2085905336283811841", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:02.779Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7cd66f60-913c-4555-88d4-85196c5c991e, client-e2e-7cd66f60-913c-4555-88d4-85196c5c991e", + "traceId": "e8548d0139bc4d068627fe75d06d56af", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.112Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-02b692c1-7f84-496d-99aa-08bd3d5ca979, client-e2e-02b692c1-7f84-496d-99aa-08bd3d5ca979", + "traceId": "383e6acb0a584cf6b266cad04f6bfdc0", + "evidence": { + "reviewId": "2085905340360675330", + "tenantId": "2085905336283811841", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.142Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a8899207-4dbe-4571-bedc-d832a1b1d019, client-e2e-a8899207-4dbe-4571-bedc-d832a1b1d019", + "traceId": "5e87e4eb6d074f0ab1c3b86fcde892c8", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905340058685441", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905340062879746", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.176Z", + "durationMs": 48, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ed67e505-9cd3-43ea-8fa2-3d0006f58291, client-e2e-ed67e505-9cd3-43ea-8fa2-3d0006f58291", + "traceId": "65ef99cf16ed4176978b8453cda2c24f", + "evidence": { + "tenantId": "2085905336283811841", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.224Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-11fe2bcd-eef7-4436-98f3-cf7c51c9b466, client-e2e-11fe2bcd-eef7-4436-98f3-cf7c51c9b466", + "traceId": "51c0b81e7244417b8797de0d5cf76246", + "evidence": { + "membershipId": "2085905336283811843", + "username": "client_20260808014601_17673d", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.259Z", + "durationMs": 332, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-39bf53e1-57fb-452b-818f-6f5cbd2b75ed, client-e2e-39bf53e1-57fb-452b-818f-6f5cbd2b75ed", + "traceId": "27b76f9fd924466189462897bf29a0e7", + "evidence": { + "username": "client_20260808014601_17673d" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.591Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2fd7183d-9cd8-4fb8-b1e7-2030cb70d95c, client-e2e-2fd7183d-9cd8-4fb8-b1e7-2030cb70d95c", + "traceId": "ec4aa16cd26a421a85301d63358227af", + "evidence": { + "id": "2085905336283811841", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808014601-8393184f" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.623Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-afe221ed-1f7f-46d3-875c-85892d9ad4d3, client-e2e-afe221ed-1f7f-46d3-875c-85892d9ad4d3", + "traceId": "c77f50f182454d948d534fc3b0eb2254", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905340058685441", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085905340062879746", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.652Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8f4864e3-0799-4d60-a500-cb8f014bf96f, client-e2e-8f4864e3-0799-4d60-a500-cb8f014bf96f", + "traceId": "40eab3e8becb4a9fbe1fb801b239907a", + "evidence": { + "id": "2085905336283811841", + "tenantName": "客户端全链路测试企业-20260808014601-8393184f", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.684Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c64e4c4a-2de7-4b8b-9825-db9e1e2e6d5e, client-e2e-c64e4c4a-2de7-4b8b-9825-db9e1e2e6d5e", + "traceId": "76f81837002a47afad83507cdb61374f", + "evidence": { + "id": "2085905336283811841", + "tenantName": "客户端全链路测试企业-20260808014601-8393184f-已编辑", + "contactName": "企业联系人-20260808014601-8393184f", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.721Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-308c5bef-5992-48ba-9818-4c6304538c88, client-e2e-308c5bef-5992-48ba-9818-4c6304538c88", + "traceId": "1b1959102bde4460b72bcd719320615c", + "evidence": { + "id": "2085905336283811841", + "tenantName": "客户端全链路测试企业-20260808014601-8393184f-已编辑", + "contactEmail": "company_202608080146018393184f@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.745Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c09d3a3e-2e56-48bc-b2c4-b0659e9c4c42, client-e2e-c09d3a3e-2e56-48bc-b2c4-b0659e9c4c42", + "traceId": "5236e1efccf947e2ba35166e067277b8", + "evidence": { + "userId": "2085905336283811842", + "username": "client_20260808014601_17673d", + "displayName": "测试管理员-20260808014601-8393184f" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.776Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1d96fc8d-1dc2-4f79-b0b4-1e93aa22bce1, client-e2e-1d96fc8d-1dc2-4f79-b0b4-1e93aa22bce1", + "traceId": "23f2d31a68594a77a97f66ff5cdbe6b2", + "evidence": { + "userId": "2085905336283811842", + "username": "client_20260808014601_17673d", + "displayName": "测试企业管理员-20260808014601-8393184f" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:03.815Z", + "durationMs": 332, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6f56c0e2-e1b5-4fa0-aef1-0b71d98b7823, client-e2e-6f56c0e2-e1b5-4fa0-aef1-0b71d98b7823", + "traceId": "6807875f28eb465ea58a6d50bbbf16c9", + "evidence": { + "username": "client_20260808014601_17673d" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.147Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2744bab4-1360-4490-a8d2-9e1aa7d96688, client-e2e-2744bab4-1360-4490-a8d2-9e1aa7d96688", + "traceId": "2a50aebac4f54e6e8777c98918059f07", + "evidence": { + "userId": "2085905336283811842", + "username": "client_20260808014601_17673d", + "displayName": "测试企业管理员-20260808014601-8393184f" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.183Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f642c963-b64c-4c66-bb9b-d166ab8df2dc, client-e2e-f642c963-b64c-4c66-bb9b-d166ab8df2dc", + "traceId": "a1b7905fb8f4466bae19e8545db194b0", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.211Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e9d669c6-e5f9-4d36-87ed-93bd75f16dc2, client-e2e-e9d669c6-e5f9-4d36-87ed-93bd75f16dc2", + "traceId": "455eda4d9cb54edd8966853b90e50bfd", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.244Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-07f3d851-f4f5-48c9-a3b6-7938502630fe, client-e2e-07f3d851-f4f5-48c9-a3b6-7938502630fe", + "traceId": "f90994e7e0b143f4b0dd85c41da3f4e3", + "evidence": { + "roleId": "2085905346656325633", + "roleCode": "E2E_20260808014601_8393184f", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.277Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b6aeeceb-3c00-43f1-9759-b553941f85c6, client-e2e-b6aeeceb-3c00-43f1-9759-b553941f85c6", + "traceId": "9db0189cc4f34350b33a5f4b869ea8a7", + "evidence": { + "roleId": "2085905346656325633", + "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-08T01:46:04.306Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ae09dd13-c8ae-4357-9d4c-1f9181e0952a, client-e2e-ae09dd13-c8ae-4357-9d4c-1f9181e0952a", + "traceId": "4dac7d0326d14124a4dcb5ebbf538601", + "evidence": { + "roleId": "2085905346656325633", + "roleName": "订单只读-20260808014601-8393184f", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.336Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-66c810c3-3230-42fa-8441-45bed6ae1a53, client-e2e-66c810c3-3230-42fa-8441-45bed6ae1a53", + "traceId": "681d14088eec41d2a53cc9849ad76fbc", + "evidence": { + "roleId": "2085905346656325633", + "roleName": "订单查询员-20260808014601-8393184f", + "description": "edited 20260808014601-8393184f" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.373Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cc816f48-147f-4c12-813d-6a876b57e320, client-e2e-cc816f48-147f-4c12-813d-6a876b57e320", + "traceId": "65f839f83781470ab0f3c0835409a07f", + "evidence": { + "roleId": "2085905346656325633", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.402Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1c7a5418-4d7d-4ac3-82a9-2093f5c67dc2, client-e2e-1c7a5418-4d7d-4ac3-82a9-2093f5c67dc2", + "traceId": "bf3b24d6a8b94ed6a4c0f9e3b4335a69", + "evidence": { + "roleId": "2085905346656325633", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.435Z", + "durationMs": 353, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3404c3ac-177d-4d28-a991-dfaecd83f02b, client-e2e-3404c3ac-177d-4d28-a991-dfaecd83f02b", + "traceId": "3606045986144d3fb7fbf0329cfeaffd", + "evidence": { + "membershipId": "2085905347470020611", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085905346656325633" + ] + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:04.789Z", + "durationMs": 335, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7046b50c-f31b-4dfa-8355-645310d361b5, client-e2e-7046b50c-f31b-4dfa-8355-645310d361b5", + "traceId": "1fbf5716db1b4efe94514ba921771f72", + "evidence": { + "username": "member_20260808014604_8f0b5" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:05.124Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f5e148a2-fc5d-4959-8187-ec752179bdec, client-e2e-f5e148a2-fc5d-4959-8187-ec752179bdec", + "traceId": "97dab0f301e6412fbc6321478d42ba3d", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:05.162Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f910d58d-8bb4-4913-b856-0c949eba1513, client-e2e-f910d58d-8bb4-4913-b856-0c949eba1513", + "traceId": "26f571bc35b4433ab8620f1223de0359", + "evidence": { + "orderId": "2085905339543781378", + "status": "DRAFT" + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:05.191Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8ff23f26-8534-4a44-9ace-c5051a7bd928, client-e2e-8ff23f26-8534-4a44-9ace-c5051a7bd928", + "traceId": "f435efad9439481bae521927e37578e1", + "evidence": { + "membershipId": "2085905347470020611", + "displayName": "已编辑订单成员-20260808014601-8393184f", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:05.233Z", + "durationMs": 418, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-594da649-c52f-463c-a42b-7fcd55090857, client-e2e-594da649-c52f-463c-a42b-7fcd55090857", + "traceId": "30ca2255fdfb460f91498b94af752654", + "evidence": { + "membershipId": "2085905347470020611" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:05.651Z", + "durationMs": 327, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-02172b56-1411-4315-bfae-0969a59b2509, client-e2e-02172b56-1411-4315-bfae-0969a59b2509", + "traceId": "36cb8fe91a5048ba82bcb625218b10ca", + "evidence": { + "username": "member_20260808014604_8f0b5", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:05.978Z", + "durationMs": 567, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-35ab5750-9ecd-4e29-bc8e-2162753c6250, client-e2e-35ab5750-9ecd-4e29-bc8e-2162753c6250", + "traceId": "c146b40cab6446779c3b2bb0ef998c6b", + "evidence": { + "username": "member_20260808014604_8f0b5" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:06.546Z", + "durationMs": 124, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9fb228d9-71da-403c-8a1d-39d19ce62ef2, client-e2e-9fb228d9-71da-403c-8a1d-39d19ce62ef2", + "traceId": "c353131f729b4185ab6c62ea07d7769a", + "evidence": { + "membershipId": "2085905347470020611", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:06.670Z", + "durationMs": 31, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-11b3e197-133b-4ea5-a680-f77e441f887e, client-e2e-11b3e197-133b-4ea5-a680-f77e441f887e", + "traceId": "a62637017ccf4774a3800685c070ab61", + "evidence": { + "username": "member_20260808014604_8f0b5", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:06.701Z", + "durationMs": 119, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0ea814d1-3a43-4860-819c-083b77bcb4c4, client-e2e-0ea814d1-3a43-4860-819c-083b77bcb4c4", + "traceId": "7f57179818cc4549b1fd2f1ba76cdb4c", + "evidence": { + "membershipId": "2085905347470020611", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:06.820Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7b7f1f11-0eb4-4726-83ae-40f768e98a48, client-e2e-7b7f1f11-0eb4-4726-83ae-40f768e98a48", + "traceId": "dd7dce5417fc44149e543de6489ed58c", + "evidence": { + "membershipId": "2085905347470020611", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:06.867Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a13b9f38-2867-4a3c-939a-879db3a7c973, client-e2e-a13b9f38-2867-4a3c-939a-879db3a7c973", + "traceId": "32091fb55ac3419db4744718c4584c7b", + "evidence": { + "membershipId": "2085905347470020611", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:46:06.901Z", + "durationMs": 23, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-af6e62f3-86f1-4fd3-a7f4-058b74880343", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + }, + "error": { + "name": "Error", + "message": "unexpected HTTP status 401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808014637-7d8d6ecd.json b/reports/client-test-env-20260808014637-7d8d6ecd.json new file mode 100644 index 000000000..81ccdcfbd --- /dev/null +++ b/reports/client-test-env-20260808014637-7d8d6ecd.json @@ -0,0 +1,1386 @@ +{ + "marker": "20260808014637-7d8d6ecd", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:46:37.602Z", + "completedAt": "2026-08-08T01:46:43.646Z", + "success": false, + "fatal": { + "name": "TypeError", + "message": "Cannot read properties of undefined (reading 'priceBookVersionId')" + }, + "testAccount": { + "username": "client_20260808014637_211be0", + "companyName": "客户端全链路测试企业-20260808014637-7d8d6ecd", + "legalPhone": "13953597603" + }, + "resources": { + "tenantId": "2085905487958233089", + "membershipId": "2085905487958233091", + "reviewId": "2085905492018319361", + "productImageFileId": "2085905490790383617", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085905499354157059", + "orderIds": [ + "2085905491222396929" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:37.603Z", + "durationMs": 387, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a5aaa08a-9b88-4166-a0cc-c929d366f398, client-e2e-a5aaa08a-9b88-4166-a0cc-c929d366f398", + "traceId": "3bae9d218614469a88ce1d3cf74e5d4a", + "evidence": { + "tenantId": "2085905487958233089", + "membershipId": "2085905487958233091", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:37.991Z", + "durationMs": 36, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-8eb0c54b-35b9-4c3e-92ad-1e5f3a92f4aa, client-e2e-8eb0c54b-35b9-4c3e-92ad-1e5f3a92f4aa", + "traceId": "f605bb551ee047db95d8ce88c91ea1d6", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.028Z", + "durationMs": 337, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-80e3bd73-5791-4691-9292-ec3223a265e8, client-e2e-80e3bd73-5791-4691-9292-ec3223a265e8", + "traceId": "c367fc94a5d8449d960456b2c716644f", + "evidence": { + "username": "client_20260808014637_211be0" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.365Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-46c40be1-850b-49ca-907f-f556669084ba, client-e2e-46c40be1-850b-49ca-907f-f556669084ba", + "traceId": "ba37c7bbfb524587a784df718bdece1c", + "evidence": { + "id": "2085905487958233089", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808014637-7d8d6ecd" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.404Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6d27fdb6-8608-46bf-a874-4e9cab765c3f, client-e2e-6d27fdb6-8608-46bf-a874-4e9cab765c3f", + "traceId": "90119a20a8034cecb35dcf3852238fcb", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.440Z", + "durationMs": 55, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8d184ef8-9e25-4db2-9d67-ae06be1490aa, client-e2e-8d184ef8-9e25-4db2-9d67-ae06be1490aa", + "traceId": "1854ecce5e6d4f4b9a005b62aafa2c2b", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.495Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3ea420e2-f8f7-40ce-b63e-a8d7dd7e316f, client-e2e-3ea420e2-f8f7-40ce-b63e-a8d7dd7e316f", + "traceId": "9f88238e34374deeb9cd9c9a8035dd69", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.533Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-262042f2-4116-4d56-b555-9fa21f83430f, client-e2e-262042f2-4116-4d56-b555-9fa21f83430f", + "traceId": "dca6171b352a40a1a5916f5b465d0058", + "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-08T01:46:38.569Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c0e0d3cf-1c51-4be9-a926-40a77ecb5f99, client-e2e-c0e0d3cf-1c51-4be9-a926-40a77ecb5f99", + "traceId": "d3c670bc289141efb8581ea45dd6ba62", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.612Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-09176698-3f63-4ca5-a8fa-bb570a0f63c7, client-e2e-09176698-3f63-4ca5-a8fa-bb570a0f63c7", + "traceId": "5ad3cc3d450b4f59bae49ffe8c5d18f8", + "evidence": { + "fileId": "2085905490790383617", + "fileName": "product-20260808014637-7d8d6ecd.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.642Z", + "durationMs": 25, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-724d38f8-4790-4f3f-95e0-63c388e1d965, client-e2e-724d38f8-4790-4f3f-95e0-63c388e1d965", + "traceId": "2b72730a478a43dd8e5f6d530b46fad9", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.667Z", + "durationMs": 84, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0bd68bd3-4396-49ee-9e17-17dc003908bd, client-e2e-0bd68bd3-4396-49ee-9e17-17dc003908bd", + "traceId": "f1fbc1b145664e1f9d94ecc8caf08523", + "evidence": { + "orderId": "2085905491222396929", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.751Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8b740232-5000-4444-b1fb-d19f2fc0b57d, client-e2e-8b740232-5000-4444-b1fb-d19f2fc0b57d", + "traceId": "656cae3d086b434d9d8ef904a1b696e2", + "evidence": { + "orderId": "2085905491222396929", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.781Z", + "durationMs": 34, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-cb14b445-e4be-4ec7-9a79-f85ab41db365, client-e2e-cb14b445-e4be-4ec7-9a79-f85ab41db365", + "traceId": "5fbf1ed49b98453180a953e881285daa", + "evidence": { + "orderId": "2085905491222396929", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.815Z", + "durationMs": 55, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7fc340e7-684e-4c94-9322-518374069c76, client-e2e-7fc340e7-684e-4c94-9322-518374069c76", + "traceId": "515b4c5af9734236ac62558506070005", + "evidence": { + "businessLicenseQualificationId": "2085905491724718082", + "legalPersonIdQualificationId": "2085905491728912386", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.870Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-09f3955c-a949-4001-bc50-6eebed439720, client-e2e-09f3955c-a949-4001-bc50-6eebed439720", + "traceId": "d54fd7c8e76249f99d9369390427ab23", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905491724718082", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905491728912386", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.895Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-630b42cb-413c-4d26-829a-5c213550994c, client-e2e-630b42cb-413c-4d26-829a-5c213550994c", + "traceId": "91a3a495b2b14097957ef836407978be", + "evidence": { + "tenantId": "2085905487958233089", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:38.936Z", + "durationMs": 331, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c5da739-ce71-476a-83fe-88ce7351d1b1, client-e2e-6c5da739-ce71-476a-83fe-88ce7351d1b1", + "traceId": "9d97da1e81114237b60e9abdbb71f55d", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.267Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5430b821-57fe-426c-824c-6600d4823442, client-e2e-5430b821-57fe-426c-824c-6600d4823442", + "traceId": "7bbdfbcb060f4d6c937ba45048dbe8ba", + "evidence": { + "reviewId": "2085905492018319361", + "tenantId": "2085905487958233089", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.300Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7f6b610e-57de-4ac8-8847-bba198bbecd5, client-e2e-7f6b610e-57de-4ac8-8847-bba198bbecd5", + "traceId": "4d29c85fde0a46f3b922b03f872bd86d", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905491724718082", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905491728912386", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.329Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-637f0505-6fcb-4d1f-ab72-e3aaf3009a1b, client-e2e-637f0505-6fcb-4d1f-ab72-e3aaf3009a1b", + "traceId": "ff9f8649f0274e858f802307b0665304", + "evidence": { + "tenantId": "2085905487958233089", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.380Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b64edc2c-c4d4-44b5-9147-fe745196eb1c, client-e2e-b64edc2c-c4d4-44b5-9147-fe745196eb1c", + "traceId": "5c55f56136ea4fc2a9f5978ac62fff8a", + "evidence": { + "membershipId": "2085905487958233091", + "username": "client_20260808014637_211be0", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.414Z", + "durationMs": 399, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-824e64d3-f68e-4862-8dc2-0b00f44700fc, client-e2e-824e64d3-f68e-4862-8dc2-0b00f44700fc", + "traceId": "6cb80e7c80c0400787281f381aef7f8b", + "evidence": { + "username": "client_20260808014637_211be0" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.813Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-dbeec0c3-34d7-4d4b-9d77-f6f0ceaae86d, client-e2e-dbeec0c3-34d7-4d4b-9d77-f6f0ceaae86d", + "traceId": "5ddf26cb8b244b119b1af5d3976f4c90", + "evidence": { + "id": "2085905487958233089", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808014637-7d8d6ecd" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.842Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d47631d6-e807-4456-bb9d-9106c279ca17, client-e2e-d47631d6-e807-4456-bb9d-9106c279ca17", + "traceId": "87211ba9c7934606a7b27c1a566bc039", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905491724718082", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085905491728912386", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.870Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c3eef6a6-f6f5-45be-9ed6-d8804de867f8, client-e2e-c3eef6a6-f6f5-45be-9ed6-d8804de867f8", + "traceId": "c1a217c038584fb7bcc089274230a785", + "evidence": { + "id": "2085905487958233089", + "tenantName": "客户端全链路测试企业-20260808014637-7d8d6ecd", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.903Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-092a095c-fdd8-47af-a555-a8f1ac24df32, client-e2e-092a095c-fdd8-47af-a555-a8f1ac24df32", + "traceId": "d87ab7e327b94bfd84f40f66f241c922", + "evidence": { + "id": "2085905487958233089", + "tenantName": "客户端全链路测试企业-20260808014637-7d8d6ecd-已编辑", + "contactName": "企业联系人-20260808014637-7d8d6ecd", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.931Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a957b809-4735-49fe-88d4-dce33c43480a, client-e2e-a957b809-4735-49fe-88d4-dce33c43480a", + "traceId": "7620d6a772534fdbad88c778167d85c7", + "evidence": { + "id": "2085905487958233089", + "tenantName": "客户端全链路测试企业-20260808014637-7d8d6ecd-已编辑", + "contactEmail": "company_202608080146377d8d6ecd@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.965Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8372a3f9-3ba1-41b6-b14d-57100dd09483, client-e2e-8372a3f9-3ba1-41b6-b14d-57100dd09483", + "traceId": "2b49c8fae16c49a09042a3e442533905", + "evidence": { + "userId": "2085905487958233090", + "username": "client_20260808014637_211be0", + "displayName": "测试管理员-20260808014637-7d8d6ecd" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:39.996Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6dcd11bf-2f22-48a3-aa68-3752ddddd9eb, client-e2e-6dcd11bf-2f22-48a3-aa68-3752ddddd9eb", + "traceId": "9a11b0ec89af48aa9e169c02ec3a6816", + "evidence": { + "userId": "2085905487958233090", + "username": "client_20260808014637_211be0", + "displayName": "测试企业管理员-20260808014637-7d8d6ecd" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.032Z", + "durationMs": 330, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0da75693-0c99-4177-a8ef-c6da877c66cc, client-e2e-0da75693-0c99-4177-a8ef-c6da877c66cc", + "traceId": "6756c79438714cc1974aac066d8312ab", + "evidence": { + "username": "client_20260808014637_211be0" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.362Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2277ec41-a6ec-40f3-a4fd-2fa26bd3872e, client-e2e-2277ec41-a6ec-40f3-a4fd-2fa26bd3872e", + "traceId": "40cbf6bf0f494ecbada1586eb6dc70cf", + "evidence": { + "userId": "2085905487958233090", + "username": "client_20260808014637_211be0", + "displayName": "测试企业管理员-20260808014637-7d8d6ecd" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.398Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8c652e3a-ff1a-47d4-ad68-9d44849dd742, client-e2e-8c652e3a-ff1a-47d4-ad68-9d44849dd742", + "traceId": "263c035660f54b0ba85cd8e90707c611", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.430Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bc1c1558-4e0c-4c9d-b1e8-008923dc986b, client-e2e-bc1c1558-4e0c-4c9d-b1e8-008923dc986b", + "traceId": "bf030e79e5e14660a5a224e13ac678cb", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.459Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0bba5a33-f885-4354-8ea6-eb9675c65d09, client-e2e-0bba5a33-f885-4354-8ea6-eb9675c65d09", + "traceId": "508d3f8f58f54d27830f9c2144284749", + "evidence": { + "roleId": "2085905498561433602", + "roleCode": "E2E_20260808014637_7d8d6ecd", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.494Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1a964fee-6897-4851-8009-cb287c8d537f, client-e2e-1a964fee-6897-4851-8009-cb287c8d537f", + "traceId": "f7aa967646434edb8ee74c05f122acb8", + "evidence": { + "roleId": "2085905498561433602", + "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-08T01:46:40.528Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9a06854c-b727-44f4-a3f6-41395c297f96, client-e2e-9a06854c-b727-44f4-a3f6-41395c297f96", + "traceId": "eaa423327a8c497c9f65fc48015303c5", + "evidence": { + "roleId": "2085905498561433602", + "roleName": "订单只读-20260808014637-7d8d6ecd", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.552Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-83df0698-fa39-4fc9-860b-b04bd5c216e2, client-e2e-83df0698-fa39-4fc9-860b-b04bd5c216e2", + "traceId": "b42ff128a8ba49159e49b29c3b9d2b17", + "evidence": { + "roleId": "2085905498561433602", + "roleName": "订单查询员-20260808014637-7d8d6ecd", + "description": "edited 20260808014637-7d8d6ecd" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.591Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-81d22b9a-81a9-4608-9288-79f25a5cacfa, client-e2e-81d22b9a-81a9-4608-9288-79f25a5cacfa", + "traceId": "5d2a1297439e4e94a8dac183802b1fe2", + "evidence": { + "roleId": "2085905498561433602", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.620Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c83c8b9-fbe5-4399-a289-75a4551522d2, client-e2e-6c83c8b9-fbe5-4399-a289-75a4551522d2", + "traceId": "a64b8208122e4d91b333bda390a87f36", + "evidence": { + "roleId": "2085905498561433602", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.656Z", + "durationMs": 342, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fcc1c0cd-4cb9-4851-a034-912c9543e799, client-e2e-fcc1c0cd-4cb9-4851-a034-912c9543e799", + "traceId": "4b6059eac18843d08a59f04156d0e24c", + "evidence": { + "membershipId": "2085905499354157059", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085905498561433602" + ] + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:40.998Z", + "durationMs": 329, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2c9b696a-8a9d-4a83-81db-60a47a203893, client-e2e-2c9b696a-8a9d-4a83-81db-60a47a203893", + "traceId": "1a4ff020d8594397bead386dd96e35c7", + "evidence": { + "username": "member_20260808014640_07b2a" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:41.327Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ffc88639-ad65-4801-9bcb-c5d916086633, client-e2e-ffc88639-ad65-4801-9bcb-c5d916086633", + "traceId": "b7ad9dbc35304f16bad8e0a68831546b", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:41.368Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3eca390f-0cf6-4904-b731-2aa7d0d753ef, client-e2e-3eca390f-0cf6-4904-b731-2aa7d0d753ef", + "traceId": "3b1651d93977414c98ac71b66c16f15d", + "evidence": { + "orderId": "2085905491222396929", + "status": "DRAFT" + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:41.402Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1f6a9827-e8ad-437c-a70a-e4affbfe37d2, client-e2e-1f6a9827-e8ad-437c-a70a-e4affbfe37d2", + "traceId": "e342a50ea5c443728663d04db8b3dbec", + "evidence": { + "membershipId": "2085905499354157059", + "displayName": "已编辑订单成员-20260808014637-7d8d6ecd", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:41.437Z", + "durationMs": 421, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0df5e458-2610-45c4-8e1b-2513b9ddb15f, client-e2e-0df5e458-2610-45c4-8e1b-2513b9ddb15f", + "traceId": "5901eb109b9d470a99f1d4caf9476824", + "evidence": { + "membershipId": "2085905499354157059" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:41.858Z", + "durationMs": 334, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-fd9e9064-4206-47d8-82f7-e40fdef6e1a5, client-e2e-fd9e9064-4206-47d8-82f7-e40fdef6e1a5", + "traceId": "fda24ac49ad1446487e7d7065d93cb2c", + "evidence": { + "username": "member_20260808014640_07b2a", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.192Z", + "durationMs": 337, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-87cde52d-1281-4f35-a3c9-4dae3d850a1c, client-e2e-87cde52d-1281-4f35-a3c9-4dae3d850a1c", + "traceId": "b66584cea8d04a07b309ab88e587890f", + "evidence": { + "username": "member_20260808014640_07b2a" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.530Z", + "durationMs": 116, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-17d6f79c-28f4-47d0-9316-ac53c6e23aae, client-e2e-17d6f79c-28f4-47d0-9316-ac53c6e23aae", + "traceId": "2569f621800447dc871151731daf9542", + "evidence": { + "membershipId": "2085905499354157059", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.646Z", + "durationMs": 27, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-e750b9be-a878-4a10-bbe7-398304e75868, client-e2e-e750b9be-a878-4a10-bbe7-398304e75868", + "traceId": "05d7b781a7504a128109dc50a6ad8d77", + "evidence": { + "username": "member_20260808014640_07b2a", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.673Z", + "durationMs": 138, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-322c85ff-ba4c-43d8-a934-0a5760bb2825, client-e2e-322c85ff-ba4c-43d8-a934-0a5760bb2825", + "traceId": "35cb29f9a2664218b35b625167ef3095", + "evidence": { + "membershipId": "2085905499354157059", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.811Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6a4504e3-1a5f-4b08-850d-ede3c3554ead, client-e2e-6a4504e3-1a5f-4b08-850d-ede3c3554ead", + "traceId": "fbc3052411ab44dea784754d87d41e30", + "evidence": { + "membershipId": "2085905499354157059", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.838Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-41ceadc1-c968-4dd5-b90e-a89935bbb679, client-e2e-41ceadc1-c968-4dd5-b90e-a89935bbb679", + "traceId": "6acfbe1be4904eeca8a3aa7d954a4c41", + "evidence": { + "membershipId": "2085905499354157059", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.861Z", + "durationMs": 28, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-536f7844-b70f-4d0d-8f6e-5ab6ed7c7d87", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:42.889Z", + "durationMs": 326, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-09e8d2cb-696e-423a-a645-7574b07ba1a6, client-e2e-09e8d2cb-696e-423a-a645-7574b07ba1a6", + "traceId": "96259047061e44bfaf3662b2996dbb37", + "evidence": { + "username": "member_20260808014640_07b2a" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:43.215Z", + "durationMs": 43, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-866c8dfd-7aeb-4fb3-bea9-d903a20b9e0d, client-e2e-866c8dfd-7aeb-4fb3-bea9-d903a20b9e0d", + "traceId": "ab308822a00447088566f8c772f453d0", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:43.259Z", + "durationMs": 99, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7b916b7c-4d74-4544-b773-8de9ee56d77c, client-e2e-7b916b7c-4d74-4544-b773-8de9ee56d77c", + "traceId": "858f4e4a184b4aef82a3a9c7b372d1a7", + "evidence": { + "membershipId": "2085905499354157059", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:43.358Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f1e03926-5c75-4b51-8b1a-583c8b1b65c9, client-e2e-f1e03926-5c75-4b51-8b1a-583c8b1b65c9", + "traceId": "a67aadb420d74fefbf2615052d80bff2", + "evidence": { + "roleId": "2085905498561433602" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:43.401Z", + "durationMs": 50, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3246428a-3498-46b1-9d02-80c0b4ad8e4f, client-e2e-3246428a-3498-46b1-9d02-80c0b4ad8e4f", + "traceId": "10f480fbeb9c4f6d94b376231ee30a87", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:43.451Z", + "durationMs": 52, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a861ece8-749f-4d15-8a06-32c96eb9123d, client-e2e-a861ece8-749f-4d15-8a06-32c96eb9123d", + "traceId": "5c6b665d8b334793a4efe188781b3576", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:43.503Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-56055f50-2b38-4067-8745-fa753ef53826, client-e2e-56055f50-2b38-4067-8745-fa753ef53826", + "traceId": "32c1d5a7e8be4024a230505c4acd82ae", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:46:43.534Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-03362469-9691-415c-8485-d33e5aa879ba, client-e2e-03362469-9691-415c-8485-d33e5aa879ba", + "traceId": "f9c22ed0540c41728f5476e60e28e4ae", + "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-08T01:46:43.578Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4ae96ec1-37af-4f4b-b748-f9a07063dfd8, client-e2e-4ae96ec1-37af-4f4b-b748-f9a07063dfd8", + "traceId": "bb7a6aaae62549e69d317a3a2729ab01", + "evidence": { + "candidateCount": 3 + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808014718-7ac39aba.json b/reports/client-test-env-20260808014718-7ac39aba.json new file mode 100644 index 000000000..0c45247b3 --- /dev/null +++ b/reports/client-test-env-20260808014718-7ac39aba.json @@ -0,0 +1,1404 @@ +{ + "marker": "20260808014718-7ac39aba", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:47:18.535Z", + "completedAt": "2026-08-08T01:47:24.495Z", + "success": false, + "fatal": { + "name": "Error", + "message": "business code: expected=\"200\" actual=\"A0404\"" + }, + "testAccount": { + "username": "client_20260808014718_d7e892", + "companyName": "客户端全链路测试企业-20260808014718-7ac39aba", + "legalPhone": "13953638536" + }, + "resources": { + "tenantId": "2085905659652067330", + "membershipId": "2085905659652067332", + "reviewId": "2085905663871537154", + "productImageFileId": "2085905662517772290", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085905671131877380", + "orderIds": [ + "2085905662991728641" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:18.536Z", + "durationMs": 392, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a65c5325-7c0d-4764-baff-e15e021436a0, client-e2e-a65c5325-7c0d-4764-baff-e15e021436a0", + "traceId": "5054ce8acb6041dc9ea5104b2513b2dd", + "evidence": { + "tenantId": "2085905659652067330", + "membershipId": "2085905659652067332", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:18.928Z", + "durationMs": 32, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-b2eef0ed-fb23-4ac5-adcc-140d51c1767a, client-e2e-b2eef0ed-fb23-4ac5-adcc-140d51c1767a", + "traceId": "85b5afde8cc64a918cb4c458a5d85347", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:18.960Z", + "durationMs": 331, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-28302c5a-bac6-40ec-b67c-a575ca6d3bd0, client-e2e-28302c5a-bac6-40ec-b67c-a575ca6d3bd0", + "traceId": "38b22b155bac4a1d89fe91afb5ba6341", + "evidence": { + "username": "client_20260808014718_d7e892" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.291Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6746d355-647e-48b1-a87c-f481ac1a627c, client-e2e-6746d355-647e-48b1-a87c-f481ac1a627c", + "traceId": "22e0ab7d604c4fbcaa5e5abdc26c6c6c", + "evidence": { + "id": "2085905659652067330", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808014718-7ac39aba" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.325Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6d64ea82-1e4c-4c69-99f9-6c3cc73babff, client-e2e-6d64ea82-1e4c-4c69-99f9-6c3cc73babff", + "traceId": "63b9bdbe93ab4ce2a581124c4e78a7ff", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.364Z", + "durationMs": 57, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-426c980f-4379-48c8-baa0-fe7e86d51986, client-e2e-426c980f-4379-48c8-baa0-fe7e86d51986", + "traceId": "1e41874db1f742a58b3b28af2538dc90", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.421Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4c45f328-db89-47d6-b51a-78aeda37d49e, client-e2e-4c45f328-db89-47d6-b51a-78aeda37d49e", + "traceId": "3547a0f2b45948259b6e8967c822ff90", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.460Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-27b11ae8-a2dc-45bc-82ff-360f9b7e3f38, client-e2e-27b11ae8-a2dc-45bc-82ff-360f9b7e3f38", + "traceId": "cb2758906121400aa465a87ebbf84b65", + "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-08T01:47:19.495Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c7d7ff4f-b645-4f93-8e65-99b1e04935e5, client-e2e-c7d7ff4f-b645-4f93-8e65-99b1e04935e5", + "traceId": "381e0539605b48bdbae05d8a4dc9c8b8", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.534Z", + "durationMs": 50, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f5a601cc-bba8-4433-93ce-ef4ffef6c57d, client-e2e-f5a601cc-bba8-4433-93ce-ef4ffef6c57d", + "traceId": "466fc0ca9dac4137862c2964a691c69e", + "evidence": { + "fileId": "2085905662517772290", + "fileName": "product-20260808014718-7ac39aba.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.585Z", + "durationMs": 42, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-b4a7d2b1-025c-4845-a9a0-d27b3e4bb473, client-e2e-b4a7d2b1-025c-4845-a9a0-d27b3e4bb473", + "traceId": "6b62ca3cc7014662a69ed59a8012212d", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.627Z", + "durationMs": 77, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-be6ad3cf-dcc9-49c1-a1dc-4f996b4bfaf4, client-e2e-be6ad3cf-dcc9-49c1-a1dc-4f996b4bfaf4", + "traceId": "e9fa876bdc1a4275a1938f8f3ae20d91", + "evidence": { + "orderId": "2085905662991728641", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.704Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8e60a5ec-9aac-4715-9d69-69054f1dd74f, client-e2e-8e60a5ec-9aac-4715-9d69-69054f1dd74f", + "traceId": "8f6b12cc565542b28c7bc94f029ba31c", + "evidence": { + "orderId": "2085905662991728641", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.741Z", + "durationMs": 47, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-bd74b3b8-6e9b-4832-88fb-2ea2c4dd7a86, client-e2e-bd74b3b8-6e9b-4832-88fb-2ea2c4dd7a86", + "traceId": "ea4391d512a14277b9e264564136e263", + "evidence": { + "orderId": "2085905662991728641", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.789Z", + "durationMs": 58, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1b7bebce-ede2-4313-a0dc-d6a7bda646c6, client-e2e-1b7bebce-ede2-4313-a0dc-d6a7bda646c6", + "traceId": "d34d24a53d4a4c90a51c2052883d0029", + "evidence": { + "businessLicenseQualificationId": "2085905663582130177", + "legalPersonIdQualificationId": "2085905663586324481", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.847Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ad87f23b-4274-4900-8abf-873ceeeaab9c, client-e2e-ad87f23b-4274-4900-8abf-873ceeeaab9c", + "traceId": "25b8583697eb463182b9992a3efda4b1", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905663582130177", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905663586324481", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.870Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d4293e7b-a9bf-4596-aa7b-f72672a55751, client-e2e-d4293e7b-a9bf-4596-aa7b-f72672a55751", + "traceId": "49b9fabad6db4d378abb457c1e6dfddd", + "evidence": { + "tenantId": "2085905659652067330", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:19.911Z", + "durationMs": 329, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bd44e069-716a-42e5-b193-00bb18a87947, client-e2e-bd44e069-716a-42e5-b193-00bb18a87947", + "traceId": "df6eec1fd8e44a04ada9b7da9617a538", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.240Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c974a19e-fd48-4d83-a18b-4d8b8356d170, client-e2e-c974a19e-fd48-4d83-a18b-4d8b8356d170", + "traceId": "b8b45ad1a9b348ff94f8bae85ddc0f3a", + "evidence": { + "reviewId": "2085905663871537154", + "tenantId": "2085905659652067330", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.273Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4df8497d-d0fe-4c9a-8e29-be084543db70, client-e2e-4df8497d-d0fe-4c9a-8e29-be084543db70", + "traceId": "e0450b93334b4754af5ea2216adbf37b", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905663582130177", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905663586324481", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.304Z", + "durationMs": 45, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4860dbc7-cb59-4c78-8390-676732c065ec, client-e2e-4860dbc7-cb59-4c78-8390-676732c065ec", + "traceId": "009004cde80b4841b4368c54a5d2e04c", + "evidence": { + "tenantId": "2085905659652067330", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.349Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6fea8ee6-e613-4050-8570-f271f2e12932, client-e2e-6fea8ee6-e613-4050-8570-f271f2e12932", + "traceId": "2f49eba53f3f48568d7c779eb691c0b5", + "evidence": { + "membershipId": "2085905659652067332", + "username": "client_20260808014718_d7e892", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.385Z", + "durationMs": 334, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-83ba6bed-82bf-4944-88f0-172015d9eed1, client-e2e-83ba6bed-82bf-4944-88f0-172015d9eed1", + "traceId": "920f598f250e445ca2c426aa7411eef8", + "evidence": { + "username": "client_20260808014718_d7e892" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.719Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a8f7027a-8ed4-4e72-8246-8a7631ef933c, client-e2e-a8f7027a-8ed4-4e72-8246-8a7631ef933c", + "traceId": "14a2cabb9154491bb2c06c3a6716437a", + "evidence": { + "id": "2085905659652067330", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808014718-7ac39aba" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.750Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-dbc393e5-edb5-4d4b-b983-32c574c2cf0a, client-e2e-dbc393e5-edb5-4d4b-b983-32c574c2cf0a", + "traceId": "12ae2d7738654af7903c8b03c358e20c", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905663582130177", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085905663586324481", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.773Z", + "durationMs": 17, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e752e08f-6345-4ec7-8a54-f3fdf215e6a8, client-e2e-e752e08f-6345-4ec7-8a54-f3fdf215e6a8", + "traceId": "e1da0695040b4eee8aa92121d89dc6eb", + "evidence": { + "id": "2085905659652067330", + "tenantName": "客户端全链路测试企业-20260808014718-7ac39aba", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.790Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6687618e-f05d-434e-a0e8-ed0132d95b6d, client-e2e-6687618e-f05d-434e-a0e8-ed0132d95b6d", + "traceId": "7a02c120ce744cff93eff9a20b516ca8", + "evidence": { + "id": "2085905659652067330", + "tenantName": "客户端全链路测试企业-20260808014718-7ac39aba-已编辑", + "contactName": "企业联系人-20260808014718-7ac39aba", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.819Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f1cbb17f-8baa-4a55-90bd-58e1a789ba8b, client-e2e-f1cbb17f-8baa-4a55-90bd-58e1a789ba8b", + "traceId": "cffeff4f96d74f708d2c6eecba9bc2b9", + "evidence": { + "id": "2085905659652067330", + "tenantName": "客户端全链路测试企业-20260808014718-7ac39aba-已编辑", + "contactEmail": "company_202608080147187ac39aba@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.846Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b210ddf3-3856-4f06-9ee2-dfa85d683090, client-e2e-b210ddf3-3856-4f06-9ee2-dfa85d683090", + "traceId": "2b5688ff66c74eb1b71eba880ff1d6a8", + "evidence": { + "userId": "2085905659652067331", + "username": "client_20260808014718_d7e892", + "displayName": "测试管理员-20260808014718-7ac39aba" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.876Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-55139231-62e8-48ac-ac43-869f62b74f05, client-e2e-55139231-62e8-48ac-ac43-869f62b74f05", + "traceId": "6b9706bb1da744a4ba3fc0127d95f14f", + "evidence": { + "userId": "2085905659652067331", + "username": "client_20260808014718_d7e892", + "displayName": "测试企业管理员-20260808014718-7ac39aba" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:20.910Z", + "durationMs": 334, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5560c526-d1d1-4899-845d-8dd7d0dab103, client-e2e-5560c526-d1d1-4899-845d-8dd7d0dab103", + "traceId": "debb3753477940b68774970c1f6c9d6b", + "evidence": { + "username": "client_20260808014718_d7e892" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.244Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6936587c-b96b-4a4b-a8c1-8367b5ebbe8c, client-e2e-6936587c-b96b-4a4b-a8c1-8367b5ebbe8c", + "traceId": "f23c7d848b924b5687c0599f4543e96e", + "evidence": { + "userId": "2085905659652067331", + "username": "client_20260808014718_d7e892", + "displayName": "测试企业管理员-20260808014718-7ac39aba" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.280Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6e7d74ff-1eeb-4517-bde5-5f3afecc1681, client-e2e-6e7d74ff-1eeb-4517-bde5-5f3afecc1681", + "traceId": "f1b186a3e78b46139eb069904b35e503", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.311Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-85169017-6943-4850-a25a-27397e328256, client-e2e-85169017-6943-4850-a25a-27397e328256", + "traceId": "4100db78669b42a0bef117b27e7c9565", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.340Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5e15fcdb-329f-45ea-a5c4-4ef9f8d28b6c, client-e2e-5e15fcdb-329f-45ea-a5c4-4ef9f8d28b6c", + "traceId": "526355f6f6be4b40be61bcf305ea4da4", + "evidence": { + "roleId": "2085905670028775426", + "roleCode": "E2E_20260808014718_7ac39aba", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.378Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f6dd5842-e21f-4bf0-b58a-7eeecf3cbbf1, client-e2e-f6dd5842-e21f-4bf0-b58a-7eeecf3cbbf1", + "traceId": "4d38404992454c349d00c7f050c532ab", + "evidence": { + "roleId": "2085905670028775426", + "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-08T01:47:21.410Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d7d84c6e-84b0-430c-88bf-7b371eb62745, client-e2e-d7d84c6e-84b0-430c-88bf-7b371eb62745", + "traceId": "0fd65e2f55f7443ba454a8f2cca7063c", + "evidence": { + "roleId": "2085905670028775426", + "roleName": "订单只读-20260808014718-7ac39aba", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.435Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-34b5fa64-4fcf-4755-bdc0-0cf42efb1788, client-e2e-34b5fa64-4fcf-4755-bdc0-0cf42efb1788", + "traceId": "4fe9691dd80f4224a2197dade33c1e4f", + "evidence": { + "roleId": "2085905670028775426", + "roleName": "订单查询员-20260808014718-7ac39aba", + "description": "edited 20260808014718-7ac39aba" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.472Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3be2ce95-3d12-439e-8815-d96d18aa386d, client-e2e-3be2ce95-3d12-439e-8815-d96d18aa386d", + "traceId": "bb97dbff99db44a7b39237dd5aabd6b4", + "evidence": { + "roleId": "2085905670028775426", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.503Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1521b7d0-c29c-440f-bbea-74c2f838934c, client-e2e-1521b7d0-c29c-440f-bbea-74c2f838934c", + "traceId": "c88803325fe6458a987b79f3dca2dde9", + "evidence": { + "roleId": "2085905670028775426", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.543Z", + "durationMs": 409, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e8ed0dea-17bb-48cd-92be-460d5110933c, client-e2e-e8ed0dea-17bb-48cd-92be-460d5110933c", + "traceId": "af40f81b7fb24a188366be43841b6381", + "evidence": { + "membershipId": "2085905671131877380", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085905670028775426" + ] + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:21.952Z", + "durationMs": 325, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3e55c7d1-8fef-4709-9065-13a3798667c2, client-e2e-3e55c7d1-8fef-4709-9065-13a3798667c2", + "traceId": "27e48d1891464c7bb15771f0bedfe789", + "evidence": { + "username": "member_20260808014721_4df66" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:22.278Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d825ad9d-1ef6-4d57-9bff-feef413c0294, client-e2e-d825ad9d-1ef6-4d57-9bff-feef413c0294", + "traceId": "d2fc4def44174748b36547b486e35a8c", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:22.316Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8a8e154b-de45-4318-985a-e17600eb6d30, client-e2e-8a8e154b-de45-4318-985a-e17600eb6d30", + "traceId": "2bbe098fe97a44f8889fa4b7e1c3af48", + "evidence": { + "orderId": "2085905662991728641", + "status": "DRAFT" + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:22.351Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d4d97c3b-9be7-47ae-a0ec-35cf53664ed1, client-e2e-d4d97c3b-9be7-47ae-a0ec-35cf53664ed1", + "traceId": "36c79f5d4ad24627a4a236079dc99f48", + "evidence": { + "membershipId": "2085905671131877380", + "displayName": "已编辑订单成员-20260808014718-7ac39aba", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:22.390Z", + "durationMs": 401, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-85413fbe-75e9-4381-8e0c-3c74ee3518d3, client-e2e-85413fbe-75e9-4381-8e0c-3c74ee3518d3", + "traceId": "1afc4901c23945789faa15855a6b5a1f", + "evidence": { + "membershipId": "2085905671131877380" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:22.791Z", + "durationMs": 332, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-c7c83325-7fc9-41e0-a5d4-f368a9ecfee8, client-e2e-c7c83325-7fc9-41e0-a5d4-f368a9ecfee8", + "traceId": "2c6a64cd11554657a5d73039ccedb90d", + "evidence": { + "username": "member_20260808014721_4df66", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.123Z", + "durationMs": 339, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f1c95d06-da0f-4a13-955d-015d17d5316c, client-e2e-f1c95d06-da0f-4a13-955d-015d17d5316c", + "traceId": "f9ac3a5926874f5c831a7583ebde6baf", + "evidence": { + "username": "member_20260808014721_4df66" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.462Z", + "durationMs": 118, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a3ded015-dfd9-4125-b36b-0caa53e56fa7, client-e2e-a3ded015-dfd9-4125-b36b-0caa53e56fa7", + "traceId": "5ba82cd7ef5d40b48b5f6a14c0fd6c72", + "evidence": { + "membershipId": "2085905671131877380", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.580Z", + "durationMs": 21, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-c2cdd945-4d3e-47a8-b1e7-f47c486dc4be, client-e2e-c2cdd945-4d3e-47a8-b1e7-f47c486dc4be", + "traceId": "e51afc6f3e104ea194b3baf85678cd84", + "evidence": { + "username": "member_20260808014721_4df66", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.601Z", + "durationMs": 105, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2ce544bb-7b3c-4430-b552-1f00f46ee9ba, client-e2e-2ce544bb-7b3c-4430-b552-1f00f46ee9ba", + "traceId": "e27492cbbe2e45deb16ff39a3141106e", + "evidence": { + "membershipId": "2085905671131877380", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.706Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-da6e1c38-27db-430a-85c7-d4fda46afb4a, client-e2e-da6e1c38-27db-430a-85c7-d4fda46afb4a", + "traceId": "a7daf6f41f1349dab52b52105ffcee06", + "evidence": { + "membershipId": "2085905671131877380", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.748Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e210ed69-feff-4280-952c-c77ff6b5f285, client-e2e-e210ed69-feff-4280-952c-c77ff6b5f285", + "traceId": "bdccd95fe9ae418d9ab71456a4425d0e", + "evidence": { + "membershipId": "2085905671131877380", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.776Z", + "durationMs": 22, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-2f8d7f37-63c3-4001-9e1e-753ccb5bfd64", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:23.798Z", + "durationMs": 327, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a5b6baf4-dfc7-4bf3-9e1b-1cc144db80f3, client-e2e-a5b6baf4-dfc7-4bf3-9e1b-1cc144db80f3", + "traceId": "0697f8a000874e42825dfabce99f64c3", + "evidence": { + "username": "member_20260808014721_4df66" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.125Z", + "durationMs": 26, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-9eafc5a0-dcbf-47ab-aa6c-4b67dcde699c, client-e2e-9eafc5a0-dcbf-47ab-aa6c-4b67dcde699c", + "traceId": "46608dfe696c4aab9b65f63d2e848088", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.151Z", + "durationMs": 98, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a0873932-82fd-46c2-ae48-bc3d5d511635, client-e2e-a0873932-82fd-46c2-ae48-bc3d5d511635", + "traceId": "e92b945848d247908b1e3cf79e13001a", + "evidence": { + "membershipId": "2085905671131877380", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.250Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f2119d45-714f-47e9-983f-ddbd074fec00, client-e2e-f2119d45-714f-47e9-983f-ddbd074fec00", + "traceId": "44599d07d80b4e4c9b859194496b1435", + "evidence": { + "roleId": "2085905670028775426" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.282Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2da9faca-7d4f-4326-8ea2-8e4042eb7a3e, client-e2e-2da9faca-7d4f-4326-8ea2-8e4042eb7a3e", + "traceId": "74d0b0b0218741bfbb230d9a4b18003c", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.311Z", + "durationMs": 50, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-770dcd1f-4541-47ab-ae29-6321cc4c7e30, client-e2e-770dcd1f-4541-47ab-ae29-6321cc4c7e30", + "traceId": "6da7e34db4bf404f82a5da1d56e7d0a9", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.361Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8616d72f-9d16-4765-95ee-426c6f39f433, client-e2e-8616d72f-9d16-4765-95ee-426c6f39f433", + "traceId": "ffb408bd1f7f4669afc200677ec2c6ee", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.386Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a27c8faa-bcc4-471b-8364-c85d63071fd9, client-e2e-a27c8faa-bcc4-471b-8364-c85d63071fd9", + "traceId": "b98a114ae9c94778a0943b2bdbfa2fce", + "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-08T01:47:24.424Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cd16d3b6-65f5-48f0-9987-7a73ba0e5199, client-e2e-cd16d3b6-65f5-48f0-9987-7a73ba0e5199", + "traceId": "1dd5aa4f2d6c4bdebada300712bed6c9", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "estimate selected channel price", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:47:24.465Z", + "durationMs": 30, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-1e42e6a2-5d9e-41be-b117-ef940364d9da, client-e2e-1e42e6a2-5d9e-41be-b117-ef940364d9da", + "traceId": "67aeabc633fe4d94af9b86852e5a39c1", + "evidence": null, + "error": { + "name": "Error", + "message": "business code: expected=\"200\" actual=\"A0404\"" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808014829-37933828.json b/reports/client-test-env-20260808014829-37933828.json new file mode 100644 index 000000000..1dc85c89d --- /dev/null +++ b/reports/client-test-env-20260808014829-37933828.json @@ -0,0 +1,1834 @@ +{ + "marker": "20260808014829-37933828", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:48:29.515Z", + "completedAt": "2026-08-08T01:48:39.744Z", + "success": true, + "fatal": null, + "testAccount": { + "username": "client_20260808014829_4ee97a", + "companyName": "客户端全链路测试企业-20260808014829-37933828", + "legalPhone": "13953709516" + }, + "resources": { + "tenantId": "2085905957367959553", + "membershipId": "2085905957367959555", + "reviewId": "2085905961520320513", + "productImageFileId": "2085905981813358594", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085905968612888580", + "orderIds": [ + "2085905960627929090", + "2085905982199234561", + "2085905983914704898" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:29.516Z", + "durationMs": 393, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-289b86f3-8ab2-47fc-8e46-ac0901c4fa01, client-e2e-289b86f3-8ab2-47fc-8e46-ac0901c4fa01", + "traceId": "5ab1ab09ccb84d449393f45c20723d92", + "evidence": { + "tenantId": "2085905957367959553", + "membershipId": "2085905957367959555", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:29.909Z", + "durationMs": 35, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-45e1c240-ec89-4a82-b54a-7a70820c2d19, client-e2e-45e1c240-ec89-4a82-b54a-7a70820c2d19", + "traceId": "d7e7aff821f84fd3b1d14c175516bc83", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:29.944Z", + "durationMs": 332, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-52472e00-da72-4f6e-9fed-63db98a4b30c, client-e2e-52472e00-da72-4f6e-9fed-63db98a4b30c", + "traceId": "3e44a96d738c4674a030fffa5188f8f7", + "evidence": { + "username": "client_20260808014829_4ee97a" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.276Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-51f350fd-9abd-41c2-aced-e37e11903998, client-e2e-51f350fd-9abd-41c2-aced-e37e11903998", + "traceId": "dd3e5bbf9dc64cba83caad8be62b4a57", + "evidence": { + "id": "2085905957367959553", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808014829-37933828" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.298Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2ea71827-133f-4f8a-846f-9643c664ec63, client-e2e-2ea71827-133f-4f8a-846f-9643c664ec63", + "traceId": "19696d19791246e5b4c3a8446449d7ac", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.329Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f085435e-893f-4375-9f7b-22976ab64155, client-e2e-f085435e-893f-4375-9f7b-22976ab64155", + "traceId": "5e281170c3074039a2a4857a299ee8e8", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.391Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-24e1d3ce-449d-4190-bec0-a9a0228d66da, client-e2e-24e1d3ce-449d-4190-bec0-a9a0228d66da", + "traceId": "f341d6bd7e034c87802ca7f1d4fa546f", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.425Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3944ab51-aa08-43ff-bbe6-5137ffe3d3da, client-e2e-3944ab51-aa08-43ff-bbe6-5137ffe3d3da", + "traceId": "a66e2a7b9b0148398495a981b0c6a3a7", + "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-08T01:48:30.465Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a551ebc2-dd82-411a-a485-1a0ff9606181, client-e2e-a551ebc2-dd82-411a-a485-1a0ff9606181", + "traceId": "85430ad9083a407ea2ceb5ef249334af", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.510Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ee55dde6-83dc-44a4-8edb-03b6c9978d50, client-e2e-ee55dde6-83dc-44a4-8edb-03b6c9978d50", + "traceId": "b3ca9960cc24448a84328fd8ed5e43e2", + "evidence": { + "fileId": "2085905960170749954", + "fileName": "product-20260808014829-37933828.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.554Z", + "durationMs": 39, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-8400db23-dfb9-4f11-94b3-5de6a2dc13ea, client-e2e-8400db23-dfb9-4f11-94b3-5de6a2dc13ea", + "traceId": "03a4a0ae2a4341948e34f287006f000f", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.593Z", + "durationMs": 78, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5a0fb33b-b2c1-41c8-8d13-7b793bee86f0, client-e2e-5a0fb33b-b2c1-41c8-8d13-7b793bee86f0", + "traceId": "c896855a3a8247ebad4383e3da30a009", + "evidence": { + "orderId": "2085905960627929090", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.671Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8a3d9a65-3d06-4b44-98ef-0d045c5064ef, client-e2e-8a3d9a65-3d06-4b44-98ef-0d045c5064ef", + "traceId": "81417927d42a41f0b2a19cff812cf96e", + "evidence": { + "orderId": "2085905960627929090", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.707Z", + "durationMs": 46, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-45222223-ffa4-4b43-97c0-60a53e82ebd9, client-e2e-45222223-ffa4-4b43-97c0-60a53e82ebd9", + "traceId": "f534ce654cb14c568681a685117deb3d", + "evidence": { + "orderId": "2085905960627929090", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.753Z", + "durationMs": 54, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3fb9315d-0d02-48fb-aa09-7cc0610c4b89, client-e2e-3fb9315d-0d02-48fb-aa09-7cc0610c4b89", + "traceId": "34074bc808b3460dac38f715cd694b20", + "evidence": { + "businessLicenseQualificationId": "2085905961222524929", + "legalPersonIdQualificationId": "2085905961226719233", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.807Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c0006c8c-8447-4ef3-9fad-166fedaab329, client-e2e-c0006c8c-8447-4ef3-9fad-166fedaab329", + "traceId": "7dc75c3cdf13449f8c010eb9e0c15e39", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905961222524929", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905961226719233", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.834Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7abe0f27-0e89-4239-a39a-fb142f6fa9fc, client-e2e-7abe0f27-0e89-4239-a39a-fb142f6fa9fc", + "traceId": "95391c35fa144ab9a9cb5530d961f6b9", + "evidence": { + "tenantId": "2085905957367959553", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:30.876Z", + "durationMs": 341, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c664a521-6c33-475a-956d-b31d2946d171, client-e2e-c664a521-6c33-475a-956d-b31d2946d171", + "traceId": "4ef0850839e147ce938045555b9c2fe8", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.217Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-878ca29c-22fa-421d-b512-3eb27de98b71, client-e2e-878ca29c-22fa-421d-b512-3eb27de98b71", + "traceId": "cd091df7292049d69dbf0edfab35130d", + "evidence": { + "reviewId": "2085905961520320513", + "tenantId": "2085905957367959553", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.257Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3ed7a368-4e4a-4934-9be7-b4aa4d981e4b, client-e2e-3ed7a368-4e4a-4934-9be7-b4aa4d981e4b", + "traceId": "14d1d3036bb844efb6e4b4085c352433", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905961222524929", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085905961226719233", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.283Z", + "durationMs": 49, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f0054e27-df6b-4b10-bb14-f8b13d5a77d2, client-e2e-f0054e27-df6b-4b10-bb14-f8b13d5a77d2", + "traceId": "a31b0e2135ed434694493a53ae40b0e2", + "evidence": { + "tenantId": "2085905957367959553", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.332Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e8ee1c95-6462-4345-8a51-864c90dc91f6, client-e2e-e8ee1c95-6462-4345-8a51-864c90dc91f6", + "traceId": "323a5dad888543fd882f95ce85c10c24", + "evidence": { + "membershipId": "2085905957367959555", + "username": "client_20260808014829_4ee97a", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.367Z", + "durationMs": 335, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5b3bd2b6-a7b6-4824-93f7-283b899b11b0, client-e2e-5b3bd2b6-a7b6-4824-93f7-283b899b11b0", + "traceId": "d54b3b7205834ca6b1d166428ed72787", + "evidence": { + "username": "client_20260808014829_4ee97a" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.702Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d769352f-6eaa-4c03-9600-d2b4e142ef0b, client-e2e-d769352f-6eaa-4c03-9600-d2b4e142ef0b", + "traceId": "fe73b725a1c748718efec30093d3d738", + "evidence": { + "id": "2085905957367959553", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808014829-37933828" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.737Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bc61374a-9c48-4641-bc7b-77bfd67fc6c0, client-e2e-bc61374a-9c48-4641-bc7b-77bfd67fc6c0", + "traceId": "1f4a980c524346e29c885a21dc7a2e19", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085905961222524929", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085905961226719233", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.765Z", + "durationMs": 20, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-798c02dc-a93a-46ee-82a4-b42094a3b9d9, client-e2e-798c02dc-a93a-46ee-82a4-b42094a3b9d9", + "traceId": "b23a28ca7a224c69b5489451b2743c98", + "evidence": { + "id": "2085905957367959553", + "tenantName": "客户端全链路测试企业-20260808014829-37933828", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.785Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-68eef45a-ddab-4739-ab66-b23bc02b2ed6, client-e2e-68eef45a-ddab-4739-ab66-b23bc02b2ed6", + "traceId": "9a729758c4234d28984ed2a290a304fd", + "evidence": { + "id": "2085905957367959553", + "tenantName": "客户端全链路测试企业-20260808014829-37933828-已编辑", + "contactName": "企业联系人-20260808014829-37933828", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.817Z", + "durationMs": 21, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-faa2b86d-a82e-4118-9ee9-424b9c54a168, client-e2e-faa2b86d-a82e-4118-9ee9-424b9c54a168", + "traceId": "b0d6ef50432d4c0fab7debd9b4be1518", + "evidence": { + "id": "2085905957367959553", + "tenantName": "客户端全链路测试企业-20260808014829-37933828-已编辑", + "contactEmail": "company_2026080801482937933828@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.838Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9e0da905-c4c2-41bc-9ede-66d44087001c, client-e2e-9e0da905-c4c2-41bc-9ede-66d44087001c", + "traceId": "8755c5eda93248b89e39c25b1268175b", + "evidence": { + "userId": "2085905957367959554", + "username": "client_20260808014829_4ee97a", + "displayName": "测试管理员-20260808014829-37933828" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.875Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-75b6bdc9-1700-4018-a902-5b4c339b8017, client-e2e-75b6bdc9-1700-4018-a902-5b4c339b8017", + "traceId": "483a103649584929ada320fd9fcdb674", + "evidence": { + "userId": "2085905957367959554", + "username": "client_20260808014829_4ee97a", + "displayName": "测试企业管理员-20260808014829-37933828" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:31.908Z", + "durationMs": 334, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ca08eeaa-687b-428a-a4da-1f8e19139513, client-e2e-ca08eeaa-687b-428a-a4da-1f8e19139513", + "traceId": "2f7f162940704e6e825b0da42e4780f5", + "evidence": { + "username": "client_20260808014829_4ee97a" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.242Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6207d667-dc62-4dcd-9382-d24fe52e3f2b, client-e2e-6207d667-dc62-4dcd-9382-d24fe52e3f2b", + "traceId": "623d75676ff94a999d27519ff1bce537", + "evidence": { + "userId": "2085905957367959554", + "username": "client_20260808014829_4ee97a", + "displayName": "测试企业管理员-20260808014829-37933828" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.267Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-907b9020-cbdb-4a23-81e5-b0879d6cd2b9, client-e2e-907b9020-cbdb-4a23-81e5-b0879d6cd2b9", + "traceId": "fa2c651e189745d08dc8ee4c5a6b9f6e", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.299Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3cddd4e5-5125-442a-b494-aa3ef0bc2c78, client-e2e-3cddd4e5-5125-442a-b494-aa3ef0bc2c78", + "traceId": "fa07734370df4684b1cb23e4e8006d61", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.325Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d5dad31b-0b8a-4127-97e2-b443c77d173e, client-e2e-d5dad31b-0b8a-4127-97e2-b443c77d173e", + "traceId": "c55c63a468db434f826c9c80d7234ee6", + "evidence": { + "roleId": "2085905967769833473", + "roleCode": "E2E_20260808014829_37933828", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.365Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d44cd207-bec1-4df4-b8b8-38da3540cd41, client-e2e-d44cd207-bec1-4df4-b8b8-38da3540cd41", + "traceId": "75c21ff2959a4306931648ae7279ceea", + "evidence": { + "roleId": "2085905967769833473", + "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-08T01:48:32.398Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-967c0db0-d613-4f25-ad59-5e11fe395ce2, client-e2e-967c0db0-d613-4f25-ad59-5e11fe395ce2", + "traceId": "e2d435d30ed64e0b948ece5c2f771079", + "evidence": { + "roleId": "2085905967769833473", + "roleName": "订单只读-20260808014829-37933828", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.438Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a0a7db56-e870-4daf-a14d-a66ebbf9b7ad, client-e2e-a0a7db56-e870-4daf-a14d-a66ebbf9b7ad", + "traceId": "625905831db84d10aee4a6339e59063a", + "evidence": { + "roleId": "2085905967769833473", + "roleName": "订单查询员-20260808014829-37933828", + "description": "edited 20260808014829-37933828" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.472Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-698cfb2e-d65b-4e24-98cf-4fcc194f0720, client-e2e-698cfb2e-d65b-4e24-98cf-4fcc194f0720", + "traceId": "e747f16871d9443e924a7b8d210c864b", + "evidence": { + "roleId": "2085905967769833473", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.505Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1d596e0d-302b-49d1-8c75-0c8decb055bb, client-e2e-1d596e0d-302b-49d1-8c75-0c8decb055bb", + "traceId": "42312979f42046eea4d165e187b31fda", + "evidence": { + "roleId": "2085905967769833473", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.532Z", + "durationMs": 344, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-045b0b34-85a6-4c61-ab48-8538922c02a2, client-e2e-045b0b34-85a6-4c61-ab48-8538922c02a2", + "traceId": "fe7e84993d2243708e1673167d98ae18", + "evidence": { + "membershipId": "2085905968612888580", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085905967769833473" + ] + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:32.876Z", + "durationMs": 561, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6f6ff634-9b0c-4305-a187-8c44b0fd3bb5, client-e2e-6f6ff634-9b0c-4305-a187-8c44b0fd3bb5", + "traceId": "21fe14a0231d4e5481410d218be8a52a", + "evidence": { + "username": "member_20260808014832_b2180" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:33.437Z", + "durationMs": 54, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-54394b48-444f-4cc0-b7f3-4ca32c76648a, client-e2e-54394b48-444f-4cc0-b7f3-4ca32c76648a", + "traceId": "73c4870b291c46f685467a8176cd831f", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:33.491Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6e01433e-325a-4fa1-85bc-0ea07e6d6b76, client-e2e-6e01433e-325a-4fa1-85bc-0ea07e6d6b76", + "traceId": "1892f4345e6049049b2e4e98de34bece", + "evidence": { + "orderId": "2085905960627929090", + "status": "DRAFT" + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:33.524Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3223f974-50a6-4e27-916f-4594394295e4, client-e2e-3223f974-50a6-4e27-916f-4594394295e4", + "traceId": "7986e699bbde48699b1ea5f126e5d0c2", + "evidence": { + "membershipId": "2085905968612888580", + "displayName": "已编辑订单成员-20260808014829-37933828", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:33.561Z", + "durationMs": 385, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8b15a6e3-6ddd-48cf-8184-ed8bf07d244a, client-e2e-8b15a6e3-6ddd-48cf-8184-ed8bf07d244a", + "traceId": "8eaffe0836894e69b4dfa7df1954446a", + "evidence": { + "membershipId": "2085905968612888580" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:33.946Z", + "durationMs": 328, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-2112c637-8d1e-4368-ac64-eea17dbbe943, client-e2e-2112c637-8d1e-4368-ac64-eea17dbbe943", + "traceId": "df78c2c9aa9e4f79addde3a8b082b80c", + "evidence": { + "username": "member_20260808014832_b2180", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.274Z", + "durationMs": 340, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-224e2fca-673c-4b48-89d7-500cb66b36cf, client-e2e-224e2fca-673c-4b48-89d7-500cb66b36cf", + "traceId": "9a43acd499734ae8931226ba31c75082", + "evidence": { + "username": "member_20260808014832_b2180" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.614Z", + "durationMs": 104, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-046b66d6-688e-4c5c-9d15-a21f1b70a3fb, client-e2e-046b66d6-688e-4c5c-9d15-a21f1b70a3fb", + "traceId": "b4c53fe6fa194bf393c6f93e484d495e", + "evidence": { + "membershipId": "2085905968612888580", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.718Z", + "durationMs": 22, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-e9e09004-8866-4dd1-a4ab-0f638421a24c, client-e2e-e9e09004-8866-4dd1-a4ab-0f638421a24c", + "traceId": "83cf2076a777426b991febbd3167e980", + "evidence": { + "username": "member_20260808014832_b2180", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.740Z", + "durationMs": 88, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8c78fb7f-7a81-42f6-b66e-d259b350e43d, client-e2e-8c78fb7f-7a81-42f6-b66e-d259b350e43d", + "traceId": "40a17a99460b45599be15d3776225f4f", + "evidence": { + "membershipId": "2085905968612888580", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.828Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bb367913-d8a4-4bbc-8133-2d383fb2e72e, client-e2e-bb367913-d8a4-4bbc-8133-2d383fb2e72e", + "traceId": "ccfbbe46d98145d3a5ac780caf4178ca", + "evidence": { + "membershipId": "2085905968612888580", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.855Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2f32f950-28dd-44d5-906d-9095e6330814, client-e2e-2f32f950-28dd-44d5-906d-9095e6330814", + "traceId": "0106916130624324a6e0bcfeadb00b8d", + "evidence": { + "membershipId": "2085905968612888580", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.885Z", + "durationMs": 21, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-a23b6d41-acd7-4841-a9cb-803afedf175f", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:34.907Z", + "durationMs": 327, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-30d7f81e-cc6b-4644-abca-7410fea716e3, client-e2e-30d7f81e-cc6b-4644-abca-7410fea716e3", + "traceId": "1d7295e1df5d4798836d66f684e02032", + "evidence": { + "username": "member_20260808014832_b2180" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.234Z", + "durationMs": 24, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-3789bc89-ab0f-41a3-a577-9403d7265f29, client-e2e-3789bc89-ab0f-41a3-a577-9403d7265f29", + "traceId": "34d4bb1288034936a777e7582c1c3f83", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.258Z", + "durationMs": 106, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8a20ecff-d518-4e50-9c83-9aa1b02dd5dc, client-e2e-8a20ecff-d518-4e50-9c83-9aa1b02dd5dc", + "traceId": "835d32c4152b4fd1aac863698babe8dc", + "evidence": { + "membershipId": "2085905968612888580", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.364Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2c4f2e31-406c-470c-bc12-32b554ddd7a5, client-e2e-2c4f2e31-406c-470c-bc12-32b554ddd7a5", + "traceId": "b01d1fae974a449e86dfb2e98477a20a", + "evidence": { + "roleId": "2085905967769833473" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.402Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-01fcdfa9-ca87-42a5-90a4-86347eed5c97, client-e2e-01fcdfa9-ca87-42a5-90a4-86347eed5c97", + "traceId": "69b0ca07c510438c819285978c40e678", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.430Z", + "durationMs": 56, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f3a2a6de-3718-4769-a8c9-120ecc9a9462, client-e2e-f3a2a6de-3718-4769-a8c9-120ecc9a9462", + "traceId": "12598a674b2c478bbea1184278f77269", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.486Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c325aba1-d01d-4cc5-8453-eae1b8aac1dc, client-e2e-c325aba1-d01d-4cc5-8453-eae1b8aac1dc", + "traceId": "73e2878a78de4dc680eed1eb47c289ab", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.525Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-335a29e5-51dd-441e-8a5f-114cbf912b4f, client-e2e-335a29e5-51dd-441e-8a5f-114cbf912b4f", + "traceId": "1dde40ea5b0244aabe5ed29459e73846", + "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-08T01:48:35.562Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-033253d1-553d-4ea2-ad4e-0df60b60acda, client-e2e-033253d1-553d-4ea2-ad4e-0df60b60acda", + "traceId": "aafbd7ed212047f8adfaa2c1a58fb3b1", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 1", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.603Z", + "durationMs": 30, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-0cd30ee6-777e-40a0-8610-fc6cd19af6b6, client-e2e-0cd30ee6-777e-40a0-8610-fc6cd19af6b6", + "traceId": "23355f32181147359ef7c889f1d39a92", + "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-08T01:48:35.633Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5371f841-9548-472b-a230-5e5457a36614, client-e2e-5371f841-9548-472b-a230-5e5457a36614", + "traceId": "76ae2a95038e4ebcadd2aafdd7d4bfa4", + "evidence": { + "matched": true, + "destinationWarehouseId": "193000000000000002", + "destinationCode": "ABE3", + "priceBookVersionId": "2085661426268549121", + "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-08T01:48:35.667Z", + "durationMs": 45, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-648266cc-a808-4ce1-850a-ea88e260eae8, client-e2e-648266cc-a808-4ce1-850a-ea88e260eae8", + "traceId": "b3e07f5b210548fc817befbd49769382", + "evidence": { + "fileId": "2085905981813358594", + "fileName": "product-20260808014829-37933828.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.712Z", + "durationMs": 27, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-df98432f-fd52-442d-b0f2-ce112ab67404, client-e2e-df98432f-fd52-442d-b0f2-ce112ab67404", + "traceId": "a9e22764c8c3499cb3e773a6ca6f1a58", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.739Z", + "durationMs": 72, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-735339ce-525c-4705-bf5f-c22896ed39da, client-e2e-735339ce-525c-4705-bf5f-c22896ed39da", + "traceId": "188d6da1c29e4e76a6adda6a5f8861b8", + "evidence": { + "orderId": "2085905982199234561" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.811Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4afc98c1-de2a-4e22-9b46-4fd67b9f691f, client-e2e-4afc98c1-de2a-4e22-9b46-4fd67b9f691f", + "traceId": "b2d91f92109d4154ad78058574ef892c", + "evidence": { + "orderId": "2085905982199234561", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.839Z", + "durationMs": 79, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-33407adf-396c-4c48-9ee9-c8b4ff3c0be0, client-e2e-33407adf-396c-4c48-9ee9-c8b4ff3c0be0", + "traceId": "f1d0ff27a2904b02a01760307d25fb11", + "evidence": { + "orderId": "2085905982199234561", + "customerRemark": "edited-20260808014829-37933828" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.919Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9f1fac1b-3d4c-4579-b6a3-8a2fb79d2ff4, client-e2e-9f1fac1b-3d4c-4579-b6a3-8a2fb79d2ff4", + "traceId": "60e621fa922f4102bbefa7cbf7bc867b", + "evidence": { + "orderId": "2085905982199234561", + "orderNo": "FL2085905982199234561", + "status": "DRAFT", + "cargo": { + "id": "2085905982668996610", + "skuNo": "SKU-ACTIVE-20260808014829-37933828", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808014829-37933828", + "referenceId": "REF-ACTIVE-20260808014829-37933828", + "productImageFileId": "2085905981813358594" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.960Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ea04895e-8497-4390-9d8b-dc32d78a2c90, client-e2e-ea04895e-8497-4390-9d8b-dc32d78a2c90", + "traceId": "6f2bb5c8cc2c4153b18be0d24639aa6f", + "evidence": { + "total": "1", + "orderId": "2085905982199234561", + "orderNo": "FL2085905982199234561", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:35.995Z", + "durationMs": 87, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8ef018ef-918f-45ba-a9ef-246b01616a09, client-e2e-8ef018ef-918f-45ba-a9ef-246b01616a09", + "traceId": "f6e8351be66d41e097f506c7da23afb4", + "evidence": { + "orderId": "2085905982199234561" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.082Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c0e4a57b-3935-4306-b9cd-4e426289cc24, client-e2e-c0e4a57b-3935-4306-b9cd-4e426289cc24", + "traceId": "7f93e540f9844b4287e424a50c491259", + "evidence": { + "orderId": "2085905982199234561", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.114Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4651145f-029b-4700-9aba-ef25aad0638a, client-e2e-4651145f-029b-4700-9aba-ef25aad0638a", + "traceId": "4afe47be91314207ba90031b6d9661d5", + "evidence": { + "orderId": "2085905982199234561", + "orderNo": "FL2085905982199234561", + "status": "SUBMITTED" + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.145Z", + "durationMs": 74, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b24406ce-b937-4281-8572-59f845c541c1, client-e2e-b24406ce-b937-4281-8572-59f845c541c1", + "traceId": "c18b29818a9a4a3692ae5ea25cb31327", + "evidence": { + "orderId": "2085905983914704898" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.219Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-59f5163a-83c7-4a11-b253-bf845142308d, client-e2e-59f5163a-83c7-4a11-b253-bf845142308d", + "traceId": "ed2d94d6b0944f958ce2c0cd82d9268a", + "evidence": { + "orderId": "2085905983914704898" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.258Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0b69215e-abeb-433f-b4d6-49e38c78371e, client-e2e-0b69215e-abeb-433f-b4d6-49e38c78371e", + "traceId": "0fcafe4f230e4f67a07cd932cd80c5e3", + "evidence": { + "orderId": "2085905983914704898", + "status": "CANCELLED" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.298Z", + "durationMs": 346, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5769f65e-1e25-4997-8cdb-c03d2c8dad0f, client-e2e-5769f65e-1e25-4997-8cdb-c03d2c8dad0f", + "traceId": "4c47e19e77e84a1f9aeefc2d568d92ad", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.644Z", + "durationMs": 35, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-2fefe81e-5779-4022-8797-e3ec13eb2bce, client-e2e-2fefe81e-5779-4022-8797-e3ec13eb2bce", + "traceId": "14447351a2204f1c98ee5126c995369d", + "evidence": { + "orderId": "2085905982199234561", + "rejectionCode": "A0404" + } + }, + { + "module": "account-security", + "name": "rotate refresh token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.679Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ffcbe9b4-c021-46e3-a4d2-3a201db04aba, client-e2e-ffcbe9b4-c021-46e3-a4d2-3a201db04aba", + "traceId": "49735d85126c4bd9a8e5f6523916af75", + "evidence": { + "rotated": true + } + }, + { + "module": "account-security", + "name": "change owner password to temporary value", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:36.718Z", + "durationMs": 1005, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8700caf1-c0e6-4551-aee1-9e63842ee87a, client-e2e-8700caf1-c0e6-4551-aee1-9e63842ee87a", + "traceId": "3e3844aecc634bcbaf130b01ed08e739", + "evidence": { + "username": "client_20260808014829_4ee97a", + "passwordChanged": true + } + }, + { + "module": "account-security", + "name": "original password is rejected after change", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:37.723Z", + "durationMs": 328, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-2671948d-38ce-405b-ae98-2e83c828da24, client-e2e-2671948d-38ce-405b-ae98-2e83c828da24", + "traceId": "88672f9b610d494aa6621d5ba78b8e44", + "evidence": { + "username": "client_20260808014829_4ee97a", + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "temporary password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:38.051Z", + "durationMs": 341, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-61d3ef34-f766-4b2c-a51a-7157f644546d, client-e2e-61d3ef34-f766-4b2c-a51a-7157f644546d", + "traceId": "4829a884f412406dbebc44f32a2adf8d", + "evidence": { + "username": "client_20260808014829_4ee97a" + } + }, + { + "module": "account-security", + "name": "restore owner password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:38.392Z", + "durationMs": 961, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cd3f4352-f4e5-4e67-b75f-89fb40ad718c, client-e2e-cd3f4352-f4e5-4e67-b75f-89fb40ad718c", + "traceId": "860685eaa0794509b9b923f7143e9956", + "evidence": { + "username": "client_20260808014829_4ee97a", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "restored owner password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:39.353Z", + "durationMs": 329, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d4c9cf9d-83ec-4614-8627-1a4955809fd7, client-e2e-d4c9cf9d-83ec-4614-8627-1a4955809fd7", + "traceId": "c1da72bb1e734d63a518b92901141fd2", + "evidence": { + "username": "client_20260808014829_4ee97a", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "logout current client session", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:39.682Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d9d4137d-1551-48c7-bee5-3563f98c7517, client-e2e-d9d4137d-1551-48c7-bee5-3563f98c7517", + "traceId": "9b099db871fc4cc2a6a4d83fc2daeb46", + "evidence": { + "username": "client_20260808014829_4ee97a" + } + }, + { + "module": "account-security", + "name": "logged-out refresh token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:48:39.718Z", + "durationMs": 26, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-e6cf8967-9902-4c72-9e6b-99c29f315555, client-e2e-e6cf8967-9902-4c72-9e6b-99c29f315555", + "traceId": "007d745f0afc4fc3b3cb12f9d690b95c", + "evidence": { + "rejectionCode": "A0401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808015114-cd28a2ee.json b/reports/client-test-env-20260808015114-cd28a2ee.json new file mode 100644 index 000000000..a752faf30 --- /dev/null +++ b/reports/client-test-env-20260808015114-cd28a2ee.json @@ -0,0 +1,2047 @@ +{ + "marker": "20260808015114-cd28a2ee", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:51:14.553Z", + "completedAt": "2026-08-08T01:51:24.949Z", + "success": false, + "fatal": null, + "testAccount": { + "username": "client_20260808015114_829174", + "companyName": "客户端全链路测试企业-20260808015114-cd28a2ee", + "legalPhone": "13953874554" + }, + "resources": { + "tenantId": "2085906649595891713", + "membershipId": "2085906649595891715", + "reviewId": "2085906653651783682", + "productImageFileId": "2085906673558945794", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085906660501082115", + "orderIds": [ + "2085906652901998593", + "2085906673965793281", + "2085906676373323777" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:14.554Z", + "durationMs": 401, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-89def23e-4a2e-46bd-bf81-7213c7a1a3f8, client-e2e-89def23e-4a2e-46bd-bf81-7213c7a1a3f8", + "traceId": "1281f40f04a24222bd4e9100718c769c", + "evidence": { + "tenantId": "2085906649595891713", + "membershipId": "2085906649595891715", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:14.955Z", + "durationMs": 62, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-8417faef-1347-4d12-b138-bdf49fc0fe01, client-e2e-8417faef-1347-4d12-b138-bdf49fc0fe01", + "traceId": "a17f95dfe584468bbc5dc9bc06c73d74", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.017Z", + "durationMs": 340, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-373b14a9-9194-4c1e-9459-0408e3553466, client-e2e-373b14a9-9194-4c1e-9459-0408e3553466", + "traceId": "59753ccee31a4200890adcdb8764552a", + "evidence": { + "username": "client_20260808015114_829174" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.358Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0808ebde-fcf0-4242-ade0-13439a1fbb70, client-e2e-0808ebde-fcf0-4242-ade0-13439a1fbb70", + "traceId": "a9093dab5445478fa09f0734b387378b", + "evidence": { + "id": "2085906649595891713", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808015114-cd28a2ee" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.388Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0b85e3b0-e2ab-4d48-9044-0246b4dc7ec4, client-e2e-0b85e3b0-e2ab-4d48-9044-0246b4dc7ec4", + "traceId": "e4e0f1cc6916470a8eed243af0da4b72", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.420Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a1bc45b8-b504-483c-987e-e86fe4383632, client-e2e-a1bc45b8-b504-483c-987e-e86fe4383632", + "traceId": "9d843ac6925749fba062dfce221e5add", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.482Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fd56ef6c-509b-4caa-91e1-8469d3e487c3, client-e2e-fd56ef6c-509b-4caa-91e1-8469d3e487c3", + "traceId": "a2fd959748fa4112b2befb7350f01d51", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.518Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-76738254-6dfe-420b-b60e-b3b2df353f4a, client-e2e-76738254-6dfe-420b-b60e-b3b2df353f4a", + "traceId": "3daf6ffac4e34768bc5963c4fd54b067", + "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-08T01:51:15.550Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-83ec8628-c3a7-4f17-84dc-352413508b25, client-e2e-83ec8628-c3a7-4f17-84dc-352413508b25", + "traceId": "d2da6b7a42a946a199d4600165a60fb6", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.577Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0afe710d-160d-4b9f-b2ca-53e38144379b, client-e2e-0afe710d-160d-4b9f-b2ca-53e38144379b", + "traceId": "067dd492512149e5b50e0286d664e290", + "evidence": { + "fileId": "2085906652486762498", + "fileName": "product-20260808015114-cd28a2ee.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.612Z", + "durationMs": 24, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-7afb306b-2007-47ee-98d0-176886312ea7, client-e2e-7afb306b-2007-47ee-98d0-176886312ea7", + "traceId": "659ca31c3c674908bf60258f48d44816", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.637Z", + "durationMs": 82, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9ad4b44f-e222-48ce-acfd-9152072e32ee, client-e2e-9ad4b44f-e222-48ce-acfd-9152072e32ee", + "traceId": "638fc584b14143b795a1ff794eeaac5e", + "evidence": { + "orderId": "2085906652901998593", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.719Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6f03b78b-95a6-4f06-b0d7-736130b36365, client-e2e-6f03b78b-95a6-4f06-b0d7-736130b36365", + "traceId": "3c00d5fd8c0b492ea36221698720f1ea", + "evidence": { + "orderId": "2085906652901998593", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.753Z", + "durationMs": 29, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-868f8a93-5f3a-421a-8973-99d2a37857c3, client-e2e-868f8a93-5f3a-421a-8973-99d2a37857c3", + "traceId": "af31af4ac48c493ca8f4b6bd9c1ae521", + "evidence": { + "orderId": "2085906652901998593", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.783Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cf3dbadc-5800-4bdb-98ca-8714dc10fb57, client-e2e-cf3dbadc-5800-4bdb-98ca-8714dc10fb57", + "traceId": "1e3e8bba38b74e5196449a17cf9b0252", + "evidence": { + "businessLicenseQualificationId": "2085906653345599490", + "legalPersonIdQualificationId": "2085906653349793794", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.820Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-79d45f83-6eec-483a-b95a-5d333b96b24f, client-e2e-79d45f83-6eec-483a-b95a-5d333b96b24f", + "traceId": "52429911b2b64fdb9dbfc45bcbca009a", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085906653345599490", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085906653349793794", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.852Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ceab0b35-ef15-47a8-90cd-31192e7eab13, client-e2e-ceab0b35-ef15-47a8-90cd-31192e7eab13", + "traceId": "99783b457dc2483996a52057756577ca", + "evidence": { + "tenantId": "2085906649595891713", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:15.891Z", + "durationMs": 340, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e4608e07-e2d4-46ea-a145-96437be7e8b5, client-e2e-e4608e07-e2d4-46ea-a145-96437be7e8b5", + "traceId": "4b453115964b4c978f3dc18560e5bbd5", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.231Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a918d9b8-953c-4475-8ae5-4767838247b2, client-e2e-a918d9b8-953c-4475-8ae5-4767838247b2", + "traceId": "a4b454b86fa143569d27ed2da2103f8e", + "evidence": { + "reviewId": "2085906653651783682", + "tenantId": "2085906649595891713", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.255Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-147feec0-3787-4795-bef5-08b1630ffce8, client-e2e-147feec0-3787-4795-bef5-08b1630ffce8", + "traceId": "b3a631ce6ebd44c8a1a48661af267187", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085906653345599490", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085906653349793794", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.289Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f15f5978-9345-4378-bb98-b16fd60a6b93, client-e2e-f15f5978-9345-4378-bb98-b16fd60a6b93", + "traceId": "58b5eaa9d5ec4166b18e07ef0346d846", + "evidence": { + "tenantId": "2085906649595891713", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.336Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7e59f137-839d-472f-af34-2e218373f01b, client-e2e-7e59f137-839d-472f-af34-2e218373f01b", + "traceId": "07dd3e9940ad4b418c834e400908572b", + "evidence": { + "membershipId": "2085906649595891715", + "username": "client_20260808015114_829174", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.373Z", + "durationMs": 329, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9dc07514-c4f7-4110-9b27-52015ff655b3, client-e2e-9dc07514-c4f7-4110-9b27-52015ff655b3", + "traceId": "1b1e4b938afb4f39bbaf335b36d69527", + "evidence": { + "username": "client_20260808015114_829174" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.702Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-38fa842e-45ba-4369-aef4-90cda04d94c4, client-e2e-38fa842e-45ba-4369-aef4-90cda04d94c4", + "traceId": "ba4755bb27874bdb9a8ceddb4245c4e0", + "evidence": { + "id": "2085906649595891713", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808015114-cd28a2ee" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.738Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a8fa06e5-8491-42c1-8a20-89ce52d588af, client-e2e-a8fa06e5-8491-42c1-8a20-89ce52d588af", + "traceId": "6c22e5addbb24127aefb60c1660b03af", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085906653345599490", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085906653349793794", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.767Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8df79d31-86fe-4aee-9e70-80f8a8f7afc8, client-e2e-8df79d31-86fe-4aee-9e70-80f8a8f7afc8", + "traceId": "e6d84c15506d407183b408a686960a7c", + "evidence": { + "id": "2085906649595891713", + "tenantName": "客户端全链路测试企业-20260808015114-cd28a2ee", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.796Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1d3869d5-b735-4ada-84a1-9a1fbb271f51, client-e2e-1d3869d5-b735-4ada-84a1-9a1fbb271f51", + "traceId": "2cf2d88c5c9642968fcb6bd29b57ec37", + "evidence": { + "id": "2085906649595891713", + "tenantName": "客户端全链路测试企业-20260808015114-cd28a2ee-已编辑", + "contactName": "企业联系人-20260808015114-cd28a2ee", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.833Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d853cee3-fac9-4720-a9ae-40f446f04549, client-e2e-d853cee3-fac9-4720-a9ae-40f446f04549", + "traceId": "51c20df587564aa5b64053920f8394b2", + "evidence": { + "id": "2085906649595891713", + "tenantName": "客户端全链路测试企业-20260808015114-cd28a2ee-已编辑", + "contactEmail": "company_20260808015114cd28a2ee@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.860Z", + "durationMs": 19, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f7080b9c-c3ff-4f27-af70-12680643f82c, client-e2e-f7080b9c-c3ff-4f27-af70-12680643f82c", + "traceId": "1907384652524fc68f135c5460bebf1e", + "evidence": { + "userId": "2085906649595891714", + "username": "client_20260808015114_829174", + "displayName": "测试管理员-20260808015114-cd28a2ee" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.879Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4b706414-f35a-4dea-910d-c5b3430b5263, client-e2e-4b706414-f35a-4dea-910d-c5b3430b5263", + "traceId": "b58e83f22e7345299014cf9ec3636e2a", + "evidence": { + "userId": "2085906649595891714", + "username": "client_20260808015114_829174", + "displayName": "测试企业管理员-20260808015114-cd28a2ee" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:16.911Z", + "durationMs": 327, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4f2ebb3d-c13f-4b79-95f5-d2ded9e4b89b, client-e2e-4f2ebb3d-c13f-4b79-95f5-d2ded9e4b89b", + "traceId": "b47d6d6031ae4e3692c706aae6876dda", + "evidence": { + "username": "client_20260808015114_829174" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.238Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-587880b4-2218-4c21-9a36-68b44f30bdfa, client-e2e-587880b4-2218-4c21-9a36-68b44f30bdfa", + "traceId": "21adf04722404cba9c329bb6186396db", + "evidence": { + "userId": "2085906649595891714", + "username": "client_20260808015114_829174", + "displayName": "测试企业管理员-20260808015114-cd28a2ee" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.263Z", + "durationMs": 20, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7c525f2e-7d29-44c1-af06-de93f035e945, client-e2e-7c525f2e-7d29-44c1-af06-de93f035e945", + "traceId": "22b3dc531b81448c8191e01b794d0e38", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.283Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5e8bb1e0-70c4-46ce-a9ba-1a1bcdecd060, client-e2e-5e8bb1e0-70c4-46ce-a9ba-1a1bcdecd060", + "traceId": "18d3fd0fc4984aba8c2d155d4c53d9b2", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.308Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1d1bef61-f63f-4a23-8c4a-aefc0286d858, client-e2e-1d1bef61-f63f-4a23-8c4a-aefc0286d858", + "traceId": "d15aebb5e71e4bdfbb67dce84a5b75b5", + "evidence": { + "roleId": "2085906659746107393", + "roleCode": "E2E_20260808015114_cd28a2ee", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.344Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-381bec6d-bc49-49b3-8dbf-77910f7711a1, client-e2e-381bec6d-bc49-49b3-8dbf-77910f7711a1", + "traceId": "463061bf40964f5798a0397187eb4c2c", + "evidence": { + "roleId": "2085906659746107393", + "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-08T01:51:17.379Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e92e7236-f6ca-4ea9-8174-dab68ce0a0ac, client-e2e-e92e7236-f6ca-4ea9-8174-dab68ce0a0ac", + "traceId": "e6eccfb95c97448095f78eae43a55c8d", + "evidence": { + "roleId": "2085906659746107393", + "roleName": "订单只读-20260808015114-cd28a2ee", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.402Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a4740937-bef3-43be-9e65-20213901a0af, client-e2e-a4740937-bef3-43be-9e65-20213901a0af", + "traceId": "16a3c2d99ad346fa83b458c6b7d68270", + "evidence": { + "roleId": "2085906659746107393", + "roleName": "订单查询员-20260808015114-cd28a2ee", + "description": "edited 20260808015114-cd28a2ee" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.428Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-85f4a439-f91d-41d9-af30-5f6d8f773844, client-e2e-85f4a439-f91d-41d9-af30-5f6d8f773844", + "traceId": "5a472ed885fa4e8da91d24705387bab6", + "evidence": { + "roleId": "2085906659746107393", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.469Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0cb5ae06-4a3c-47d2-81ea-a3fcacb87c7f, client-e2e-0cb5ae06-4a3c-47d2-81ea-a3fcacb87c7f", + "traceId": "909a9fb8bcc84284bb9c6363f1633c10", + "evidence": { + "roleId": "2085906659746107393", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.500Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d5259b7f-9c9b-4c68-823f-aeec36b49db4, client-e2e-d5259b7f-9c9b-4c68-823f-aeec36b49db4", + "traceId": "fccf7780786c4be5a9b58f819dd8ecf0", + "evidence": { + "membershipId": "2085906660501082115", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085906659746107393" + ] + } + }, + { + "module": "rbac-member", + "name": "duplicate member username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.833Z", + "durationMs": 37, + "http": 200, + "code": "A0409", + "message": "企业成员编号已存在", + "requestId": "client-e2e-96016bad-02b0-45c6-accf-dd3436b58cb2, client-e2e-96016bad-02b0-45c6-accf-dd3436b58cb2", + "traceId": "95910d3fbbc2415eb13b9e2dcc044a80", + "evidence": { + "username": "member_20260808015117_8fced", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "assigned custom role cannot be deleted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.870Z", + "durationMs": 28, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "client-e2e-7a59e0c2-0358-4ae8-990e-bc8ca8e23d24, client-e2e-7a59e0c2-0358-4ae8-990e-bc8ca8e23d24", + "traceId": "dc2c6a72d1a347f0a1eea1eb30915ad2", + "evidence": { + "roleId": "2085906659746107393", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.898Z", + "durationMs": 31, + "http": 200, + "code": "A0403", + "message": "企业所有者不能被停用", + "requestId": "client-e2e-47618c34-98c1-4ecc-8e72-2e406bd40948, client-e2e-47618c34-98c1-4ecc-8e72-2e406bd40948", + "traceId": "400569fda086474d86dbcbfaa51924a5", + "evidence": { + "membershipId": "2085906649595891715", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be edited through member API", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.930Z", + "durationMs": 30, + "http": 200, + "code": "A0403", + "message": "不能通过成员管理接口创建或转让企业所有者", + "requestId": "client-e2e-b0eb0f47-ef81-45e7-907f-b453aae11df9, client-e2e-b0eb0f47-ef81-45e7-907f-b453aae11df9", + "traceId": "7f66d02fded3433a922eb1e17f25b803", + "evidence": { + "membershipId": "2085906649595891715", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:17.960Z", + "durationMs": 427, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5bbd602f-2a94-419e-a5f5-b6811e40754f, client-e2e-5bbd602f-2a94-419e-a5f5-b6811e40754f", + "traceId": "d592a65920d64bd2acf5cf59a69edb6c", + "evidence": { + "username": "member_20260808015117_8fced" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:18.387Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fbb6ae02-1d4b-46b9-9416-97575f769e2f, client-e2e-fbb6ae02-1d4b-46b9-9416-97575f769e2f", + "traceId": "e47670cce14e4cbdb127c567068b5d88", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:18.423Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-12a6d989-437a-4873-93ba-2637e2081444, client-e2e-12a6d989-437a-4873-93ba-2637e2081444", + "traceId": "1498e1398043479b9fd5c25e7f7dda8d", + "evidence": { + "orderId": "2085906652901998593", + "status": "DRAFT" + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:18.457Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-492ccbab-7ce8-473b-8d0d-33227f6a8e29, client-e2e-492ccbab-7ce8-473b-8d0d-33227f6a8e29", + "traceId": "14c37739d26c4265a90d93f14a442187", + "evidence": { + "membershipId": "2085906660501082115", + "displayName": "已编辑订单成员-20260808015114-cd28a2ee", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:18.501Z", + "durationMs": 389, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-029ae3a7-ff33-4b57-b7a1-1f9bab5cce68, client-e2e-029ae3a7-ff33-4b57-b7a1-1f9bab5cce68", + "traceId": "cf971581b5cc427bb6d6262deed176f1", + "evidence": { + "membershipId": "2085906660501082115" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:18.890Z", + "durationMs": 326, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-14b87766-ae91-469f-a6a9-08912ae92637, client-e2e-14b87766-ae91-469f-a6a9-08912ae92637", + "traceId": "94568b01ab8f4b62bc6c9185d92e8fdf", + "evidence": { + "username": "member_20260808015117_8fced", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.216Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2b51a1eb-574c-42d7-9ad0-0defb13ae2cc, client-e2e-2b51a1eb-574c-42d7-9ad0-0defb13ae2cc", + "traceId": "6da27d39c521431dbeccd8abc80089f1", + "evidence": { + "username": "member_20260808015117_8fced" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.549Z", + "durationMs": 106, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2474fb05-d22c-4586-8613-22400070b1c8, client-e2e-2474fb05-d22c-4586-8613-22400070b1c8", + "traceId": "f0e5327e86574a5c8e2f3750aa9e7aa8", + "evidence": { + "membershipId": "2085906660501082115", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.655Z", + "durationMs": 20, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-ee9cc5b6-5237-4393-a156-d28d50473401, client-e2e-ee9cc5b6-5237-4393-a156-d28d50473401", + "traceId": "ee76c0fc14ed4df496f6d88c04ccc193", + "evidence": { + "username": "member_20260808015117_8fced", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.675Z", + "durationMs": 100, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-08e07e6e-11ca-46ea-8ec3-364a063676a3, client-e2e-08e07e6e-11ca-46ea-8ec3-364a063676a3", + "traceId": "768618e51d7b4e35883c057f2c12fea5", + "evidence": { + "membershipId": "2085906660501082115", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.775Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-062b54f7-dd5b-4753-8739-453c77e130e6, client-e2e-062b54f7-dd5b-4753-8739-453c77e130e6", + "traceId": "032bd1ab2f1242ddac6591fd74b64b97", + "evidence": { + "membershipId": "2085906660501082115", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.818Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-911a3416-7f8e-4a91-869f-cc340ad96c0b, client-e2e-911a3416-7f8e-4a91-869f-cc340ad96c0b", + "traceId": "9375b25fd323451a94c75c0b8b4b5cff", + "evidence": { + "membershipId": "2085906660501082115", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.841Z", + "durationMs": 27, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-632cefc9-e75b-46e7-9da0-56573a6ad686", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:19.869Z", + "durationMs": 325, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d0b7db62-ae9f-4334-80ea-0ae7d13293bc, client-e2e-d0b7db62-ae9f-4334-80ea-0ae7d13293bc", + "traceId": "19f865a70ee24d80884ce970219711bb", + "evidence": { + "username": "member_20260808015117_8fced" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.194Z", + "durationMs": 36, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-c0876eb3-5d5c-4f01-a8b9-f7a5119b824c, client-e2e-c0876eb3-5d5c-4f01-a8b9-f7a5119b824c", + "traceId": "fb39f53914224e50b09e66ae5dc4c34c", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.230Z", + "durationMs": 85, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-21209c5b-1349-4c45-987a-58b676ce8d56, client-e2e-21209c5b-1349-4c45-987a-58b676ce8d56", + "traceId": "de8747ba133f403c93a8f4e2228f7e81", + "evidence": { + "membershipId": "2085906660501082115", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.315Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-889daaa9-7502-4215-9bb8-f2fd5f343efc, client-e2e-889daaa9-7502-4215-9bb8-f2fd5f343efc", + "traceId": "db45abd46b22460eb9094bc3fd9bccd5", + "evidence": { + "roleId": "2085906659746107393" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.342Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a6468912-fc5d-49f0-a702-22576458ef03, client-e2e-a6468912-fc5d-49f0-a702-22576458ef03", + "traceId": "b1021a0cfcc5424d98c90c7a4b93aa47", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.372Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-da8cbbbe-bdb3-41f8-8d95-972b19927efd, client-e2e-da8cbbbe-bdb3-41f8-8d95-972b19927efd", + "traceId": "5fc064221ff84521a4553697b2047ac4", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.425Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c15a7669-8cd3-41c7-af79-de30e1291467, client-e2e-c15a7669-8cd3-41c7-af79-de30e1291467", + "traceId": "a1b9c28b751b4ad69b07548be644b6c7", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.463Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1aa6e9e6-3370-477f-8f70-27b4ef768a3e, client-e2e-1aa6e9e6-3370-477f-8f70-27b4ef768a3e", + "traceId": "53297fb8eb6e4a0dab224e25a76be75e", + "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-08T01:51:20.503Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1d667362-b09e-4931-b91c-6bf0defc91ae, client-e2e-1d667362-b09e-4931-b91c-6bf0defc91ae", + "traceId": "0e5ce59c2d1e43e5b9910052abfc9029", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 1", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.539Z", + "durationMs": 35, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-d8f14704-5647-4db5-a68d-3ba1350107ca, client-e2e-d8f14704-5647-4db5-a68d-3ba1350107ca", + "traceId": "134c16519461458996e288cc0971387c", + "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-08T01:51:20.574Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d1bab590-5785-4af1-b630-8cf953cbf7b9, client-e2e-d1bab590-5785-4af1-b630-8cf953cbf7b9", + "traceId": "77552b0b208345f69239261884e60e99", + "evidence": { + "matched": true, + "destinationWarehouseId": "193000000000000002", + "destinationCode": "ABE3", + "priceBookVersionId": "2085661426268549121", + "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-08T01:51:20.603Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b4669daf-d37b-423f-a1f1-43fa338d241a, client-e2e-b4669daf-d37b-423f-a1f1-43fa338d241a", + "traceId": "210c38b9b683475d838277cd697b98b0", + "evidence": { + "fileId": "2085906673558945794", + "fileName": "product-20260808015114-cd28a2ee.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.636Z", + "durationMs": 25, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-9e118870-3d61-4b97-b4b0-43df4d6d7674, client-e2e-9e118870-3d61-4b97-b4b0-43df4d6d7674", + "traceId": "a344e125225e4108a7f2035a24316871", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.662Z", + "durationMs": 77, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8de54380-faee-437d-a00c-bab4b2e05592, client-e2e-8de54380-faee-437d-a00c-bab4b2e05592", + "traceId": "27316040300f4d42a5813bc451e4edb1", + "evidence": { + "orderId": "2085906673965793281" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.739Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-83ab8b24-377e-4b3a-8a8a-62a16f8411e0, client-e2e-83ab8b24-377e-4b3a-8a8a-62a16f8411e0", + "traceId": "e6ba1b941b7e4a56b7a4fd9952e95c43", + "evidence": { + "orderId": "2085906673965793281", + "replayed": true + } + }, + { + "module": "order-boundary", + "name": "same idempotency key with different payload is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.776Z", + "durationMs": 30, + "http": 200, + "code": "A0409", + "message": "Idempotency-Key conflicts with a different request", + "requestId": "client-e2e-a01ef0fa-e957-462d-b521-d758666636fd, client-e2e-a01ef0fa-e957-462d-b521-d758666636fd", + "traceId": "f1622cbd410942859da26aeb9f775b9c", + "evidence": { + "orderId": "2085906673965793281", + "rejectionCode": "A0409" + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.806Z", + "durationMs": 72, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-242e7545-61dd-447d-bd81-309814121a26, client-e2e-242e7545-61dd-447d-bd81-309814121a26", + "traceId": "9dd04acc3a4449438eb1935429e6062c", + "evidence": { + "orderId": "2085906673965793281", + "customerRemark": "edited-20260808015114-cd28a2ee" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.878Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-eb900895-81a8-4ce6-a81c-a7207425e79e, client-e2e-eb900895-81a8-4ce6-a81c-a7207425e79e", + "traceId": "fab615e2d3f0472fae70bcc0471494bd", + "evidence": { + "orderId": "2085906673965793281", + "orderNo": "FL2085906673965793281", + "status": "DRAFT", + "cargo": { + "id": "2085906674557190145", + "skuNo": "SKU-ACTIVE-20260808015114-cd28a2ee", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808015114-cd28a2ee", + "referenceId": "REF-ACTIVE-20260808015114-cd28a2ee", + "productImageFileId": "2085906673558945794" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.916Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a7ede03f-cf65-49bf-b7b7-3463030b30a6, client-e2e-a7ede03f-cf65-49bf-b7b7-3463030b30a6", + "traceId": "2effa8ffe183435bbd86500a817b042f", + "evidence": { + "total": "1", + "orderId": "2085906673965793281", + "orderNo": "FL2085906673965793281", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:20.954Z", + "durationMs": 73, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8ed0292a-87b9-4bbd-8b05-d968eb85f580, client-e2e-8ed0292a-87b9-4bbd-8b05-d968eb85f580", + "traceId": "8f4a77ac587145ccb9d72fd3da80c64d", + "evidence": { + "orderId": "2085906673965793281" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.027Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2ba2cd40-ef66-4461-b614-91f9deb42edb, client-e2e-2ba2cd40-ef66-4461-b614-91f9deb42edb", + "traceId": "cb40d0a0e10e4110933f7efce55a8320", + "evidence": { + "orderId": "2085906673965793281", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.055Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c10a2442-bbe7-4901-83b5-f5d3682c9bc5, client-e2e-c10a2442-bbe7-4901-83b5-f5d3682c9bc5", + "traceId": "316e4de3bc244b9184e949de07d263e2", + "evidence": { + "orderId": "2085906673965793281", + "orderNo": "FL2085906673965793281", + "status": "SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "submitted order cannot be edited by client", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.082Z", + "durationMs": 58, + "http": 200, + "code": "B0001", + "message": "当前订单状态不允许编辑订单资料", + "requestId": "client-e2e-34817a83-c9f4-49f0-8b36-969b45591c00, client-e2e-34817a83-c9f4-49f0-8b36-969b45591c00", + "traceId": "917846a79348439694672adfeb0c9d3d", + "evidence": { + "orderId": "2085906673965793281", + "rejectionCode": "B0001", + "message": "当前订单状态不允许编辑订单资料" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0409\" actual=\"B0001\"" + } + }, + { + "module": "unified-orders", + "name": "unified order list contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.140Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-212b206d-7781-429d-b30b-96a29102df32, client-e2e-212b206d-7781-429d-b30b-96a29102df32", + "traceId": "31699703bc04474ba5597ad1d08d2e44", + "evidence": { + "total": "1", + "orderId": "2085906673965793281", + "mainStatus": "PENDING_REVIEW", + "internalOrderStatus": "SUBMITTED" + } + }, + { + "module": "unified-orders", + "name": "unified order detail returns timeline", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.202Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b94e0d53-2c88-42cd-bfc2-da914872ac8d, client-e2e-b94e0d53-2c88-42cd-bfc2-da914872ac8d", + "traceId": "833d440873bd46339329388529762b48", + "evidence": { + "orderId": "2085906673965793281", + "mainStatus": "PENDING_REVIEW", + "timelineCount": 3 + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.240Z", + "durationMs": 73, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1e4e37fc-5d9c-4fa1-bb8c-cf9a9b2670a9, client-e2e-1e4e37fc-5d9c-4fa1-bb8c-cf9a9b2670a9", + "traceId": "59c77ca26805459c8ef5c0a8b7395c49", + "evidence": { + "orderId": "2085906676373323777" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.313Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b61c0acf-0a38-474f-b182-980b4d5553cc, client-e2e-b61c0acf-0a38-474f-b182-980b4d5553cc", + "traceId": "f91de45fa6e246089d618bd23b8dc072", + "evidence": { + "orderId": "2085906676373323777" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.352Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f649aa60-1106-49b8-a229-0ed886521577, client-e2e-f649aa60-1106-49b8-a229-0ed886521577", + "traceId": "dfaccfa5cfb7453bbc459df0b8c64677", + "evidence": { + "orderId": "2085906676373323777", + "status": "CANCELLED" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be cancelled again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.377Z", + "durationMs": 32, + "http": 200, + "code": "A0409", + "message": "该操作已完成,请勿重复提交", + "requestId": "client-e2e-b1c8bc67-fc25-47cc-80d6-dd45b3aef000, client-e2e-b1c8bc67-fc25-47cc-80d6-dd45b3aef000", + "traceId": "ec402e5031044cb0bc6e8cc262a447dc", + "evidence": { + "orderId": "2085906676373323777", + "rejectionCode": "A0409", + "message": "该操作已完成,请勿重复提交" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be submitted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.409Z", + "durationMs": 31, + "http": 200, + "code": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED", + "requestId": "client-e2e-6421ed10-4a3f-42d8-b5f8-4f7c662f034b, client-e2e-6421ed10-4a3f-42d8-b5f8-4f7c662f034b", + "traceId": "b1b9bb961edf4489a426ca16dc4a0d21", + "evidence": { + "orderId": "2085906676373323777", + "rejectionCode": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "invalid order page size is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.440Z", + "durationMs": 31, + "http": 200, + "code": "A0422", + "message": "size: must be less than or equal to 200", + "requestId": "client-e2e-cc9dc724-1fc1-4c5c-8d11-736506693da9, client-e2e-cc9dc724-1fc1-4c5c-8d11-736506693da9", + "traceId": "799a43b393a8474ab2856768b6a26fa4", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.472Z", + "durationMs": 334, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ad4468e9-9c75-4b36-9fd2-a25d868a0342, client-e2e-ad4468e9-9c75-4b36-9fd2-a25d868a0342", + "traceId": "c94c6716da1b47c6a4758537eece4b37", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.806Z", + "durationMs": 33, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-5139e33b-5099-4834-a4fe-fb6cb52678ba, client-e2e-5139e33b-5099-4834-a4fe-fb6cb52678ba", + "traceId": "105fc4a15e214257b0dc016cceb0ae29", + "evidence": { + "orderId": "2085906673965793281", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client product image access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.839Z", + "durationMs": 35, + "http": 200, + "code": "A0404", + "message": "产品图片不存在", + "requestId": "client-e2e-d8e247a3-3fc4-44d3-87ae-d10ca744333d, client-e2e-d8e247a3-3fc4-44d3-87ae-d10ca744333d", + "traceId": "7bb190ebf81f4f05b8c8dbad0855c3ba", + "evidence": { + "fileId": "2085906673558945794", + "rejectionCode": "A0404" + } + }, + { + "module": "account-security", + "name": "rotate refresh token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.874Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b685c8ab-72f1-4189-a802-dfa4c022a303, client-e2e-b685c8ab-72f1-4189-a802-dfa4c022a303", + "traceId": "442b3051c614491c9be9fea3994a5a46", + "evidence": { + "rotated": true + } + }, + { + "module": "account-security", + "name": "change owner password to temporary value", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:21.908Z", + "durationMs": 964, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2be17480-e671-4c4f-ae6b-0930e086a19c, client-e2e-2be17480-e671-4c4f-ae6b-0930e086a19c", + "traceId": "97dfe43eca2a47d2ac2cda06672d9874", + "evidence": { + "username": "client_20260808015114_829174", + "passwordChanged": true + } + }, + { + "module": "account-security", + "name": "original password is rejected after change", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:22.872Z", + "durationMs": 331, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-d78ee008-3278-4d12-947a-015b37f18758, client-e2e-d78ee008-3278-4d12-947a-015b37f18758", + "traceId": "85b53fed7446425a932ca89e0d129e3c", + "evidence": { + "username": "client_20260808015114_829174", + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "temporary password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:23.203Z", + "durationMs": 338, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6ecea9f6-2dec-4bd0-9501-af845e745e57, client-e2e-6ecea9f6-2dec-4bd0-9501-af845e745e57", + "traceId": "f0ba53dc8d784ff9befce779ff6ccf0f", + "evidence": { + "username": "client_20260808015114_829174" + } + }, + { + "module": "account-security", + "name": "restore owner password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:23.541Z", + "durationMs": 1005, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3e9e09c2-7fc0-486d-9c8b-3f4a0c366a4c, client-e2e-3e9e09c2-7fc0-486d-9c8b-3f4a0c366a4c", + "traceId": "a974cb0945534cb895aeef9f86aee54c", + "evidence": { + "username": "client_20260808015114_829174", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "restored owner password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:24.546Z", + "durationMs": 346, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fab849c9-055c-40b9-ac8b-7425a5d38739, client-e2e-fab849c9-055c-40b9-ac8b-7425a5d38739", + "traceId": "76028c089fa64bfcbc8df21fc9c9cf5a", + "evidence": { + "username": "client_20260808015114_829174", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "logout current client session", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:24.892Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b6378155-a57e-4218-970a-6087b8da180d, client-e2e-b6378155-a57e-4218-970a-6087b8da180d", + "traceId": "3a4a1bb4f8564c0b8b6dc065db7e5272", + "evidence": { + "username": "client_20260808015114_829174" + } + }, + { + "module": "account-security", + "name": "logged-out refresh token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:51:24.924Z", + "durationMs": 25, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-a54c4498-8ff7-4179-a5fc-18a3a94e90e0, client-e2e-a54c4498-8ff7-4179-a5fc-18a3a94e90e0", + "traceId": "df0535395d4e4fefa71cc359d4479e0a", + "evidence": { + "rejectionCode": "A0401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808015832-f9a13c4c.json b/reports/client-test-env-20260808015832-f9a13c4c.json new file mode 100644 index 000000000..0b6f97972 --- /dev/null +++ b/reports/client-test-env-20260808015832-f9a13c4c.json @@ -0,0 +1,2259 @@ +{ + "marker": "20260808015832-f9a13c4c", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:58:32.462Z", + "completedAt": "2026-08-08T01:58:43.642Z", + "success": false, + "fatal": null, + "testAccount": { + "username": "client_20260808015832_a2d2f8", + "companyName": "客户端全链路测试企业-20260808015832-f9a13c4c", + "legalPhone": "13954312463" + }, + "resources": { + "tenantId": "2085908486264836097", + "membershipId": "2085908486264836099", + "reviewId": "2085908490220064770", + "productImageFileId": "2085908513885323265", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085908497484599300", + "orderIds": [ + "2085908489436725250", + "2085908514250227714", + "2085908516548706305" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:32.464Z", + "durationMs": 380, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-34f34abd-3320-4da7-a83a-bdf4366cf4bb, client-e2e-34f34abd-3320-4da7-a83a-bdf4366cf4bb", + "traceId": "e742a57eb14443648d40451a681b1a53", + "evidence": { + "tenantId": "2085908486264836097", + "membershipId": "2085908486264836099", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:32.844Z", + "durationMs": 31, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-6dbec9e2-8e18-4fef-aad1-ec377c9cbdfe, client-e2e-6dbec9e2-8e18-4fef-aad1-ec377c9cbdfe", + "traceId": "71c5cb0b11204b6f820e1b5cb18cbbcb", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:32.875Z", + "durationMs": 341, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4729e694-c9a4-410e-889f-1c3775019766, client-e2e-4729e694-c9a4-410e-889f-1c3775019766", + "traceId": "e5c501ec926f42018ad0aac81c58fff8", + "evidence": { + "username": "client_20260808015832_a2d2f8" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.216Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d0618acf-04ec-4775-9a20-ccd6bec68f89, client-e2e-d0618acf-04ec-4775-9a20-ccd6bec68f89", + "traceId": "c201031377574030a1aef4f9b75b1c65", + "evidence": { + "id": "2085908486264836097", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808015832-f9a13c4c" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.251Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5c43ea2a-18b2-4422-8c38-1812e4a8f7d7, client-e2e-5c43ea2a-18b2-4422-8c38-1812e4a8f7d7", + "traceId": "f6791b8cf03342849e18652749b6b3cc", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.286Z", + "durationMs": 50, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e2537224-9e04-4a65-811a-c03915567fa7, client-e2e-e2537224-9e04-4a65-811a-c03915567fa7", + "traceId": "273a88c0f6b74d44a74bef2da643cbef", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.336Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9c7f824c-2b50-41da-82ee-eb043339fe08, client-e2e-9c7f824c-2b50-41da-82ee-eb043339fe08", + "traceId": "ebc155f031554252878cf4a8360f0589", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.376Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-08d9f6fb-e131-4192-ad83-b4cdef1f254a, client-e2e-08d9f6fb-e131-4192-ad83-b4cdef1f254a", + "traceId": "a1fe881e5aa74895afaa4aedd591badf", + "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-08T01:58:33.412Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b1432563-c260-49e1-9b59-18cac08b8714, client-e2e-b1432563-c260-49e1-9b59-18cac08b8714", + "traceId": "87e7838d279f4899aba50c9ca8e4f747", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.447Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ba254426-e0b2-4651-a6ea-2b283d680691, client-e2e-ba254426-e0b2-4651-a6ea-2b283d680691", + "traceId": "1064d99d61634124b30af9ac024936f6", + "evidence": { + "fileId": "2085908489071820801", + "fileName": "product-20260808015832-f9a13c4c.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.489Z", + "durationMs": 23, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-fdbca7c6-540d-4cf4-84c8-46ee7874dbac, client-e2e-fdbca7c6-540d-4cf4-84c8-46ee7874dbac", + "traceId": "39e12c1bd51d4c86af1f78f43d0022df", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.512Z", + "durationMs": 69, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c80baefb-fc1f-4719-a781-f5432893544d, client-e2e-c80baefb-fc1f-4719-a781-f5432893544d", + "traceId": "d8ecd57ba16648cb84408a5265b5172b", + "evidence": { + "orderId": "2085908489436725250", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.581Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c1a71748-b828-48cc-b1d8-655e37c90874, client-e2e-c1a71748-b828-48cc-b1d8-655e37c90874", + "traceId": "cd91e76ac8794f9fa6904f6eb2285b37", + "evidence": { + "orderId": "2085908489436725250", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.614Z", + "durationMs": 32, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-f8e9846a-6dd1-4605-b834-383de0105de9, client-e2e-f8e9846a-6dd1-4605-b834-383de0105de9", + "traceId": "7d96dd3da5b04622b1a20ee4c8a4c00c", + "evidence": { + "orderId": "2085908489436725250", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.646Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a9e66a5a-864c-447c-a14b-21f5abac513e, client-e2e-a9e66a5a-864c-447c-a14b-21f5abac513e", + "traceId": "9723ef1a8c3243458403eaf15042a3c9", + "evidence": { + "businessLicenseQualificationId": "2085908489884520450", + "legalPersonIdQualificationId": "2085908489892909058", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.690Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-531c4c3e-b257-4967-9faa-b4f55e18d062, client-e2e-531c4c3e-b257-4967-9faa-b4f55e18d062", + "traceId": "046c56d5585d4c9f8e95070925cc1648", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085908489884520450", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085908489892909058", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.726Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b1841d36-d1da-4609-bc7d-1dbae99d341f, client-e2e-b1841d36-d1da-4609-bc7d-1dbae99d341f", + "traceId": "2a92a82e1af240868d409eaf8268d5fb", + "evidence": { + "tenantId": "2085908486264836097", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:33.765Z", + "durationMs": 345, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-eb8f83ba-15cb-4a1a-8be5-7f0822040feb, client-e2e-eb8f83ba-15cb-4a1a-8be5-7f0822040feb", + "traceId": "ea64a61b124045dfb7703340227c0543", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.110Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c6b8361-ec80-482b-8872-5dba87b2e53e, client-e2e-6c6b8361-ec80-482b-8872-5dba87b2e53e", + "traceId": "36fb1d2f07dd4076b140cd985ae11d0f", + "evidence": { + "reviewId": "2085908490220064770", + "tenantId": "2085908486264836097", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.144Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b9f46d51-0e65-4dd9-80a2-739e8cad0df7, client-e2e-b9f46d51-0e65-4dd9-80a2-739e8cad0df7", + "traceId": "5bd7847fb6be477491991a38962357d5", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085908489884520450", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085908489892909058", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.174Z", + "durationMs": 49, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5e42045d-e7ca-4ce7-9e64-50873e8cd102, client-e2e-5e42045d-e7ca-4ce7-9e64-50873e8cd102", + "traceId": "39da06231491464e9d663a778fd754d4", + "evidence": { + "tenantId": "2085908486264836097", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.223Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-74148f46-b716-4719-8e56-2f9981bb863c, client-e2e-74148f46-b716-4719-8e56-2f9981bb863c", + "traceId": "071068c4899b485fbefc67b44851795e", + "evidence": { + "membershipId": "2085908486264836099", + "username": "client_20260808015832_a2d2f8", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.257Z", + "durationMs": 332, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2163a835-bb57-48b5-8e0c-23d33cb37bc1, client-e2e-2163a835-bb57-48b5-8e0c-23d33cb37bc1", + "traceId": "34af46d1de9348758d15ee56cd179b5a", + "evidence": { + "username": "client_20260808015832_a2d2f8" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.590Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4d5c8c1f-b8d9-41ff-ab28-e561ab397c03, client-e2e-4d5c8c1f-b8d9-41ff-ab28-e561ab397c03", + "traceId": "982f508225f64184839adb7472a6c660", + "evidence": { + "id": "2085908486264836097", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808015832-f9a13c4c" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.620Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-62d128b6-f11c-4a87-a4a7-2703276121f7, client-e2e-62d128b6-f11c-4a87-a4a7-2703276121f7", + "traceId": "088cb7037c3e4d0da7419fe92374b3a0", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085908489884520450", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085908489892909058", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "merchant-session", + "name": "preview approved qualification file", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.651Z", + "durationMs": 32, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-59888289-263e-40cd-b229-56f6a0020d3c, client-e2e-59888289-263e-40cd-b229-56f6a0020d3c", + "traceId": "6a51667e66994a7f90b267a3f297a381", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.683Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-23379712-92d0-46d7-ade7-79eeff19ad9e, client-e2e-23379712-92d0-46d7-ade7-79eeff19ad9e", + "traceId": "a1d4edc54b154d6e96467cd73a60c01f", + "evidence": { + "id": "2085908486264836097", + "tenantName": "客户端全链路测试企业-20260808015832-f9a13c4c", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.715Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5f883045-3ab0-4851-99cd-4e096ac7473e, client-e2e-5f883045-3ab0-4851-99cd-4e096ac7473e", + "traceId": "034989befd1b46b8ad6e3a9d74015e94", + "evidence": { + "id": "2085908486264836097", + "tenantName": "客户端全链路测试企业-20260808015832-f9a13c4c-已编辑", + "contactName": "企业联系人-20260808015832-f9a13c4c", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.748Z", + "durationMs": 20, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-77e89c6c-6542-4d59-b7c0-4958b4aac4ed, client-e2e-77e89c6c-6542-4d59-b7c0-4958b4aac4ed", + "traceId": "59a77a7bab8b4731ae13787128598e43", + "evidence": { + "id": "2085908486264836097", + "tenantName": "客户端全链路测试企业-20260808015832-f9a13c4c-已编辑", + "contactEmail": "company_20260808015832f9a13c4c@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.768Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-962c8039-e7ee-4a7e-8bb5-0c5751fc3963, client-e2e-962c8039-e7ee-4a7e-8bb5-0c5751fc3963", + "traceId": "d2b7610de52f44e194510946ad76b9cc", + "evidence": { + "userId": "2085908486264836098", + "username": "client_20260808015832_a2d2f8", + "displayName": "测试管理员-20260808015832-f9a13c4c" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.790Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b59bb1ea-44bf-48cc-b29a-1dbe18864094, client-e2e-b59bb1ea-44bf-48cc-b29a-1dbe18864094", + "traceId": "a7ea49aa43654ae9af2f1cb42393c864", + "evidence": { + "userId": "2085908486264836098", + "username": "client_20260808015832_a2d2f8", + "displayName": "测试企业管理员-20260808015832-f9a13c4c" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:34.828Z", + "durationMs": 331, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6eeadcf7-9aba-4ce1-a00a-c78515d51d3f, client-e2e-6eeadcf7-9aba-4ce1-a00a-c78515d51d3f", + "traceId": "fe8258aa672c46bfbf8170d8ca72c3ac", + "evidence": { + "username": "client_20260808015832_a2d2f8" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.159Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9632f374-a027-4e14-9d7b-117147a2a43c, client-e2e-9632f374-a027-4e14-9d7b-117147a2a43c", + "traceId": "ab10f364b1b34a7984853fdf929cd5fd", + "evidence": { + "userId": "2085908486264836098", + "username": "client_20260808015832_a2d2f8", + "displayName": "测试企业管理员-20260808015832-f9a13c4c" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.182Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b070879f-1adc-41c0-a3fe-dcc47eecf211, client-e2e-b070879f-1adc-41c0-a3fe-dcc47eecf211", + "traceId": "b9d01722db34477a849f027ed263c8ef", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "menu-permissions", + "name": "load owner effective permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.211Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-faa03e2e-f4c4-45f4-af3b-0b5573809d9d, client-e2e-faa03e2e-f4c4-45f4-af3b-0b5573809d9d", + "traceId": "b987ec1b418844dbb4efe022254e3558", + "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-08T01:58:35.242Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-93af989a-3112-4984-8bb3-72f7d69c3539, client-e2e-93af989a-3112-4984-8bb3-72f7d69c3539", + "traceId": "67abbb8dec924de79b1b238f14fe7f98", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.271Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d2bc673c-cea8-4689-ba2f-be2ee230989b, client-e2e-d2bc673c-cea8-4689-ba2f-be2ee230989b", + "traceId": "96a30ba4163f4fbfa2d28ead5564d027", + "evidence": { + "roleId": "2085908496696070146", + "roleCode": "E2E_20260808015832_f9a13c4c", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.307Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-998819f3-dabd-4a1d-93c4-245a849f39b4, client-e2e-998819f3-dabd-4a1d-93c4-245a849f39b4", + "traceId": "23d5de853c6340f9b8f873e0d8ed8dee", + "evidence": { + "roleId": "2085908496696070146", + "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-08T01:58:35.340Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d2835817-7d12-49ed-a094-1e609f22066c, client-e2e-d2835817-7d12-49ed-a094-1e609f22066c", + "traceId": "f6eb9d7841dc4d96b9d22f9afdaf02a9", + "evidence": { + "roleId": "2085908496696070146", + "roleName": "订单只读-20260808015832-f9a13c4c", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.365Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d0633290-580a-4baf-9cbe-6e36254db05d, client-e2e-d0633290-580a-4baf-9cbe-6e36254db05d", + "traceId": "41647708c76f41eba477d82b6c84dc8b", + "evidence": { + "roleId": "2085908496696070146", + "roleName": "订单查询员-20260808015832-f9a13c4c", + "description": "edited 20260808015832-f9a13c4c" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.401Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f8ce537f-3c7a-45c3-b773-aee09b3c28bd, client-e2e-f8ce537f-3c7a-45c3-b773-aee09b3c28bd", + "traceId": "fc779744169f4da0aade099ed6d6d631", + "evidence": { + "roleId": "2085908496696070146", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.434Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1b1a3adb-6e4f-491f-9bb4-20c3608bbae7, client-e2e-1b1a3adb-6e4f-491f-9bb4-20c3608bbae7", + "traceId": "9217673abd65487683c6c04c08fdc880", + "evidence": { + "roleId": "2085908496696070146", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.464Z", + "durationMs": 344, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f0d28c15-741b-4d40-9eea-ce8c1e44d215, client-e2e-f0d28c15-741b-4d40-9eea-ce8c1e44d215", + "traceId": "61d7454a9a1b46f6aa983a7dcf712815", + "evidence": { + "membershipId": "2085908497484599300", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085908496696070146" + ] + } + }, + { + "module": "rbac-member", + "name": "duplicate member username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.808Z", + "durationMs": 28, + "http": 200, + "code": "A0409", + "message": "企业成员编号已存在", + "requestId": "client-e2e-9a63ba0d-d2cf-4730-9e40-feda7a4a83a5, client-e2e-9a63ba0d-d2cf-4730-9e40-feda7a4a83a5", + "traceId": "5b858508b2e64a4b8c62e705adc01f7f", + "evidence": { + "username": "member_20260808015835_2abf9", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "assigned custom role cannot be deleted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.836Z", + "durationMs": 34, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "client-e2e-771936cf-620e-4386-bce5-e0b42c6b5915, client-e2e-771936cf-620e-4386-bce5-e0b42c6b5915", + "traceId": "1d5a3b8f64c742a497510f2185bcc097", + "evidence": { + "roleId": "2085908496696070146", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.870Z", + "durationMs": 26, + "http": 200, + "code": "A0403", + "message": "企业所有者不能被停用", + "requestId": "client-e2e-b962d484-18ee-4ad1-8d62-2d648886454c, client-e2e-b962d484-18ee-4ad1-8d62-2d648886454c", + "traceId": "38cdd9776dee441081b218312c4e73d7", + "evidence": { + "membershipId": "2085908486264836099", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be edited through member API", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.896Z", + "durationMs": 46, + "http": 200, + "code": "A0403", + "message": "不能通过成员管理接口创建或转让企业所有者", + "requestId": "client-e2e-2dd8b003-e886-4e80-aa82-45ff5d16203c, client-e2e-2dd8b003-e886-4e80-aa82-45ff5d16203c", + "traceId": "b7f155b0065a4c819bdb82b5d2eaedcf", + "evidence": { + "membershipId": "2085908486264836099", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:35.942Z", + "durationMs": 336, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-09ce233a-c320-4c4b-8366-4662eec81c34, client-e2e-09ce233a-c320-4c4b-8366-4662eec81c34", + "traceId": "121540f6cf5346ac99edca6aede86ae8", + "evidence": { + "username": "member_20260808015835_2abf9" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.278Z", + "durationMs": 46, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b8217ec8-d83c-497c-805f-74c825603ad2, client-e2e-b8217ec8-d83c-497c-805f-74c825603ad2", + "traceId": "9d2546ca08194549888ad0c3f536415e", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.325Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-eb72c4a2-228b-433a-9248-831a7f04bf94, client-e2e-eb72c4a2-228b-433a-9248-831a7f04bf94", + "traceId": "193c2f2db71d45668d2fea19bb00c415", + "evidence": { + "orderId": "2085908489436725250", + "status": "DRAFT" + } + }, + { + "module": "menu-permissions", + "name": "read-only member effective permissions match role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.363Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8300117a-c06e-4a73-a338-fe2fa286616e, client-e2e-8300117a-c06e-4a73-a338-fe2fa286616e", + "traceId": "37b1dfce23f04c27a23bc9c32547fbcb", + "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-08T01:58:36.394Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b6fce53c-c5b1-491b-a626-9efd25f1a7bb, client-e2e-b6fce53c-c5b1-491b-a626-9efd25f1a7bb", + "traceId": "348c7aea5d17423cb6fb666ca9eaaf75", + "evidence": { + "roleId": "2085908496696070146", + "status": "DISABLED" + } + }, + { + "module": "menu-permissions", + "name": "assigned role status change revokes stale member token", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.430Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1e0223c7-ea33-471d-ad0f-43af1e7b5789, client-e2e-1e0223c7-ea33-471d-ad0f-43af1e7b5789", + "traceId": "2d692227452d48e289ed4ffd45258001", + "evidence": { + "rejectionCode": "200" + }, + "error": { + "name": "Error", + "message": "HTTP status: expected=401 actual=200" + } + }, + { + "module": "menu-permissions", + "name": "member login succeeds while role is disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.454Z", + "durationMs": 339, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2fa6d66a-3bd5-4850-b433-d557a1d26c24, client-e2e-2fa6d66a-3bd5-4850-b433-d557a1d26c24", + "traceId": "7efc34b9b743409fbd08deb32d23d071", + "evidence": { + "username": "member_20260808015835_2abf9" + } + }, + { + "module": "menu-permissions", + "name": "disabled role removes member menus and permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.793Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ab0b36e3-31a7-4efa-a2d1-e069def83b17, client-e2e-ab0b36e3-31a7-4efa-a2d1-e069def83b17", + "traceId": "42ece0fd2f854cd4abfe21dd6e053dfe", + "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-08T01:58:36.825Z", + "durationMs": 30, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-dbdfbdcb-f1f2-4f99-b08e-c70d64cb5376, client-e2e-dbdfbdcb-f1f2-4f99-b08e-c70d64cb5376", + "traceId": "559db09ee5f84b03b20817d3fe30d7de", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "menu-permissions", + "name": "re-enable assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.856Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a0e60ce7-69e8-462e-95cf-4bac3ed76726, client-e2e-a0e60ce7-69e8-462e-95cf-4bac3ed76726", + "traceId": "35f6ef81069f462eaf753556f57340a3", + "evidence": { + "roleId": "2085908496696070146", + "status": "ACTIVE" + } + }, + { + "module": "menu-permissions", + "name": "member re-login after role is enabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:36.880Z", + "durationMs": 338, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d0cc4749-1637-4585-b28b-a3916426c48b, client-e2e-d0cc4749-1637-4585-b28b-a3916426c48b", + "traceId": "68f92ef9abf84f458f3ae7dc73dcb206", + "evidence": { + "username": "member_20260808015835_2abf9" + } + }, + { + "module": "menu-permissions", + "name": "re-enabled role restores member menus", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:37.218Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-42d68484-3f2e-4512-950c-5db4ab1f4ba7, client-e2e-42d68484-3f2e-4512-950c-5db4ab1f4ba7", + "traceId": "9e3c7939ecc549258776d798817b3a77", + "evidence": { + "backendPermissions": [ + "merchant:order:view", + "merchant:order:list" + ], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:37.246Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9e5fc38f-d4a8-4e91-ac44-c76ea428b397, client-e2e-9e5fc38f-d4a8-4e91-ac44-c76ea428b397", + "traceId": "ac902905fbe24933929ee977289398f8", + "evidence": { + "membershipId": "2085908497484599300", + "displayName": "已编辑订单成员-20260808015832-f9a13c4c", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:37.285Z", + "durationMs": 394, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b2f887b0-9ea5-4c8a-8254-b0e24c9418ba, client-e2e-b2f887b0-9ea5-4c8a-8254-b0e24c9418ba", + "traceId": "aa3dd2d735ff40e8b1ace2ad520fa473", + "evidence": { + "membershipId": "2085908497484599300" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:37.679Z", + "durationMs": 332, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-0d864c82-4306-414e-ae9b-44c79697563a, client-e2e-0d864c82-4306-414e-ae9b-44c79697563a", + "traceId": "d337a01b849c417988f6191f4554d8d1", + "evidence": { + "username": "member_20260808015835_2abf9", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.011Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-eb74522b-3aa1-4b75-8b83-b85a9d1d80cc, client-e2e-eb74522b-3aa1-4b75-8b83-b85a9d1d80cc", + "traceId": "74f7e886879640da872ac79234b3a1d6", + "evidence": { + "username": "member_20260808015835_2abf9" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.344Z", + "durationMs": 99, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-82175621-100d-4dfa-88dc-f3894f1725af, client-e2e-82175621-100d-4dfa-88dc-f3894f1725af", + "traceId": "6166a280087147e9921e0c70b5c23956", + "evidence": { + "membershipId": "2085908497484599300", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.443Z", + "durationMs": 25, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-43327b85-1a89-41ed-90cc-32d7f953b753, client-e2e-43327b85-1a89-41ed-90cc-32d7f953b753", + "traceId": "9e710ae3d71a4bfab9b85bc0db4a097c", + "evidence": { + "username": "member_20260808015835_2abf9", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.468Z", + "durationMs": 97, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c6c917e-36db-4605-a84b-3505eeae517c, client-e2e-6c6c917e-36db-4605-a84b-3505eeae517c", + "traceId": "224c01c41a364498b860837ea90c3646", + "evidence": { + "membershipId": "2085908497484599300", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.565Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-17b75958-e8c6-4d8f-80fb-2d14ca1a55e8, client-e2e-17b75958-e8c6-4d8f-80fb-2d14ca1a55e8", + "traceId": "97d68d0b23cb4bddafbe5352cb1b504a", + "evidence": { + "membershipId": "2085908497484599300", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.600Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ad6957d3-6a0c-424a-bb0e-fb77faf9409f, client-e2e-ad6957d3-6a0c-424a-bb0e-fb77faf9409f", + "traceId": "cdd36104c10c49448b75a250c7ae897b", + "evidence": { + "membershipId": "2085908497484599300", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.623Z", + "durationMs": 24, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-e85e7715-ffa7-4716-8f62-fadde7c27269", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.647Z", + "durationMs": 325, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-97299173-9308-401b-b770-86c2d6d39acd, client-e2e-97299173-9308-401b-b770-86c2d6d39acd", + "traceId": "8154fcd6597947f6890132aafe7aeb19", + "evidence": { + "username": "member_20260808015835_2abf9" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.972Z", + "durationMs": 21, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-159ae5b8-614c-400d-bb7a-a98869169545, client-e2e-159ae5b8-614c-400d-bb7a-a98869169545", + "traceId": "d7b2c8e9f2984dbdb789b9070dc1ca01", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:38.993Z", + "durationMs": 102, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-630b7f6c-e04c-41bd-97b2-36d188a32f62, client-e2e-630b7f6c-e04c-41bd-97b2-36d188a32f62", + "traceId": "3021ddbb6bdf4abcab13b32eff5f38e1", + "evidence": { + "membershipId": "2085908497484599300", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.095Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f32d1a56-f52b-4b5e-bc07-03d58e36eff4, client-e2e-f32d1a56-f52b-4b5e-bc07-03d58e36eff4", + "traceId": "5cb6e71b7a0c4ff9be1d2cc5cdcafb25", + "evidence": { + "roleId": "2085908496696070146" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.123Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c0ca6d1c-6b81-4eeb-95c2-5af2130c93a6, client-e2e-c0ca6d1c-6b81-4eeb-95c2-5af2130c93a6", + "traceId": "6991e23b9bd44db0ae1c972d8a33baba", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.152Z", + "durationMs": 55, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-094429ac-1919-4dd2-b0fc-1973a7fe6949, client-e2e-094429ac-1919-4dd2-b0fc-1973a7fe6949", + "traceId": "e0d3d10eb12d4ac595eee7aecad208a6", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.207Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-81269af7-e986-4363-8a27-c4ed01ce64fc, client-e2e-81269af7-e986-4363-8a27-c4ed01ce64fc", + "traceId": "0ded6692c4764b34bc5e863d11b8bc23", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.244Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-17a6eca0-53a5-43b1-aadf-9a0a79b86e51, client-e2e-17a6eca0-53a5-43b1-aadf-9a0a79b86e51", + "traceId": "e13c5baccb49450b92eda847a151491f", + "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-08T01:58:39.278Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5d51ed0d-979a-46ca-9b62-ccdf7aa55afa, client-e2e-5d51ed0d-979a-46ca-9b62-ccdf7aa55afa", + "traceId": "efa55f946e304a3a83f46a500a490618", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 1", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.306Z", + "durationMs": 31, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-aeb54374-6dcb-466a-b2c8-c6bf0a14db9e, client-e2e-aeb54374-6dcb-466a-b2c8-c6bf0a14db9e", + "traceId": "e5e2d61d07e34171803d1df58005d10b", + "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-08T01:58:39.337Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ef1cf7d3-e011-4995-ac61-e646a6f314a5, client-e2e-ef1cf7d3-e011-4995-ac61-e646a6f314a5", + "traceId": "1a7bcadfeabb41d19054a205219d52e4", + "evidence": { + "matched": true, + "destinationWarehouseId": "193000000000000002", + "destinationCode": "ABE3", + "priceBookVersionId": "2085907189707878402", + "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-08T01:58:39.368Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-db0c6951-e0c4-4124-921d-6f2c44a9414c, client-e2e-db0c6951-e0c4-4124-921d-6f2c44a9414c", + "traceId": "89c2c350f07d477eb51a32a13ef869fc", + "evidence": { + "fileId": "2085908513885323265", + "fileName": "product-20260808015832-f9a13c4c.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.405Z", + "durationMs": 24, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-19ece6ca-f536-468a-b2d2-47643ad86ebe, client-e2e-19ece6ca-f536-468a-b2d2-47643ad86ebe", + "traceId": "ef468b9ddbdb4a7cbfc159c8b7dfc390", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.429Z", + "durationMs": 72, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-aad1cec4-2863-4c21-8033-fda7ee4f45c4, client-e2e-aad1cec4-2863-4c21-8033-fda7ee4f45c4", + "traceId": "05b25c81919b4189b1ff6f2650f2176e", + "evidence": { + "orderId": "2085908514250227714" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.501Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8c461c60-7daa-470f-94f0-d1502acfbce9, client-e2e-8c461c60-7daa-470f-94f0-d1502acfbce9", + "traceId": "823a50af80a4485db7a13cf531707bc5", + "evidence": { + "orderId": "2085908514250227714", + "replayed": true + } + }, + { + "module": "order-boundary", + "name": "same idempotency key with different payload is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.544Z", + "durationMs": 29, + "http": 200, + "code": "A0409", + "message": "Idempotency-Key conflicts with a different request", + "requestId": "client-e2e-56629c73-e91c-4ad6-9291-4b574a6d96cd, client-e2e-56629c73-e91c-4ad6-9291-4b574a6d96cd", + "traceId": "f0f789b85bcf44168576a98b4957cc07", + "evidence": { + "orderId": "2085908514250227714", + "rejectionCode": "A0409" + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.573Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0baee404-7422-4424-8a2e-597ac6cbeaab, client-e2e-0baee404-7422-4424-8a2e-597ac6cbeaab", + "traceId": "f448d0d72014485c973a620f1cad02e7", + "evidence": { + "orderId": "2085908514250227714", + "customerRemark": "edited-20260808015832-f9a13c4c" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.635Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-97dee59b-6dda-4323-8f89-3a97682eb632, client-e2e-97dee59b-6dda-4323-8f89-3a97682eb632", + "traceId": "e81a6d16211e4b3fbf18ee55b60672f3", + "evidence": { + "orderId": "2085908514250227714", + "orderNo": "FL2085908514250227714", + "status": "DRAFT", + "cargo": { + "id": "2085908514841624578", + "skuNo": "SKU-ACTIVE-20260808015832-f9a13c4c", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808015832-f9a13c4c", + "referenceId": "REF-ACTIVE-20260808015832-f9a13c4c", + "productImageFileId": "2085908513885323265" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.661Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-84673687-7073-460a-8c8c-4b2b62ad858a, client-e2e-84673687-7073-460a-8c8c-4b2b62ad858a", + "traceId": "5cd69cae99434846a7f6178224e24bfb", + "evidence": { + "total": "1", + "orderId": "2085908514250227714", + "orderNo": "FL2085908514250227714", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.703Z", + "durationMs": 60, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fd0a5ad7-9b20-4ac9-8d90-c4ceaba2d1a5, client-e2e-fd0a5ad7-9b20-4ac9-8d90-c4ceaba2d1a5", + "traceId": "f5875b40627e431cb160a64ac2e5a625", + "evidence": { + "orderId": "2085908514250227714" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.764Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-00a071b0-3e53-472f-8c89-86602f3ee6b0, client-e2e-00a071b0-3e53-472f-8c89-86602f3ee6b0", + "traceId": "d0917706481547f68d6d69283a8bf96b", + "evidence": { + "orderId": "2085908514250227714", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.803Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-396f32d5-fcf9-4196-9d57-0c3c378a2957, client-e2e-396f32d5-fcf9-4196-9d57-0c3c378a2957", + "traceId": "6d442d8299304911874f20499a93e684", + "evidence": { + "orderId": "2085908514250227714", + "orderNo": "FL2085908514250227714", + "status": "SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "submitted order cannot be edited by client", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.830Z", + "durationMs": 57, + "http": 200, + "code": "B0001", + "message": "当前订单状态不允许编辑订单资料", + "requestId": "client-e2e-d56ee169-bf01-4845-9067-fb9bd117f046, client-e2e-d56ee169-bf01-4845-9067-fb9bd117f046", + "traceId": "81cdc65d761842168c0c7dfb8231204d", + "evidence": { + "orderId": "2085908514250227714", + "rejectionCode": "B0001", + "message": "当前订单状态不允许编辑订单资料" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0409\" actual=\"B0001\"" + } + }, + { + "module": "unified-orders", + "name": "unified order list contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.887Z", + "durationMs": 56, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a7b1f6e9-7ceb-4818-ac9a-4e95f0056f9c, client-e2e-a7b1f6e9-7ceb-4818-ac9a-4e95f0056f9c", + "traceId": "d188a98532a84d129e32653149d4efce", + "evidence": { + "total": "1", + "orderId": "2085908514250227714", + "mainStatus": "PENDING_REVIEW", + "internalOrderStatus": "SUBMITTED" + } + }, + { + "module": "unified-orders", + "name": "unified order detail returns timeline", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.943Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4db73daf-dd9a-40e7-83ac-c259b2ad0f9a, client-e2e-4db73daf-dd9a-40e7-83ac-c259b2ad0f9a", + "traceId": "a10556fb28c94208b237dfdfbdc1dabb", + "evidence": { + "orderId": "2085908514250227714", + "mainStatus": "PENDING_REVIEW", + "timelineCount": 3 + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:39.974Z", + "durationMs": 73, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-948b309d-d0aa-45cb-9ce1-499e1f6c56e7, client-e2e-948b309d-d0aa-45cb-9ce1-499e1f6c56e7", + "traceId": "b472f51cf9264198bfc3683318b1cc45", + "evidence": { + "orderId": "2085908516548706305" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.047Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a8f39aed-7dd8-4f34-8dbd-da72f9674bd1, client-e2e-a8f39aed-7dd8-4f34-8dbd-da72f9674bd1", + "traceId": "7f9853a6d934421c932579fd6846278f", + "evidence": { + "orderId": "2085908516548706305" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.088Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9d21d85b-ee4a-40c3-acbe-43d85272c79a, client-e2e-9d21d85b-ee4a-40c3-acbe-43d85272c79a", + "traceId": "cf132e5ee9bb46748b41bc1ff01e5622", + "evidence": { + "orderId": "2085908516548706305", + "status": "CANCELLED" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be cancelled again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.131Z", + "durationMs": 24, + "http": 200, + "code": "A0409", + "message": "该操作已完成,请勿重复提交", + "requestId": "client-e2e-8eda3129-6ed0-4930-9c6a-c4fcb2ec8b74, client-e2e-8eda3129-6ed0-4930-9c6a-c4fcb2ec8b74", + "traceId": "4c6a5307cab84d3ca0eb67ed2315bcd6", + "evidence": { + "orderId": "2085908516548706305", + "rejectionCode": "A0409", + "message": "该操作已完成,请勿重复提交" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be submitted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.155Z", + "durationMs": 44, + "http": 200, + "code": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED", + "requestId": "client-e2e-d40f4b71-dd1a-4b93-8b95-83b12a773e7c, client-e2e-d40f4b71-dd1a-4b93-8b95-83b12a773e7c", + "traceId": "f9f6199f2f2f480093d9c77bf3cb087f", + "evidence": { + "orderId": "2085908516548706305", + "rejectionCode": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "invalid order page size is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.199Z", + "durationMs": 34, + "http": 200, + "code": "A0422", + "message": "size: must be less than or equal to 200", + "requestId": "client-e2e-afb98182-89a6-4b5c-9cb4-013412c59224, client-e2e-afb98182-89a6-4b5c-9cb4-013412c59224", + "traceId": "cca78c0485414c7d850b13edde37b7aa", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.233Z", + "durationMs": 338, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b619d7aa-935d-4099-970f-94b76147c326, client-e2e-b619d7aa-935d-4099-970f-94b76147c326", + "traceId": "0cde7bacc47849d3815bb3b2143edf9d", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.571Z", + "durationMs": 19, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-bb44d3b4-81ed-43dc-83e5-07ab29842ad1, client-e2e-bb44d3b4-81ed-43dc-83e5-07ab29842ad1", + "traceId": "1d9add6f69bf4991bb2d5af7e445a05b", + "evidence": { + "orderId": "2085908514250227714", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client product image access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.590Z", + "durationMs": 31, + "http": 200, + "code": "A0404", + "message": "产品图片不存在", + "requestId": "client-e2e-7f7ac522-9e06-4cb3-ab2c-6037af599f49, client-e2e-7f7ac522-9e06-4cb3-ab2c-6037af599f49", + "traceId": "7b24902cfb874a09b911422801362058", + "evidence": { + "fileId": "2085908513885323265", + "rejectionCode": "A0404" + } + }, + { + "module": "account-security", + "name": "rotate refresh token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.621Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-94e201dd-980a-429b-b839-d3ed662be606, client-e2e-94e201dd-980a-429b-b839-d3ed662be606", + "traceId": "5587f29382d74086ac7433a141f02eaf", + "evidence": { + "rotated": true + } + }, + { + "module": "account-security", + "name": "change owner password to temporary value", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:40.655Z", + "durationMs": 968, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0a39a12b-0963-4bca-ab21-40f18f3b2d19, client-e2e-0a39a12b-0963-4bca-ab21-40f18f3b2d19", + "traceId": "0686375d8c9d4ec8a76cec0195821121", + "evidence": { + "username": "client_20260808015832_a2d2f8", + "passwordChanged": true + } + }, + { + "module": "account-security", + "name": "original password is rejected after change", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:41.623Z", + "durationMs": 325, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-d7c16acc-4195-4870-ae90-9e226e54025c, client-e2e-d7c16acc-4195-4870-ae90-9e226e54025c", + "traceId": "b39875ae823f49af9974400155927325", + "evidence": { + "username": "client_20260808015832_a2d2f8", + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "temporary password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:41.948Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d8926165-e838-4bf4-bf4d-8f95c97db30a, client-e2e-d8926165-e838-4bf4-bf4d-8f95c97db30a", + "traceId": "aed3bc97c35f4cf2bb07f0234a7d871d", + "evidence": { + "username": "client_20260808015832_a2d2f8" + } + }, + { + "module": "account-security", + "name": "restore owner password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:42.281Z", + "durationMs": 970, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-229a5a65-173a-4790-a670-e471e8fce978, client-e2e-229a5a65-173a-4790-a670-e471e8fce978", + "traceId": "b2d5e4358b3a45a59e6662e494acc65c", + "evidence": { + "username": "client_20260808015832_a2d2f8", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "restored owner password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:43.251Z", + "durationMs": 329, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-520ce254-63a9-40ff-ada6-8c755895e79d, client-e2e-520ce254-63a9-40ff-ada6-8c755895e79d", + "traceId": "5b82f46b463d44f6813d12fb17f8b98d", + "evidence": { + "username": "client_20260808015832_a2d2f8", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "logout current client session", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:43.580Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e6ca7043-421d-473f-a0e4-1d4c127be5ba, client-e2e-e6ca7043-421d-473f-a0e4-1d4c127be5ba", + "traceId": "d927deca49e840e1921fcd9944eff91b", + "evidence": { + "username": "client_20260808015832_a2d2f8" + } + }, + { + "module": "account-security", + "name": "logged-out refresh token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:58:43.613Z", + "durationMs": 29, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-d01bcd93-0145-475f-8b89-ec862e6cb961, client-e2e-d01bcd93-0145-475f-8b89-ec862e6cb961", + "traceId": "c7c29f78d588451fa51559c0624295ad", + "evidence": { + "rejectionCode": "A0401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808015936-51d865d1.json b/reports/client-test-env-20260808015936-51d865d1.json new file mode 100644 index 000000000..d9eb26bd6 --- /dev/null +++ b/reports/client-test-env-20260808015936-51d865d1.json @@ -0,0 +1,2280 @@ +{ + "marker": "20260808015936-51d865d1", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T01:59:36.139Z", + "completedAt": "2026-08-08T01:59:47.208Z", + "success": false, + "fatal": null, + "testAccount": { + "username": "client_20260808015936_47687e", + "companyName": "客户端全链路测试企业-20260808015936-51d865d1", + "legalPhone": "13954376140" + }, + "resources": { + "tenantId": "2085908753341337601", + "membershipId": "2085908753341337603", + "reviewId": "2085908757183320066", + "productImageFileId": "2085908780924076034", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085908764397522947", + "orderIds": [ + "2085908756458700802", + "2085908781234454530", + "2085908783268691969" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:36.140Z", + "durationMs": 382, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-738db222-8f5f-423b-9a84-ef03023650b0, client-e2e-738db222-8f5f-423b-9a84-ef03023650b0", + "traceId": "c05e034f2b9f42a4b91260b5e3831915", + "evidence": { + "tenantId": "2085908753341337601", + "membershipId": "2085908753341337603", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:36.522Z", + "durationMs": 31, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-239c5bf6-f950-40a5-ab77-033e2385664e, client-e2e-239c5bf6-f950-40a5-ab77-033e2385664e", + "traceId": "6fc31bca7e184d09bbd390e377587388", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:36.553Z", + "durationMs": 335, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-084674c3-77a9-4b9b-8ac7-30b2565658de, client-e2e-084674c3-77a9-4b9b-8ac7-30b2565658de", + "traceId": "1a10b19b77b54c038372016ab8a8c0d3", + "evidence": { + "username": "client_20260808015936_47687e" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:36.888Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-935a05bd-40cb-40e5-8a84-f9ca916771d4, client-e2e-935a05bd-40cb-40e5-8a84-f9ca916771d4", + "traceId": "2e5b144da1254440b81b696d680c5c81", + "evidence": { + "id": "2085908753341337601", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808015936-51d865d1" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:36.925Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-be4b332e-af5f-4796-9aaa-78336df6ff86, client-e2e-be4b332e-af5f-4796-9aaa-78336df6ff86", + "traceId": "e6a9573a53df4183a37d6efc89be5b65", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:36.952Z", + "durationMs": 67, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f7fd66b8-4441-45d6-a675-e66cdea843d9, client-e2e-f7fd66b8-4441-45d6-a675-e66cdea843d9", + "traceId": "f75870e98031497c9e13d41acad8938a", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.019Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6931db2c-50b0-4c58-97da-ae31898506e2, client-e2e-6931db2c-50b0-4c58-97da-ae31898506e2", + "traceId": "34e60d823f2f4fbabc5ffb372b8f0d71", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.053Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-10e2c24c-4a28-4f47-a7de-a30f70cdfa12, client-e2e-10e2c24c-4a28-4f47-a7de-a30f70cdfa12", + "traceId": "ed68c0b6b0884aa1b66cf2a126e172f8", + "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-08T01:59:37.086Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c9023b9f-ad02-4a65-98d2-25694398e831, client-e2e-c9023b9f-ad02-4a65-98d2-25694398e831", + "traceId": "647fa4cdec474e5885003612e7ed422c", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.114Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-50b0a09f-64f1-4974-b95a-b28dc4c95d1b, client-e2e-50b0a09f-64f1-4974-b95a-b28dc4c95d1b", + "traceId": "7a964f6e010a419ab4369214be488b87", + "evidence": { + "fileId": "2085908756072824834", + "fileName": "product-20260808015936-51d865d1.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.148Z", + "durationMs": 27, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-176288ea-dc26-4ca8-9ab1-39a293f41ff1, client-e2e-176288ea-dc26-4ca8-9ab1-39a293f41ff1", + "traceId": "4f0ce88d1c724d7db8ce2a77c84b7ab4", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.175Z", + "durationMs": 69, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cab708d7-61fe-4f88-b200-7bcecfabb806, client-e2e-cab708d7-61fe-4f88-b200-7bcecfabb806", + "traceId": "abd45656c35a48dfb4a38290829774c3", + "evidence": { + "orderId": "2085908756458700802", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.245Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-053e9f20-fa77-4011-8fef-26a0cd85b444, client-e2e-053e9f20-fa77-4011-8fef-26a0cd85b444", + "traceId": "35165bbd7f1946c0921ad8dbbc2b75ec", + "evidence": { + "orderId": "2085908756458700802", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.272Z", + "durationMs": 36, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-8008adc2-8bce-4ee7-a9d6-68369cc17693, client-e2e-8008adc2-8bce-4ee7-a9d6-68369cc17693", + "traceId": "b5e509125b3547e2afe282972f4de6be", + "evidence": { + "orderId": "2085908756458700802", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.308Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1ab2e8c8-76e1-40b3-a103-e4c15277063d, client-e2e-1ab2e8c8-76e1-40b3-a103-e4c15277063d", + "traceId": "09c2cad3b06f4454985c1693854794c0", + "evidence": { + "businessLicenseQualificationId": "2085908756877135873", + "legalPersonIdQualificationId": "2085908756889718785", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.346Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5f61b8a8-1f9d-4f43-85a5-60309237d018, client-e2e-5f61b8a8-1f9d-4f43-85a5-60309237d018", + "traceId": "123c8d42bee740d09d1809fe3a801f28", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085908756877135873", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085908756889718785", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.374Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a89af42f-1b33-41b1-966d-ee0dad38275a, client-e2e-a89af42f-1b33-41b1-966d-ee0dad38275a", + "traceId": "c9226bfc471444bbb4876cd3a69dacff", + "evidence": { + "tenantId": "2085908753341337601", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.414Z", + "durationMs": 330, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c62b74ce-60cd-4d81-951e-4606077e4b93, client-e2e-c62b74ce-60cd-4d81-951e-4606077e4b93", + "traceId": "d39f4acfbc714771b4cb10a27849c3e5", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.744Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-095566dd-364e-4b23-ba6f-67ad76b6ea7e, client-e2e-095566dd-364e-4b23-ba6f-67ad76b6ea7e", + "traceId": "77696a13accc4d95b15873b0d7d33a77", + "evidence": { + "reviewId": "2085908757183320066", + "tenantId": "2085908753341337601", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.778Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f4317caf-5b3b-4a63-bdd6-6666bee6fb0b, client-e2e-f4317caf-5b3b-4a63-bdd6-6666bee6fb0b", + "traceId": "085c51c904cf4f9a827bdad256c8c2f8", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085908756877135873", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085908756889718785", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.809Z", + "durationMs": 46, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5cbcb12e-b007-44af-8753-5d33d1ab5791, client-e2e-5cbcb12e-b007-44af-8753-5d33d1ab5791", + "traceId": "ca6a5ecabbe147cb9ff46a7209f14c1a", + "evidence": { + "tenantId": "2085908753341337601", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.855Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-888dd422-874f-4857-8ee2-3ec4e092173f, client-e2e-888dd422-874f-4857-8ee2-3ec4e092173f", + "traceId": "1716e5b6121a4dd1b8897db028fca28f", + "evidence": { + "membershipId": "2085908753341337603", + "username": "client_20260808015936_47687e", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:37.891Z", + "durationMs": 330, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ffe054d9-b325-46e9-865a-52105b429584, client-e2e-ffe054d9-b325-46e9-865a-52105b429584", + "traceId": "70a6ceaf469d4457bf05a0bf87f558ac", + "evidence": { + "username": "client_20260808015936_47687e" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.221Z", + "durationMs": 21, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-397bd5df-b730-44c7-a992-bef169ebb1b6, client-e2e-397bd5df-b730-44c7-a992-bef169ebb1b6", + "traceId": "19573df716824f31b7c9dce6e6c3ff3f", + "evidence": { + "id": "2085908753341337601", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808015936-51d865d1" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.242Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-89bb1e3e-3aa7-412a-bd20-c9e1b9c61bbc, client-e2e-89bb1e3e-3aa7-412a-bd20-c9e1b9c61bbc", + "traceId": "0293c8b8e5764f1fa7540dd9a5ef5fe4", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085908756877135873", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085908756889718785", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + } + ] + } + }, + { + "module": "merchant-session", + "name": "preview approved qualification file", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.272Z", + "durationMs": 33, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-c21f7ab4-f658-4b39-a7c9-414ebac102bb, client-e2e-c21f7ab4-f658-4b39-a7c9-414ebac102bb", + "traceId": "6f2f24664f1945feafdb98d545daeea3", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.306Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3bcf6ab2-16bc-403b-925d-f5d7b6ad0b92, client-e2e-3bcf6ab2-16bc-403b-925d-f5d7b6ad0b92", + "traceId": "c748866a2cbf4254a10b3e9a14c35205", + "evidence": { + "id": "2085908753341337601", + "tenantName": "客户端全链路测试企业-20260808015936-51d865d1", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.333Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-80573e2b-826a-43d5-8b52-1566bb24fc12, client-e2e-80573e2b-826a-43d5-8b52-1566bb24fc12", + "traceId": "693b8be728d84d4082a151f8db56cd59", + "evidence": { + "id": "2085908753341337601", + "tenantName": "客户端全链路测试企业-20260808015936-51d865d1-已编辑", + "contactName": "企业联系人-20260808015936-51d865d1", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.372Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8f02d5cd-6937-456d-8980-2017eadbf21e, client-e2e-8f02d5cd-6937-456d-8980-2017eadbf21e", + "traceId": "c58cbd8e759e47cb842744cd27bc7674", + "evidence": { + "id": "2085908753341337601", + "tenantName": "客户端全链路测试企业-20260808015936-51d865d1-已编辑", + "contactEmail": "company_2026080801593651d865d1@example.com" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.394Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-53f686b9-b647-4c3e-8299-ef330ae3d583, client-e2e-53f686b9-b647-4c3e-8299-ef330ae3d583", + "traceId": "0dd6b63a348a4dfeba2725737b6bb4e4", + "evidence": { + "userId": "2085908753341337602", + "username": "client_20260808015936_47687e", + "displayName": "测试管理员-20260808015936-51d865d1" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.426Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c2bc8794-99d8-47ac-914a-1931fffbb4ad, client-e2e-c2bc8794-99d8-47ac-914a-1931fffbb4ad", + "traceId": "eae025c2c9094e2da279ac8c6ffa9f53", + "evidence": { + "userId": "2085908753341337602", + "username": "client_20260808015936_47687e", + "displayName": "测试企业管理员-20260808015936-51d865d1" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.461Z", + "durationMs": 336, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3d2451bd-ef53-44fd-9adc-78edb8eb9a1b, client-e2e-3d2451bd-ef53-44fd-9adc-78edb8eb9a1b", + "traceId": "2acb19e89c1a44d9a0b74c0d094e5ba3", + "evidence": { + "username": "client_20260808015936_47687e" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.797Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1a1e4556-9b8e-48e0-96da-3c6eb6ce16aa, client-e2e-1a1e4556-9b8e-48e0-96da-3c6eb6ce16aa", + "traceId": "aa78b24f80f047749cb03aa58adaaf7c", + "evidence": { + "userId": "2085908753341337602", + "username": "client_20260808015936_47687e", + "displayName": "测试企业管理员-20260808015936-51d865d1" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.819Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5752d4fb-bd63-4219-8ef5-a3a3309c74f3, client-e2e-5752d4fb-bd63-4219-8ef5-a3a3309c74f3", + "traceId": "8f099947fc024fedae9611b576e1c26c", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "menu-permissions", + "name": "load owner effective permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.847Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-df82a4bf-05a7-47db-8298-da38528b2d3b, client-e2e-df82a4bf-05a7-47db-8298-da38528b2d3b", + "traceId": "9f0319bb6f644f1dbd09b6572b975371", + "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-08T01:59:38.881Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-42c7f242-c4ab-41de-ac41-4a666e35f0ce, client-e2e-42c7f242-c4ab-41de-ac41-4a666e35f0ce", + "traceId": "046c55b9ba134ea8b348798381b54b25", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.915Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4f8021dd-8626-4b3b-b34d-72261c589110, client-e2e-4f8021dd-8626-4b3b-b34d-72261c589110", + "traceId": "7a804fa35dd442659ad22733b90baa17", + "evidence": { + "roleId": "2085908763613188097", + "roleCode": "E2E_20260808015936_51d865d1", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:38.946Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-52e937ae-828a-48b8-9a4c-25338e3601d5, client-e2e-52e937ae-828a-48b8-9a4c-25338e3601d5", + "traceId": "0e4dfe6eebb841c48157b5158e3e89ff", + "evidence": { + "roleId": "2085908763613188097", + "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-08T01:59:38.979Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7eaba7ca-699c-45ba-b6c3-350b46fb3619, client-e2e-7eaba7ca-699c-45ba-b6c3-350b46fb3619", + "traceId": "4b218e32786b4c84ae6d155dd57d1e8f", + "evidence": { + "roleId": "2085908763613188097", + "roleName": "订单只读-20260808015936-51d865d1", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.003Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-09a2b1b2-990f-4e0b-bbc5-adf05b824411, client-e2e-09a2b1b2-990f-4e0b-bbc5-adf05b824411", + "traceId": "d438891c4aeb4b888836397a02dd5786", + "evidence": { + "roleId": "2085908763613188097", + "roleName": "订单查询员-20260808015936-51d865d1", + "description": "edited 20260808015936-51d865d1" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.039Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-988ed4a0-7dea-42ab-a930-78a37a14de82, client-e2e-988ed4a0-7dea-42ab-a930-78a37a14de82", + "traceId": "57a59d12f2cc42afb37fd141d018408f", + "evidence": { + "roleId": "2085908763613188097", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.071Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4524f1b4-3c51-4659-a5f5-0542c11cde0d, client-e2e-4524f1b4-3c51-4659-a5f5-0542c11cde0d", + "traceId": "7de1ed4d64e642aabb07c829c285d678", + "evidence": { + "roleId": "2085908763613188097", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.102Z", + "durationMs": 345, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3b6a7373-0180-4f2c-b8c9-4c339a925468, client-e2e-3b6a7373-0180-4f2c-b8c9-4c339a925468", + "traceId": "4a69968178a941219fde6132a4ef3363", + "evidence": { + "membershipId": "2085908764397522947", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085908763613188097" + ] + } + }, + { + "module": "rbac-member", + "name": "duplicate member username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.447Z", + "durationMs": 24, + "http": 200, + "code": "A0409", + "message": "企业成员编号已存在", + "requestId": "client-e2e-209e05e0-f483-4eca-ae7d-be158dabf97f, client-e2e-209e05e0-f483-4eca-ae7d-be158dabf97f", + "traceId": "b334bd5ae15f4f23a7a435cb9a4ddaa3", + "evidence": { + "username": "member_20260808015939_78d45", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "assigned custom role cannot be deleted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.471Z", + "durationMs": 29, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "client-e2e-1997e871-85d4-4a2e-9575-30b3b01d25dd, client-e2e-1997e871-85d4-4a2e-9575-30b3b01d25dd", + "traceId": "071a0af520c6458ba4f10a8737efd086", + "evidence": { + "roleId": "2085908763613188097", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.500Z", + "durationMs": 30, + "http": 200, + "code": "A0403", + "message": "企业所有者不能被停用", + "requestId": "client-e2e-0edea45d-d854-4627-8d96-b8f8e34fc862, client-e2e-0edea45d-d854-4627-8d96-b8f8e34fc862", + "traceId": "c14da39402994daeb844277879d667a8", + "evidence": { + "membershipId": "2085908753341337603", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be edited through member API", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.530Z", + "durationMs": 30, + "http": 200, + "code": "A0403", + "message": "不能通过成员管理接口创建或转让企业所有者", + "requestId": "client-e2e-1f2f83c1-7c96-4da7-ae82-8c1c1f49c32f, client-e2e-1f2f83c1-7c96-4da7-ae82-8c1c1f49c32f", + "traceId": "f9d50d3c65fe4c6d82d5a9c4fcb9cf65", + "evidence": { + "membershipId": "2085908753341337603", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.560Z", + "durationMs": 342, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3ae77d65-d6a9-4221-8614-34c232e1ac9c, client-e2e-3ae77d65-d6a9-4221-8614-34c232e1ac9c", + "traceId": "1d7e8dda7a5b48c5957828bb1f7949ff", + "evidence": { + "username": "member_20260808015939_78d45" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.902Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f22dddc0-1e0e-433e-9251-4d2b06a7911e, client-e2e-f22dddc0-1e0e-433e-9251-4d2b06a7911e", + "traceId": "0278eddeb0714443b53c5919cf621742", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.935Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-60796a76-fe11-418f-ae22-e5e782792794, client-e2e-60796a76-fe11-418f-ae22-e5e782792794", + "traceId": "bae3145f520349da9b7861b72ab96e45", + "evidence": { + "orderId": "2085908756458700802", + "status": "DRAFT" + } + }, + { + "module": "menu-permissions", + "name": "read-only member effective permissions match role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:39.965Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-31d84411-fc28-43b9-b2c3-fb1967ac2e3f, client-e2e-31d84411-fc28-43b9-b2c3-fb1967ac2e3f", + "traceId": "d79517584d0e4859a23de44e1d1a4cc9", + "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-08T01:59:39.993Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f2dbc688-5b9b-4a5f-ab43-54b55b985d4f, client-e2e-f2dbc688-5b9b-4a5f-ab43-54b55b985d4f", + "traceId": "e53ef3e3a2bf4c5287c87ea96056534d", + "evidence": { + "roleId": "2085908763613188097", + "status": "DISABLED" + } + }, + { + "module": "menu-permissions", + "name": "disabled role is reflected by live permission query", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.028Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e32729d5-7016-4223-87be-9bbdf9453ff0, client-e2e-e32729d5-7016-4223-87be-9bbdf9453ff0", + "traceId": "f92b296cb55a4a409ace49e7167743eb", + "evidence": { + "backendPermissions": [], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view" + ] + } + }, + { + "module": "menu-permissions", + "name": "disabled role blocks stale token order access", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.056Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c3892125-456c-4f6c-9822-5bc5fe8194ad, client-e2e-c3892125-456c-4f6c-9822-5bc5fe8194ad", + "traceId": "2ce8dac26b2a477c9a74b100efa60438", + "evidence": { + "rejectionCode": "200", + "message": "success" + }, + "error": { + "name": "Error", + "message": "expected A0401/A0403, actual=200" + } + }, + { + "module": "menu-permissions", + "name": "member login succeeds while role is disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.096Z", + "durationMs": 343, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-91cff4f0-b469-480d-903b-37d4aadef424, client-e2e-91cff4f0-b469-480d-903b-37d4aadef424", + "traceId": "554f873d93de4e3cac7a94a29305692c", + "evidence": { + "username": "member_20260808015939_78d45" + } + }, + { + "module": "menu-permissions", + "name": "disabled role removes member menus and permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.439Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-71c17bb3-0c0b-4c0e-ac8b-c35735ada60f, client-e2e-71c17bb3-0c0b-4c0e-ac8b-c35735ada60f", + "traceId": "20d1ddce441a4ef8bf3af1b57d108b67", + "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-08T01:59:40.475Z", + "durationMs": 29, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-afc0f66d-133b-4217-a556-0857123c3694, client-e2e-afc0f66d-133b-4217-a556-0857123c3694", + "traceId": "ac7084aab73f42bfa4486d863a85c7fe", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "menu-permissions", + "name": "re-enable assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.505Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-72206613-1f3a-41d6-b42d-a36b08d6067b, client-e2e-72206613-1f3a-41d6-b42d-a36b08d6067b", + "traceId": "aa0164aff9cf4e94b422bcfcd599bd14", + "evidence": { + "roleId": "2085908763613188097", + "status": "ACTIVE" + } + }, + { + "module": "menu-permissions", + "name": "member re-login after role is enabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.542Z", + "durationMs": 327, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-73752b41-e6d4-4e9e-aa1d-ced00fbdfec0, client-e2e-73752b41-e6d4-4e9e-aa1d-ced00fbdfec0", + "traceId": "3390e08aa52541d2bc36d8601810ffff", + "evidence": { + "username": "member_20260808015939_78d45" + } + }, + { + "module": "menu-permissions", + "name": "re-enabled role restores member menus", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.869Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0ef9434c-1cd3-4560-9f62-703435be2a1c, client-e2e-0ef9434c-1cd3-4560-9f62-703435be2a1c", + "traceId": "1b1948f89f6c424eabca5e052a763412", + "evidence": { + "backendPermissions": [ + "merchant:order:view", + "merchant:order:list" + ], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.896Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-519d0024-a840-46e4-8108-a5945df44bc1, client-e2e-519d0024-a840-46e4-8108-a5945df44bc1", + "traceId": "2b156b3b73f248d7878a36a1a6b1bbbd", + "evidence": { + "membershipId": "2085908764397522947", + "displayName": "已编辑订单成员-20260808015936-51d865d1", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:40.936Z", + "durationMs": 385, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-82a05ac6-f80e-47bc-96fd-31dd6083af08, client-e2e-82a05ac6-f80e-47bc-96fd-31dd6083af08", + "traceId": "3db0580aa2e34212ab85831b755e8bdd", + "evidence": { + "membershipId": "2085908764397522947" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:41.321Z", + "durationMs": 334, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-86167310-3ba7-4184-82fb-f54a1569e0a1, client-e2e-86167310-3ba7-4184-82fb-f54a1569e0a1", + "traceId": "5222fa4d72da449782106c5ddc281366", + "evidence": { + "username": "member_20260808015939_78d45", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:41.655Z", + "durationMs": 338, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3aa61e54-24c9-43b8-be0f-b8984d8786af, client-e2e-3aa61e54-24c9-43b8-be0f-b8984d8786af", + "traceId": "934212566c5247e7bfb67f22571ed018", + "evidence": { + "username": "member_20260808015939_78d45" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:41.993Z", + "durationMs": 95, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-633d9cb2-eed7-41f6-b2c2-2775d8bfbc3e, client-e2e-633d9cb2-eed7-41f6-b2c2-2775d8bfbc3e", + "traceId": "bd325f58e74145a8b0779eed4edeec9c", + "evidence": { + "membershipId": "2085908764397522947", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.088Z", + "durationMs": 29, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-fd5ad48c-0579-431a-a55c-0825f90a929e, client-e2e-fd5ad48c-0579-431a-a55c-0825f90a929e", + "traceId": "667da7611dfe491cb834a1112234a263", + "evidence": { + "username": "member_20260808015939_78d45", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.117Z", + "durationMs": 95, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cfe71908-4667-4e32-a10d-643bce9258e2, client-e2e-cfe71908-4667-4e32-a10d-643bce9258e2", + "traceId": "d93a54fc006e43e0893285113c34e444", + "evidence": { + "membershipId": "2085908764397522947", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.213Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a58bd354-4ee5-4b2a-9633-fc3201ac17a2, client-e2e-a58bd354-4ee5-4b2a-9633-fc3201ac17a2", + "traceId": "8476eec4dc2d411fac95f915dc36afd8", + "evidence": { + "membershipId": "2085908764397522947", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.249Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-915d8df4-95b2-4327-9549-445c502b1c46, client-e2e-915d8df4-95b2-4327-9549-445c502b1c46", + "traceId": "b304fa6d39394d8d8312dd6b64791642", + "evidence": { + "membershipId": "2085908764397522947", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.273Z", + "durationMs": 27, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-4b84b1a2-b3de-4e04-8ef1-11b1f51760e1", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.300Z", + "durationMs": 337, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3cb88ff4-371f-44eb-82df-003af33fee5c, client-e2e-3cb88ff4-371f-44eb-82df-003af33fee5c", + "traceId": "d6033239ba744d418ba8a78a21d16949", + "evidence": { + "username": "member_20260808015939_78d45" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.637Z", + "durationMs": 25, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-d3611920-1621-4f60-a395-dc6a15dcd41a, client-e2e-d3611920-1621-4f60-a395-dc6a15dcd41a", + "traceId": "a10522bcce9f4e2bb293f0dc6ba9757c", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.662Z", + "durationMs": 95, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-504576f3-6a9e-4a55-a8e6-0ddb9d32ca23, client-e2e-504576f3-6a9e-4a55-a8e6-0ddb9d32ca23", + "traceId": "55ce07db9de34f96b966275b978f0ae6", + "evidence": { + "membershipId": "2085908764397522947", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.758Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c9f2539-20b6-4d51-89f7-32ff9c5726ba, client-e2e-6c9f2539-20b6-4d51-89f7-32ff9c5726ba", + "traceId": "f492124495b44c199fa918df8ba87daa", + "evidence": { + "roleId": "2085908763613188097" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.784Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ef8cbdbf-4904-4a1f-9d0f-7579ee1a6c98, client-e2e-ef8cbdbf-4904-4a1f-9d0f-7579ee1a6c98", + "traceId": "7edb1317650f4deebbb1d2b3c7f96dd6", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.822Z", + "durationMs": 71, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9c4045ee-5982-418f-832a-b856fbbf7f62, client-e2e-9c4045ee-5982-418f-832a-b856fbbf7f62", + "traceId": "b62e959b48c84198b2af04a3e4dac22e", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.893Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1bd315bd-02b5-4ae4-937e-c89dcc37ece3, client-e2e-1bd315bd-02b5-4ae4-937e-c89dcc37ece3", + "traceId": "a447d8be50ce41b2829ce363e3460515", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.928Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4b7ef74a-0835-492d-9803-887f7118687e, client-e2e-4b7ef74a-0835-492d-9803-887f7118687e", + "traceId": "80747cfde33d4f2eba1ca8c59218e640", + "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-08T01:59:42.965Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-35692392-51f5-446b-b8bb-b96cecbcf8be, client-e2e-35692392-51f5-446b-b8bb-b96cecbcf8be", + "traceId": "11e73cbf55474cccab40f58fc032ebbd", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 1", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:42.990Z", + "durationMs": 20, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-fba21635-5aac-44b1-a3bf-abb99d39fdb1, client-e2e-fba21635-5aac-44b1-a3bf-abb99d39fdb1", + "traceId": "9dae36d607b9427fb1cdf18b0b6a208d", + "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-08T01:59:43.010Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7afa12cc-0e89-466d-a3a6-6f3c5f8382c2, client-e2e-7afa12cc-0e89-466d-a3a6-6f3c5f8382c2", + "traceId": "e878d4e188184982894bd96fd80b177d", + "evidence": { + "matched": true, + "destinationWarehouseId": "193000000000000002", + "destinationCode": "ABE3", + "priceBookVersionId": "2085907189707878402", + "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-08T01:59:43.038Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d26c0966-feff-429e-b2b7-ba2f2f65ed3d, client-e2e-d26c0966-feff-429e-b2b7-ba2f2f65ed3d", + "traceId": "895d0f05c02b4df388b1245fa97c64f1", + "evidence": { + "fileId": "2085908780924076034", + "fileName": "product-20260808015936-51d865d1.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.076Z", + "durationMs": 21, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-292d3c37-8aac-4a87-810d-8d89a6261393, client-e2e-292d3c37-8aac-4a87-810d-8d89a6261393", + "traceId": "9ef0cf60544a424ea194e761dfe49188", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.097Z", + "durationMs": 54, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a90b1ae6-1543-4f50-996e-0dfa11ac2482, client-e2e-a90b1ae6-1543-4f50-996e-0dfa11ac2482", + "traceId": "c5859e462b0a488e9dbdcc2e5fb190ce", + "evidence": { + "orderId": "2085908781234454530" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.151Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9eb05cd4-4dca-4c2c-bf2c-8679bcab7dfc, client-e2e-9eb05cd4-4dca-4c2c-bf2c-8679bcab7dfc", + "traceId": "89f1b48ae68e40d69ae7b57ac00debbd", + "evidence": { + "orderId": "2085908781234454530", + "replayed": true + } + }, + { + "module": "order-boundary", + "name": "same idempotency key with different payload is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.180Z", + "durationMs": 32, + "http": 200, + "code": "A0409", + "message": "Idempotency-Key conflicts with a different request", + "requestId": "client-e2e-601f269c-f455-4138-8a25-b038ce8ca6db, client-e2e-601f269c-f455-4138-8a25-b038ce8ca6db", + "traceId": "07be3ab231804ba8ad67f8c42193404e", + "evidence": { + "orderId": "2085908781234454530", + "rejectionCode": "A0409" + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.212Z", + "durationMs": 61, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fd5e7617-e315-499c-bbf0-c8ab53ed68eb, client-e2e-fd5e7617-e315-499c-bbf0-c8ab53ed68eb", + "traceId": "ec57832a1656482bb8c8ca2797db5d89", + "evidence": { + "orderId": "2085908781234454530", + "customerRemark": "edited-20260808015936-51d865d1" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.273Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2559db10-abee-47f3-b671-4aca4f3bb1c6, client-e2e-2559db10-abee-47f3-b671-4aca4f3bb1c6", + "traceId": "1106b6dfe24c4c6bb3ae971a6b757027", + "evidence": { + "orderId": "2085908781234454530", + "orderNo": "FL2085908781234454530", + "status": "DRAFT", + "cargo": { + "id": "2085908781750353922", + "skuNo": "SKU-ACTIVE-20260808015936-51d865d1", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808015936-51d865d1", + "referenceId": "REF-ACTIVE-20260808015936-51d865d1", + "productImageFileId": "2085908780924076034" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.303Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b86f8bf5-fbc3-4691-af87-7dd873f150a6, client-e2e-b86f8bf5-fbc3-4691-af87-7dd873f150a6", + "traceId": "300b6b932b2b4209ab86b7e05b112d50", + "evidence": { + "total": "1", + "orderId": "2085908781234454530", + "orderNo": "FL2085908781234454530", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.334Z", + "durationMs": 64, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0f5ce9ff-449d-4bc3-9c9a-ea473c3637b5, client-e2e-0f5ce9ff-449d-4bc3-9c9a-ea473c3637b5", + "traceId": "6de5450332f64eb7b5895ad448ca8d41", + "evidence": { + "orderId": "2085908781234454530" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.398Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-93f13b1a-cbbb-443c-9285-fae6fc705301, client-e2e-93f13b1a-cbbb-443c-9285-fae6fc705301", + "traceId": "93b0c6ddf2964721b31d472a500c9ddf", + "evidence": { + "orderId": "2085908781234454530", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.430Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4270dedb-29e6-4ab1-bcd2-d1e8f79ea444, client-e2e-4270dedb-29e6-4ab1-bcd2-d1e8f79ea444", + "traceId": "c1532fd1698843feae28bfd777ae2c65", + "evidence": { + "orderId": "2085908781234454530", + "orderNo": "FL2085908781234454530", + "status": "SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "submitted order cannot be edited by client", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.462Z", + "durationMs": 49, + "http": 200, + "code": "B0001", + "message": "当前订单状态不允许编辑订单资料", + "requestId": "client-e2e-be50055f-0b7b-43c9-93ad-2bede91780e6, client-e2e-be50055f-0b7b-43c9-93ad-2bede91780e6", + "traceId": "c179e90d528d4054a2cdb34041cef57b", + "evidence": { + "orderId": "2085908781234454530", + "rejectionCode": "B0001", + "message": "当前订单状态不允许编辑订单资料" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0409\" actual=\"B0001\"" + } + }, + { + "module": "unified-orders", + "name": "unified order list contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.511Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-78cd9e32-6f6a-4647-9c21-38cd4620c520, client-e2e-78cd9e32-6f6a-4647-9c21-38cd4620c520", + "traceId": "799a374f17fd4d04b420a77e9fe434dd", + "evidence": { + "total": "1", + "orderId": "2085908781234454530", + "mainStatus": "PENDING_REVIEW", + "internalOrderStatus": "SUBMITTED" + } + }, + { + "module": "unified-orders", + "name": "unified order detail returns timeline", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.543Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a3455fbd-5ef3-457a-aaa7-515271c09ba9, client-e2e-a3455fbd-5ef3-457a-aaa7-515271c09ba9", + "traceId": "941b08a845544be2861fa748e7f008ea", + "evidence": { + "orderId": "2085908781234454530", + "mainStatus": "PENDING_REVIEW", + "timelineCount": 3 + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.568Z", + "durationMs": 69, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-44452d3f-d774-4278-8879-25b7695927df, client-e2e-44452d3f-d774-4278-8879-25b7695927df", + "traceId": "f323fdde494a4f32b2a4dec5fe1649d7", + "evidence": { + "orderId": "2085908783268691969" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.637Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b9d497cd-e561-4b8f-af73-b9af34815c86, client-e2e-b9d497cd-e561-4b8f-af73-b9af34815c86", + "traceId": "3ccc85a9641a4f439dd02ca486509097", + "evidence": { + "orderId": "2085908783268691969" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.670Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e5cbebbd-10eb-4c5d-acf5-13bebab8fd6a, client-e2e-e5cbebbd-10eb-4c5d-acf5-13bebab8fd6a", + "traceId": "570222679ad440e1822b19a32545ac89", + "evidence": { + "orderId": "2085908783268691969", + "status": "CANCELLED" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be cancelled again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.707Z", + "durationMs": 21, + "http": 200, + "code": "A0409", + "message": "该操作已完成,请勿重复提交", + "requestId": "client-e2e-56eb49eb-5b5e-46e2-9549-efa41815d27a, client-e2e-56eb49eb-5b5e-46e2-9549-efa41815d27a", + "traceId": "1749630fec55453bb742364bc10047d4", + "evidence": { + "orderId": "2085908783268691969", + "rejectionCode": "A0409", + "message": "该操作已完成,请勿重复提交" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be submitted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.728Z", + "durationMs": 39, + "http": 200, + "code": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED", + "requestId": "client-e2e-49ce5b3a-6e4f-4eda-9381-ff8e2142e529, client-e2e-49ce5b3a-6e4f-4eda-9381-ff8e2142e529", + "traceId": "8ea224e0ecd7437ba72d04e95afff7b8", + "evidence": { + "orderId": "2085908783268691969", + "rejectionCode": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "invalid order page size is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.767Z", + "durationMs": 30, + "http": 200, + "code": "A0422", + "message": "size: must be less than or equal to 200", + "requestId": "client-e2e-17a859b6-32d8-49ad-8c28-cc2da92e1872, client-e2e-17a859b6-32d8-49ad-8c28-cc2da92e1872", + "traceId": "1e2be0ab29844d8dbb99da4bc3bae763", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:43.798Z", + "durationMs": 335, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-203d251e-c69d-4982-9b6c-f0f1bd6dde04, client-e2e-203d251e-c69d-4982-9b6c-f0f1bd6dde04", + "traceId": "85301c0304ce4452aefdaab975810eca", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:44.133Z", + "durationMs": 20, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-605a7cd5-c334-470e-ad12-0055b886d596, client-e2e-605a7cd5-c334-470e-ad12-0055b886d596", + "traceId": "da425005df404d1e836f1cbb1b7530b1", + "evidence": { + "orderId": "2085908781234454530", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client product image access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:44.153Z", + "durationMs": 35, + "http": 200, + "code": "A0404", + "message": "产品图片不存在", + "requestId": "client-e2e-258855dc-54d4-461c-bcc8-aa922baa09ab, client-e2e-258855dc-54d4-461c-bcc8-aa922baa09ab", + "traceId": "e17b540f5844432a968edd8e98ade85b", + "evidence": { + "fileId": "2085908780924076034", + "rejectionCode": "A0404" + } + }, + { + "module": "account-security", + "name": "rotate refresh token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:44.188Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5542dd1a-c3eb-4dab-bb59-6156d678f431, client-e2e-5542dd1a-c3eb-4dab-bb59-6156d678f431", + "traceId": "c384de70f0cf4b9bb2ed786e4e108758", + "evidence": { + "rotated": true + } + }, + { + "module": "account-security", + "name": "change owner password to temporary value", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:44.224Z", + "durationMs": 964, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2691bd59-1ab1-404c-817f-3d9c16302962, client-e2e-2691bd59-1ab1-404c-817f-3d9c16302962", + "traceId": "1d4476397aff4326851966714f1a78aa", + "evidence": { + "username": "client_20260808015936_47687e", + "passwordChanged": true + } + }, + { + "module": "account-security", + "name": "original password is rejected after change", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:45.188Z", + "durationMs": 325, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-0bb4011a-3ebc-4206-b757-b77405654e09, client-e2e-0bb4011a-3ebc-4206-b757-b77405654e09", + "traceId": "57da8ed213284bf5ab3a18ba2bfb2b10", + "evidence": { + "username": "client_20260808015936_47687e", + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "temporary password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:45.513Z", + "durationMs": 332, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c4b305d5-1113-475d-aaaa-1a118874b053, client-e2e-c4b305d5-1113-475d-aaaa-1a118874b053", + "traceId": "880a5cb56a4d4a2d91f17a00aa06fd09", + "evidence": { + "username": "client_20260808015936_47687e" + } + }, + { + "module": "account-security", + "name": "restore owner password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:45.845Z", + "durationMs": 966, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0c06c506-9663-443e-b32d-4401c4c85aec, client-e2e-0c06c506-9663-443e-b32d-4401c4c85aec", + "traceId": "b1c722b7c31b4f609d6273a9d653a342", + "evidence": { + "username": "client_20260808015936_47687e", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "restored owner password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:46.811Z", + "durationMs": 325, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-242769c0-b978-4eb5-bf4e-35e405bb4ccf, client-e2e-242769c0-b978-4eb5-bf4e-35e405bb4ccf", + "traceId": "fec716985aea4c4a9c1945748bcd1ad8", + "evidence": { + "username": "client_20260808015936_47687e", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "logout current client session", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:47.136Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c88837d5-dc0c-4f1c-9580-10fda60dc702, client-e2e-c88837d5-dc0c-4f1c-9580-10fda60dc702", + "traceId": "7669a9f0212649b7a669cff1b6f1bb32", + "evidence": { + "username": "client_20260808015936_47687e" + } + }, + { + "module": "account-security", + "name": "logged-out refresh token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T01:59:47.171Z", + "durationMs": 37, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-4d91a07d-22ac-4845-b7c4-940fc6798454, client-e2e-4d91a07d-22ac-4845-b7c4-940fc6798454", + "traceId": "f555bf4d99c54545b0be94cacf899800", + "evidence": { + "rejectionCode": "A0401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808020730-8a52de4e.json b/reports/client-test-env-20260808020730-8a52de4e.json new file mode 100644 index 000000000..3b4858c1f --- /dev/null +++ b/reports/client-test-env-20260808020730-8a52de4e.json @@ -0,0 +1,2722 @@ +{ + "marker": "20260808020730-8a52de4e", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T02:07:30.900Z", + "completedAt": "2026-08-08T02:07:42.815Z", + "success": false, + "fatal": null, + "testAccount": { + "username": "client_20260808020730_74a605", + "companyName": "客户端全链路测试企业-20260808020730-8a52de4e", + "legalPhone": "13954850901" + }, + "resources": { + "tenantId": "2085910744708796417", + "membershipId": "2085910744708796419", + "reviewId": "2085910749377056770", + "productImageFileId": "2085910774262857729", + "enterpriseAddressId": "2085910754062094338", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085910757723721731", + "orderIds": [ + "2085910747905851393", + "2085910775399514113", + "2085910777945456642" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:30.902Z", + "durationMs": 403, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7ec6b128-f13a-421b-95a0-d7ed5837ed04, client-e2e-7ec6b128-f13a-421b-95a0-d7ed5837ed04", + "traceId": "ef73d4e7c87540bd80439e8d2d50566f", + "evidence": { + "tenantId": "2085910744708796417", + "membershipId": "2085910744708796419", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.306Z", + "durationMs": 60, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-7612fd25-af0d-4a3b-a6a7-6fe509405014, client-e2e-7612fd25-af0d-4a3b-a6a7-6fe509405014", + "traceId": "334ef54f67a0401a99aa2726aba89a83", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.367Z", + "durationMs": 330, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0c2ab06f-f3d7-4a1b-9b49-ccaca59b89b4, client-e2e-0c2ab06f-f3d7-4a1b-9b49-ccaca59b89b4", + "traceId": "e1dc5cbfe13b443c9ce20e946488822b", + "evidence": { + "username": "client_20260808020730_74a605" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.698Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-049cdbdb-ba9a-4a5a-829a-a632ef294fe4, client-e2e-049cdbdb-ba9a-4a5a-829a-a632ef294fe4", + "traceId": "dfddcc7abdcb44e7b784226c81e8c564", + "evidence": { + "id": "2085910744708796417", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808020730-8a52de4e" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.729Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ec980d6e-d992-4cfd-b0ea-f7058f7ea487, client-e2e-ec980d6e-d992-4cfd-b0ea-f7058f7ea487", + "traceId": "09d36790cdd844cd93830aada53fa3d4", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.763Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f5841e30-9739-47c1-afa4-23d7ecb59ca4, client-e2e-f5841e30-9739-47c1-afa4-23d7ecb59ca4", + "traceId": "570ad5817b6f4e94bacc0c04e845b20c", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.826Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ebc505c9-6f94-423b-83a8-ab28255e65cc, client-e2e-ebc505c9-6f94-423b-83a8-ab28255e65cc", + "traceId": "4ac9cf52add74fb6bac3df6c69bffe39", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.855Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-41133652-71af-4be9-9b91-3873b82b0af3, client-e2e-41133652-71af-4be9-9b91-3873b82b0af3", + "traceId": "74fa9468a61349e3ae5f5e24c94d4c00", + "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-08T02:07:31.889Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-48277ddb-89f6-4f7d-9857-d43dc5c5b1bd, client-e2e-48277ddb-89f6-4f7d-9857-d43dc5c5b1bd", + "traceId": "32353a6ef57143e58f7ff0993c7840b4", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.916Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ff421704-5668-4004-b20b-2644b9a58379, client-e2e-ff421704-5668-4004-b20b-2644b9a58379", + "traceId": "ee782ea3f542405a93d14fd53f38bd65", + "evidence": { + "fileId": "2085910747499003905", + "fileName": "product-20260808020730-8a52de4e.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.946Z", + "durationMs": 33, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-d88cd940-1f31-4869-a9d3-7abb0702ff66, client-e2e-d88cd940-1f31-4869-a9d3-7abb0702ff66", + "traceId": "6a93043d91ab409baa019c9c596c98a1", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:31.980Z", + "durationMs": 66, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-38853e68-0cb2-4414-837f-8ba8a735f8ff, client-e2e-38853e68-0cb2-4414-837f-8ba8a735f8ff", + "traceId": "2088845743114be0b6a9c01eb0bf15dc", + "evidence": { + "orderId": "2085910747905851393", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.046Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-78517c3d-9947-4905-8233-4784a20eae18, client-e2e-78517c3d-9947-4905-8233-4784a20eae18", + "traceId": "30a14d6625c648c2adcee36ac220cc77", + "evidence": { + "orderId": "2085910747905851393", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.073Z", + "durationMs": 37, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-5f43ff49-114e-4b2c-a711-d6ffdf277625, client-e2e-5f43ff49-114e-4b2c-a711-d6ffdf277625", + "traceId": "8ad0ddc051064de1870d4d32fffa9d86", + "evidence": { + "orderId": "2085910747905851393", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.111Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0c8a5809-5947-4cd7-ab04-f596458b1702, client-e2e-0c8a5809-5947-4cd7-ab04-f596458b1702", + "traceId": "ae990c1ca0bd4af2b84e44be6dfe52cf", + "evidence": { + "businessLicenseQualificationId": "2085910748341063682", + "legalPersonIdQualificationId": "2085910748345257986", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "upload optional qualification FREIGHT_FORWARDER_CERTIFICATE", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.154Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-938c5001-a310-48eb-9906-2fb3152b9bd1, client-e2e-938c5001-a310-48eb-9906-2fb3152b9bd1", + "traceId": "14f8090c29d5433ba88db78cdb91c44f", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "qualificationId": "2085910748534001666", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "upload optional qualification BANK_ACCOUNT_LICENSE", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.198Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2053c423-3d9e-41ce-8833-46f977cb8452, client-e2e-2053c423-3d9e-41ce-8833-46f977cb8452", + "traceId": "676b308d8f8a47a186fc8bd1f101eb21", + "evidence": { + "qualificationType": "BANK_ACCOUNT_LICENSE", + "qualificationId": "2085910748689190913", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "duplicate optional qualification requires explicit replacement", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.230Z", + "durationMs": 39, + "http": 200, + "code": "A0409", + "message": "Qualification type already uploaded / 该类资质已上传", + "requestId": "client-e2e-84c43d91-8bd1-4ae9-a9b1-2a5f7fc42182, client-e2e-84c43d91-8bd1-4ae9-a9b1-2a5f7fc42182", + "traceId": "41e62711dba046bab7262b32f513c847", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "rejectionCode": "A0409" + } + }, + { + "module": "qualification-review", + "name": "replace optional qualification explicitly", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.270Z", + "durationMs": 48, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f73f2cdb-60ca-4b69-b01a-ffcf1314b74b, client-e2e-f73f2cdb-60ca-4b69-b01a-ffcf1314b74b", + "traceId": "74ca41037db94b72b563fc64562200a8", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "qualificationId": "2085910749062483970", + "replaced": true + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.318Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-dda08e1f-3185-481b-8390-b636281f3574, client-e2e-dda08e1f-3185-481b-8390-b636281f3574", + "traceId": "6a5a0a3bf0f34990913c5445e1aa27d3", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085910748341063682", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085910748345257986", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + }, + { + "qualificationId": "2085910748689190913", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085910749062483970", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "PENDING" + }, + { + "qualificationId": "2085910748534001666", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.352Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-aa94b175-4b8c-436a-b8f7-a34651809993, client-e2e-aa94b175-4b8c-436a-b8f7-a34651809993", + "traceId": "5abf61a21ead4d7dba4979e0847d306e", + "evidence": { + "tenantId": "2085910744708796417", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.393Z", + "durationMs": 332, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-53b92c0e-9c36-448e-9ab7-8adbc7ea83c6, client-e2e-53b92c0e-9c36-448e-9ab7-8adbc7ea83c6", + "traceId": "ddd443a037f44aaa96d8e0e573f097b0", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.725Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e999e7b7-a74e-4350-a1e3-684d8555615a, client-e2e-e999e7b7-a74e-4350-a1e3-684d8555615a", + "traceId": "02023dcf096c44f8a0bbaa12af3048a3", + "evidence": { + "reviewId": "2085910749377056770", + "tenantId": "2085910744708796417", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.757Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f2cb9463-5801-4e97-85ba-27a8755d0dce, client-e2e-f2cb9463-5801-4e97-85ba-27a8755d0dce", + "traceId": "15b27b3ba237456fa63cc91f59f8df3d", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085910748341063682", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085910748345257986", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + }, + { + "qualificationId": "2085910748689190913", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085910749062483970", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "PENDING" + }, + { + "qualificationId": "2085910748534001666", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.788Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-565e62cc-fbea-458b-b075-73abfcff71d3, client-e2e-565e62cc-fbea-458b-b075-73abfcff71d3", + "traceId": "1ee0e5d3b52c474592807587b63d19ec", + "evidence": { + "tenantId": "2085910744708796417", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.833Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0867f5bd-a9d8-4c1a-b51e-d8699025d290, client-e2e-0867f5bd-a9d8-4c1a-b51e-d8699025d290", + "traceId": "ee036365d6d54c21bac380902df57abd", + "evidence": { + "membershipId": "2085910744708796419", + "username": "client_20260808020730_74a605", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:32.862Z", + "durationMs": 340, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3ae290be-5392-4123-95df-31e8c01333f3, client-e2e-3ae290be-5392-4123-95df-31e8c01333f3", + "traceId": "7846b74db7e347bab8c9d001945e2682", + "evidence": { + "username": "client_20260808020730_74a605" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.203Z", + "durationMs": 20, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f209a8e8-bca7-4143-942c-50a016968f3d, client-e2e-f209a8e8-bca7-4143-942c-50a016968f3d", + "traceId": "d315a485392b4295b2285b3f6780a691", + "evidence": { + "id": "2085910744708796417", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808020730-8a52de4e" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.223Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-663c2873-a992-4cab-94f7-a0ac1f88b513, client-e2e-663c2873-a992-4cab-94f7-a0ac1f88b513", + "traceId": "b7a5622c866049d58c635e6185267d85", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085910748341063682", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085910748345257986", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + }, + { + "qualificationId": "2085910748689190913", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085910749062483970", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "APPROVED" + }, + { + "qualificationId": "2085910748534001666", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "merchant-session", + "name": "preview approved qualification file", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.255Z", + "durationMs": 32, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-bd484d89-705b-44c7-9ed4-dcd8005f4cf1, client-e2e-bd484d89-705b-44c7-9ed4-dcd8005f4cf1", + "traceId": "ae4e243982ae4bde82854f21d61e687c", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.288Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6b091df9-d74c-4aed-be60-33deea6800f9, client-e2e-6b091df9-d74c-4aed-be60-33deea6800f9", + "traceId": "3bd3702c62544c6294d113d7497733f8", + "evidence": { + "id": "2085910744708796417", + "tenantName": "客户端全链路测试企业-20260808020730-8a52de4e", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.324Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-24a277a7-64ea-4406-ac89-6320242eb88f, client-e2e-24a277a7-64ea-4406-ac89-6320242eb88f", + "traceId": "f1363aa24d2d40aba47373fc75c87b8c", + "evidence": { + "id": "2085910744708796417", + "tenantName": "客户端全链路测试企业-20260808020730-8a52de4e-已编辑", + "contactName": "企业联系人-20260808020730-8a52de4e", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.348Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3347d646-27c7-46cd-9c57-640a5cfb64cd, client-e2e-3347d646-27c7-46cd-9c57-640a5cfb64cd", + "traceId": "450a8b0d29af4ae28cbc9c888e009373", + "evidence": { + "id": "2085910744708796417", + "tenantName": "客户端全链路测试企业-20260808020730-8a52de4e-已编辑", + "contactEmail": "company_202608080207308a52de4e@example.com" + } + }, + { + "module": "profile-validation", + "name": "invalid enterprise contact email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.380Z", + "durationMs": 61, + "http": 200, + "code": "A0422", + "message": "contactEmail: must be a well-formed email address", + "requestId": "client-e2e-32f7aca6-3c34-4464-b898-f949cd47d9e6, client-e2e-32f7aca6-3c34-4464-b898-f949cd47d9e6", + "traceId": "24aa049964a544c3a24c445a969de51e", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-validation", + "name": "blank enterprise address detail is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.442Z", + "durationMs": 42, + "http": 200, + "code": "A0422", + "message": "detail: must not be blank", + "requestId": "client-e2e-0890e90f-9146-4ec1-a03d-e6884cdce1cd, client-e2e-0890e90f-9146-4ec1-a03d-e6884cdce1cd", + "traceId": "53035a774add4ca99c01bf7414ecc612", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-management", + "name": "add enterprise operating address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.484Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e158b477-1f06-41ac-bc77-b3456c0e4609, client-e2e-e158b477-1f06-41ac-bc77-b3456c0e4609", + "traceId": "a3571b4b5b374c48902ef557abf27d14", + "evidence": { + "id": "2085910754062094338", + "addressType": "OPERATING", + "city": "深圳市", + "isDefault": true + } + }, + { + "module": "profile-management", + "name": "enterprise address list contains created address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.513Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1e110b3a-d63d-4f94-a929-29f60aa9b267, client-e2e-1e110b3a-d63d-4f94-a929-29f60aa9b267", + "traceId": "2c49f21dc5b5472db3f33d8f799ee9c7", + "evidence": { + "addressCount": 2, + "addressId": "2085910754062094338" + } + }, + { + "module": "profile-management", + "name": "platform can read created enterprise address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.536Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b901e8d7-c04f-42e9-817e-74a7a8c41325, client-e2e-b901e8d7-c04f-42e9-817e-74a7a8c41325", + "traceId": "1405e984223c47119fba6fb79edff849", + "evidence": { + "addressCount": 2, + "addressId": "2085910754062094338" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.569Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-996e4981-9ef9-4e4c-afd6-ba1f8f8bdc67, client-e2e-996e4981-9ef9-4e4c-afd6-ba1f8f8bdc67", + "traceId": "afe23f04dff640e8a1d547299a72b906", + "evidence": { + "userId": "2085910744708796418", + "username": "client_20260808020730_74a605", + "displayName": "测试管理员-20260808020730-8a52de4e" + } + }, + { + "module": "profile-validation", + "name": "invalid personal email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.598Z", + "durationMs": 27, + "http": 200, + "code": "A0422", + "message": "email: must be a well-formed email address", + "requestId": "client-e2e-a81b6563-d3b0-4d1d-a9f5-2c6ba61f0276, client-e2e-a81b6563-d3b0-4d1d-a9f5-2c6ba61f0276", + "traceId": "57496e3908dc41ffa04da3034e982759", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.626Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a294deb3-bc81-426b-8bf9-9976a95edb96, client-e2e-a294deb3-bc81-426b-8bf9-9976a95edb96", + "traceId": "1f4944b6be934a189d064fddb41dbc56", + "evidence": { + "userId": "2085910744708796418", + "username": "client_20260808020730_74a605", + "displayName": "测试企业管理员-20260808020730-8a52de4e" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.664Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-642da870-22a8-4751-89be-d5f2805a0a79, client-e2e-642da870-22a8-4751-89be-d5f2805a0a79", + "traceId": "ce84487a1fc84f5eb192cd992b1d7d6c", + "evidence": { + "username": "client_20260808020730_74a605" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:33.997Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d041ab80-e70b-4b3a-aaff-577983ea9182, client-e2e-d041ab80-e70b-4b3a-aaff-577983ea9182", + "traceId": "d0c3649f6b7145d4bba2965d14aa5656", + "evidence": { + "userId": "2085910744708796418", + "username": "client_20260808020730_74a605", + "displayName": "测试企业管理员-20260808020730-8a52de4e" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.032Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b397df1d-28ac-4a30-9031-8fc513e5e2dc, client-e2e-b397df1d-28ac-4a30-9031-8fc513e5e2dc", + "traceId": "e803e28b506f4f6f92dd133e31e90608", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "menu-permissions", + "name": "load owner effective permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.062Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ab5180a1-6503-4843-9082-5b31448b8406, client-e2e-ab5180a1-6503-4843-9082-5b31448b8406", + "traceId": "940e3b7b98004ce1b3329de7badca23d", + "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-08T02:07:34.094Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-80dbcc6a-9ec8-4cbb-b8d1-aa94fe1b37e0, client-e2e-80dbcc6a-9ec8-4cbb-b8d1-aa94fe1b37e0", + "traceId": "fd285e6bf3e342b0ac6c8491171a82fa", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.124Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7daab19a-dd5c-4fde-b9c5-092febc4e3bd, client-e2e-7daab19a-dd5c-4fde-b9c5-092febc4e3bd", + "traceId": "e76d8435a6194b33b62aa53d220dadfb", + "evidence": { + "roleId": "2085910756788391938", + "roleCode": "E2E_20260808020730_8a52de4e", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.160Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-429a13ee-8607-475d-ab20-f460b8717907, client-e2e-429a13ee-8607-475d-ab20-f460b8717907", + "traceId": "5e3fbe36dbe749feb0405f82340e9795", + "evidence": { + "roleId": "2085910756788391938", + "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-08T02:07:34.190Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-aee50305-0d4a-4954-a74f-62a0e894cc62, client-e2e-aee50305-0d4a-4954-a74f-62a0e894cc62", + "traceId": "1440bd78641f446c9976a3fa29499136", + "evidence": { + "roleId": "2085910756788391938", + "roleName": "订单只读-20260808020730-8a52de4e", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.219Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-870073fe-5cd0-4419-8157-de00c5c7db0b, client-e2e-870073fe-5cd0-4419-8157-de00c5c7db0b", + "traceId": "62e2751de5684cba8122d99bf2981e53", + "evidence": { + "roleId": "2085910756788391938", + "roleName": "订单查询员-20260808020730-8a52de4e", + "description": "edited 20260808020730-8a52de4e" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.252Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cd4a2872-246a-41a5-bfcf-c1379b1ecef7, client-e2e-cd4a2872-246a-41a5-bfcf-c1379b1ecef7", + "traceId": "d5387a990c024bbf9ba3d194baaf987c", + "evidence": { + "roleId": "2085910756788391938", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.287Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-afe97928-2230-4847-9de8-1499665668ad, client-e2e-afe97928-2230-4847-9de8-1499665668ad", + "traceId": "6e46336e07b74a2b889b97fc22e8a639", + "evidence": { + "roleId": "2085910756788391938", + "status": "ACTIVE" + } + }, + { + "module": "member-validation", + "name": "member with weak password and invalid email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.325Z", + "durationMs": 33, + "http": 200, + "code": "A0422", + "message": "email: must be a well-formed email address;password: 密码必须同时包含字母和数字", + "requestId": "client-e2e-f64e0fbf-e9c0-48b6-b9af-847a0915f2f2, client-e2e-f64e0fbf-e9c0-48b6-b9af-847a0915f2f2", + "traceId": "628bd13f7d1a436896dbbc0c86b2dc99", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.359Z", + "durationMs": 336, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-49aa3019-6fb4-4b47-b9ea-3beb5556c7c4, client-e2e-49aa3019-6fb4-4b47-b9ea-3beb5556c7c4", + "traceId": "a8dd487bf4df4c73b11d7c8824d6e7e6", + "evidence": { + "membershipId": "2085910757723721731", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085910756788391938" + ] + } + }, + { + "module": "rbac-member", + "name": "enterprise member list contains created member and roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.695Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-76ec1758-ec60-4751-8ac2-4d7fe549442f, client-e2e-76ec1758-ec60-4751-8ac2-4d7fe549442f", + "traceId": "65f1dce358b944e3b6acecdd350f8c75", + "evidence": { + "memberCount": 2, + "membershipId": "2085910757723721731" + } + }, + { + "module": "rbac-member", + "name": "enterprise member detail matches created fields and roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.734Z", + "durationMs": 20, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c9436e9c-f8e6-4320-9c33-5e95c2e62cc3, client-e2e-c9436e9c-f8e6-4320-9c33-5e95c2e62cc3", + "traceId": "a4217325d05e41f980e2fcd2cf15e11c", + "evidence": { + "membershipId": "2085910757723721731", + "status": "ACTIVE", + "roleIds": [ + "2085910756788391938" + ] + } + }, + { + "module": "rbac-member", + "name": "duplicate member username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.754Z", + "durationMs": 28, + "http": 200, + "code": "A0409", + "message": "企业成员编号已存在", + "requestId": "client-e2e-1468524c-5f45-4499-a061-4e6346bf61a3, client-e2e-1468524c-5f45-4499-a061-4e6346bf61a3", + "traceId": "cf13472e0186480da8e811963f531f71", + "evidence": { + "username": "member_20260808020734_9f027", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "assigned custom role cannot be deleted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.783Z", + "durationMs": 28, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "client-e2e-d5a30fad-9cbf-40b2-b6b2-f707d5a293cb, client-e2e-d5a30fad-9cbf-40b2-b6b2-f707d5a293cb", + "traceId": "3cb00773bfd343bbb6bacfc1e90a55cf", + "evidence": { + "roleId": "2085910756788391938", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.812Z", + "durationMs": 30, + "http": 200, + "code": "A0403", + "message": "企业所有者不能被停用", + "requestId": "client-e2e-cfda76ba-4574-4cca-a2d9-951df2427cca, client-e2e-cfda76ba-4574-4cca-a2d9-951df2427cca", + "traceId": "ae6b39dc15d14895bac034281bc80515", + "evidence": { + "membershipId": "2085910744708796419", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be edited through member API", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.843Z", + "durationMs": 30, + "http": 200, + "code": "A0403", + "message": "不能通过成员管理接口创建或转让企业所有者", + "requestId": "client-e2e-e9fab834-6d2a-49a6-a077-115a05d72cac, client-e2e-e9fab834-6d2a-49a6-a077-115a05d72cac", + "traceId": "4e883e0533b04d2d9aacd689dbc4774b", + "evidence": { + "membershipId": "2085910744708796419", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:34.873Z", + "durationMs": 335, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ca78c78e-cc84-41df-8f52-5305031dec9a, client-e2e-ca78c78e-cc84-41df-8f52-5305031dec9a", + "traceId": "7e012376f33240b6afa462a6eb435bea", + "evidence": { + "username": "member_20260808020734_9f027" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.210Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7a565d8b-5728-4e9c-a1b2-f757d87b9c8a, client-e2e-7a565d8b-5728-4e9c-a1b2-f757d87b9c8a", + "traceId": "d310c0f651814671af96808d287c56b4", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.258Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b937b94e-28bf-48a2-8250-eb735eb1c7b9, client-e2e-b937b94e-28bf-48a2-8250-eb735eb1c7b9", + "traceId": "c15966a29f6744869c26f59af360018e", + "evidence": { + "orderId": "2085910747905851393", + "status": "DRAFT" + } + }, + { + "module": "menu-permissions", + "name": "read-only member effective permissions match role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.294Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b505f377-bbff-4ba8-9c9a-533c4a51daf7, client-e2e-b505f377-bbff-4ba8-9c9a-533c4a51daf7", + "traceId": "528bf9d8439f4a0cab92e79f327f898d", + "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-08T02:07:35.324Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-68e38123-b799-4d30-94c4-06ba9c236717, client-e2e-68e38123-b799-4d30-94c4-06ba9c236717", + "traceId": "72254ec5bcbd4603bbcf37b576efbf4f", + "evidence": { + "roleId": "2085910756788391938", + "status": "DISABLED" + } + }, + { + "module": "menu-permissions", + "name": "disabled role is reflected by live permission query", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.362Z", + "durationMs": 22, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-887251f8-0638-4360-bab2-80060d8b49cd, client-e2e-887251f8-0638-4360-bab2-80060d8b49cd", + "traceId": "c1913d6d76b04bed96ad9d4b4d264c50", + "evidence": { + "backendPermissions": [], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view" + ] + } + }, + { + "module": "menu-permissions", + "name": "disabled role blocks stale token order access", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.385Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b6f08e81-c01d-47d5-be92-4a542ebd51e3, client-e2e-b6f08e81-c01d-47d5-be92-4a542ebd51e3", + "traceId": "e9cb1266c78a42c5931d8174e3634a4b", + "evidence": { + "rejectionCode": "200", + "message": "success" + }, + "error": { + "name": "Error", + "message": "expected A0401/A0403, actual=200" + } + }, + { + "module": "menu-permissions", + "name": "member login succeeds while role is disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.418Z", + "durationMs": 335, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-88daaa0d-18b7-4c40-a1b6-f243aea069ee, client-e2e-88daaa0d-18b7-4c40-a1b6-f243aea069ee", + "traceId": "adfbe2d788194db1a9ff4f5ce226b39e", + "evidence": { + "username": "member_20260808020734_9f027" + } + }, + { + "module": "menu-permissions", + "name": "disabled role removes member menus and permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.754Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-47fdfd89-4fe6-480b-a6cd-ba0f9c2efb67, client-e2e-47fdfd89-4fe6-480b-a6cd-ba0f9c2efb67", + "traceId": "73b642a6e499421c9c0cea7b0948a973", + "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-08T02:07:35.778Z", + "durationMs": 27, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-3d47deda-3973-497d-b510-03a9415d0786, client-e2e-3d47deda-3973-497d-b510-03a9415d0786", + "traceId": "d0ca0938ad1c44319fc96cc25995b624", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "menu-permissions", + "name": "re-enable assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.805Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cefdf80f-dc4a-43ca-b592-5b2d17db2307, client-e2e-cefdf80f-dc4a-43ca-b592-5b2d17db2307", + "traceId": "a85a7b1d32c149019fb11f20eec84f82", + "evidence": { + "roleId": "2085910756788391938", + "status": "ACTIVE" + } + }, + { + "module": "menu-permissions", + "name": "member re-login after role is enabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:35.842Z", + "durationMs": 329, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e33a6447-9bd7-40e0-ba2c-e7cdb6128663, client-e2e-e33a6447-9bd7-40e0-ba2c-e7cdb6128663", + "traceId": "d6fe606e618045c58d52f80e8ef709f9", + "evidence": { + "username": "member_20260808020734_9f027" + } + }, + { + "module": "menu-permissions", + "name": "re-enabled role restores member menus", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:36.172Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d881d741-a584-4227-b252-0eb6558f952b, client-e2e-d881d741-a584-4227-b252-0eb6558f952b", + "traceId": "1a028774f46a4b32a84c3e134a912f82", + "evidence": { + "backendPermissions": [ + "merchant:order:view", + "merchant:order:list" + ], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:36.207Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-94399e8a-11c1-43f1-823a-415f81149b94, client-e2e-94399e8a-11c1-43f1-823a-415f81149b94", + "traceId": "f0ac9ef62214406aade32196f5eb36c8", + "evidence": { + "membershipId": "2085910757723721731", + "displayName": "已编辑订单成员-20260808020730-8a52de4e", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:36.246Z", + "durationMs": 378, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-505066e5-5a02-425f-9f19-41252fec526e, client-e2e-505066e5-5a02-425f-9f19-41252fec526e", + "traceId": "4888f55db529488e80bada736782167c", + "evidence": { + "membershipId": "2085910757723721731" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:36.624Z", + "durationMs": 323, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-44c55bd5-221f-49ed-a53b-aa6c81808f45, client-e2e-44c55bd5-221f-49ed-a53b-aa6c81808f45", + "traceId": "8d7c91e2ebd842b5bfb4e9e615ed4ef7", + "evidence": { + "username": "member_20260808020734_9f027", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:36.948Z", + "durationMs": 324, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5b304190-4d37-4efe-a33d-e4601b8afafd, client-e2e-5b304190-4d37-4efe-a33d-e4601b8afafd", + "traceId": "4ee76521c1b8449babee405d3122365f", + "evidence": { + "username": "member_20260808020734_9f027" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.274Z", + "durationMs": 100, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e6766a9e-b60e-4d4e-98c2-abf22b6550c8, client-e2e-e6766a9e-b60e-4d4e-98c2-abf22b6550c8", + "traceId": "5b4f5023155344f4b5080985ea122d6a", + "evidence": { + "membershipId": "2085910757723721731", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.375Z", + "durationMs": 20, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-fa6f3952-4169-462d-a2d1-bcf34e1dfacc, client-e2e-fa6f3952-4169-462d-a2d1-bcf34e1dfacc", + "traceId": "7e561567114840b99cdc250978f269c2", + "evidence": { + "username": "member_20260808020734_9f027", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.395Z", + "durationMs": 100, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-dcdaab0d-9af4-4ad0-b731-e9ae51596cb9, client-e2e-dcdaab0d-9af4-4ad0-b731-e9ae51596cb9", + "traceId": "c1ebe1096bc648ecbbe38ff3bd4abfbf", + "evidence": { + "membershipId": "2085910757723721731", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.496Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1be745fa-02d3-4b83-affa-477ade96624c, client-e2e-1be745fa-02d3-4b83-affa-477ade96624c", + "traceId": "4110f14be5d446dcb7efea5b0d80bb48", + "evidence": { + "membershipId": "2085910757723721731", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.526Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-73adff95-4bb0-4aae-911d-e214877dd31d, client-e2e-73adff95-4bb0-4aae-911d-e214877dd31d", + "traceId": "e9d8b19407004dd593e1ab0ab77f366c", + "evidence": { + "membershipId": "2085910757723721731", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.552Z", + "durationMs": 28, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-20af8f31-c2fd-4193-8e5b-58b8211743c9", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.581Z", + "durationMs": 339, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d0745e57-978d-4b6a-b6ba-e62edd601a9c, client-e2e-d0745e57-978d-4b6a-b6ba-e62edd601a9c", + "traceId": "ababade15f3343a1849d476d0940a374", + "evidence": { + "username": "member_20260808020734_9f027" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.921Z", + "durationMs": 21, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-0adba17a-eb82-46a3-ac52-d6d2f3eeb855, client-e2e-0adba17a-eb82-46a3-ac52-d6d2f3eeb855", + "traceId": "3d23e5e840634721b87bee4b345fb8ef", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:37.943Z", + "durationMs": 85, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5c805f1a-b01d-4144-a312-c15ce39f74de, client-e2e-5c805f1a-b01d-4144-a312-c15ce39f74de", + "traceId": "bb370b42adea400faa08d328619f6561", + "evidence": { + "membershipId": "2085910757723721731", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.029Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e4ee332a-46ba-4421-914a-f8ef3ae1ff61, client-e2e-e4ee332a-46ba-4421-914a-f8ef3ae1ff61", + "traceId": "116e450d7d9b40a1897be7004a33f237", + "evidence": { + "roleId": "2085910756788391938" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.063Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4d87b740-1b1c-4262-83e0-1e2c75ec4d69, client-e2e-4d87b740-1b1c-4262-83e0-1e2c75ec4d69", + "traceId": "88ec0381c90c492b8b3d61549a23e210", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.088Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6ad41673-eb0e-43c3-adef-81ef27b86678, client-e2e-6ad41673-eb0e-43c3-adef-81ef27b86678", + "traceId": "b73b116b87c9437f88da40c8b5943e1b", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.140Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-795f74d1-297d-4bef-8f5b-8835034815a4, client-e2e-795f74d1-297d-4bef-8f5b-8835034815a4", + "traceId": "6199f08808ae4ff8a4afa5f5534b9967", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.164Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1db34e7e-63fb-413a-a23c-b91b12fe8b87, client-e2e-1db34e7e-63fb-413a-a23c-b91b12fe8b87", + "traceId": "040025e107f043e3a3352c59ea386dbd", + "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-08T02:07:38.203Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ee0c803f-be4b-486b-ac08-eecee89f41e5, client-e2e-ee0c803f-be4b-486b-ac08-eecee89f41e5", + "traceId": "80aabc8b485d427ba179ac49a1e782f1", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 1", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.227Z", + "durationMs": 30, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-60c9f629-3038-4591-94cb-94ec5f5ed51e, client-e2e-60c9f629-3038-4591-94cb-94ec5f5ed51e", + "traceId": "7f2885239bd64d99824d4f500bd83f85", + "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-08T02:07:38.257Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-07b11440-4a6e-4370-9ffe-f9d30fb9df39, client-e2e-07b11440-4a6e-4370-9ffe-f9d30fb9df39", + "traceId": "693ff053d90944c69786077729fb5dc3", + "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-08T02:07:38.293Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-babb31a0-9d8c-4754-aa1c-20212124d07a, client-e2e-babb31a0-9d8c-4754-aa1c-20212124d07a", + "traceId": "a11b9946eb2045f2b1b73bdac51fb5dd", + "evidence": { + "fileId": "2085910774262857729", + "fileName": "product-20260808020730-8a52de4e.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-08T02:07:38.324Z", + "durationMs": 25, + "http": 200, + "code": "A0400", + "message": "产品图片仅支持JPG、PNG", + "requestId": "client-e2e-3bd56a02-6b86-4502-a8ed-873bd890feb6, client-e2e-3bd56a02-6b86-4502-a8ed-873bd890feb6", + "traceId": "d26baf966ef94aa6bfeefcf50cd234a6", + "evidence": { + "rejectionCode": "A0400", + "message": "产品图片仅支持JPG、PNG" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.350Z", + "durationMs": 30, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-3a60d040-2c17-4f89-80e3-9a567845018d, client-e2e-3a60d040-2c17-4f89-80e3-9a567845018d", + "traceId": "033a9b0e64a74a8299d5c235c92ff72f", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-validation", + "name": "FBA order missing Amazon identifiers is rejected", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.381Z", + "durationMs": 36, + "http": 200, + "code": "B0001", + "message": "FBA orders require Amazon warehouse code, Shipment ID and Reference ID", + "requestId": "client-e2e-544f5718-97e6-49f5-b8c5-12b61746cfed, client-e2e-544f5718-97e6-49f5-b8c5-12b61746cfed", + "traceId": "ab5e44f002704096ae7ffb6bb011828e", + "evidence": { + "rejectionCode": "B0001", + "message": "FBA orders require Amazon warehouse code, Shipment ID and Reference ID" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0422\" actual=\"B0001\"" + } + }, + { + "module": "order-validation", + "name": "FBA cargo missing SKU UPC shipment and reference is rejected", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.418Z", + "durationMs": 26, + "http": 200, + "code": "B0001", + "message": "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID.", + "requestId": "client-e2e-0d256f7e-1d36-474d-ad30-7176e415879f, client-e2e-0d256f7e-1d36-474d-ad30-7176e415879f", + "traceId": "84cdeb69fce54b2e9ca4ee42029a27f9", + "evidence": { + "rejectionCode": "B0001", + "message": "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID." + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0422\" actual=\"B0001\"" + } + }, + { + "module": "order-validation", + "name": "PICKUP order without sender is rejected", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.445Z", + "durationMs": 33, + "http": 200, + "code": "B0001", + "message": "上门提货时必须填写发货信息", + "requestId": "client-e2e-a1795509-c03d-4235-ab52-5d9a095be0ce, client-e2e-a1795509-c03d-4235-ab52-5d9a095be0ce", + "traceId": "23362543d4d2443da372a3d46d12a098", + "evidence": { + "rejectionCode": "B0001", + "message": "上门提货时必须填写发货信息" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0422\" actual=\"B0001\"" + } + }, + { + "module": "order-validation", + "name": "PRIVATE destination without receiver is rejected", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.479Z", + "durationMs": 31, + "http": 200, + "code": "B0001", + "message": "私人地址必须填写收货信息", + "requestId": "client-e2e-17ed2391-6d97-493c-afee-8303943bc40c, client-e2e-17ed2391-6d97-493c-afee-8303943bc40c", + "traceId": "b8dd952f48e84687bb21f063ef293717", + "evidence": { + "rejectionCode": "B0001", + "message": "私人地址必须填写收货信息" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0422\" actual=\"B0001\"" + } + }, + { + "module": "order-validation", + "name": "invalid product image file ID is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.511Z", + "durationMs": 28, + "http": 200, + "code": "A0422", + "message": "产品图片文件ID无效", + "requestId": "client-e2e-03ffe50f-17e7-4561-88aa-e4250c444ce0, client-e2e-03ffe50f-17e7-4561-88aa-e4250c444ce0", + "traceId": "92b0a8de8ec0458ab0772793db887648", + "evidence": { + "rejectionCode": "A0422", + "message": "产品图片文件ID无效" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.540Z", + "durationMs": 61, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fc94b21f-28b8-4607-a079-24fa206acec9, client-e2e-fc94b21f-28b8-4607-a079-24fa206acec9", + "traceId": "bbe0cca7f6df45c39fe2a25d136921e2", + "evidence": { + "orderId": "2085910775399514113" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.601Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-77e20014-ec48-4b75-bf43-9269fb79581d, client-e2e-77e20014-ec48-4b75-bf43-9269fb79581d", + "traceId": "9175a58a7614477295cba0bba2c82d53", + "evidence": { + "orderId": "2085910775399514113", + "replayed": true + } + }, + { + "module": "order-boundary", + "name": "same idempotency key with different payload is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.636Z", + "durationMs": 28, + "http": 200, + "code": "A0409", + "message": "Idempotency-Key conflicts with a different request", + "requestId": "client-e2e-b5c94620-5c63-4e8d-8032-326adb10cb9d, client-e2e-b5c94620-5c63-4e8d-8032-326adb10cb9d", + "traceId": "c048d0e0f0eb47a59ca7be1e0694471f", + "evidence": { + "orderId": "2085910775399514113", + "rejectionCode": "A0409" + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.665Z", + "durationMs": 65, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7f16cf3f-ab09-4521-96de-914d585723f6, client-e2e-7f16cf3f-ab09-4521-96de-914d585723f6", + "traceId": "2d63b49577214e329ca069fe0de5ef02", + "evidence": { + "orderId": "2085910775399514113", + "customerRemark": "edited-20260808020730-8a52de4e" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.730Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9c9535cc-b956-45bc-a3a4-01b8565262e2, client-e2e-9c9535cc-b956-45bc-a3a4-01b8565262e2", + "traceId": "0744a5c84dd544a0bdac4509256976c7", + "evidence": { + "orderId": "2085910775399514113", + "orderNo": "FL2085910775399514113", + "status": "DRAFT", + "cargo": { + "id": "2085910775944773634", + "skuNo": "SKU-ACTIVE-20260808020730-8a52de4e", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808020730-8a52de4e", + "referenceId": "REF-ACTIVE-20260808020730-8a52de4e", + "productImageFileId": "2085910774262857729" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.757Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-aa206387-25de-48dc-b6dc-4ae9a1bdba0b, client-e2e-aa206387-25de-48dc-b6dc-4ae9a1bdba0b", + "traceId": "fcb66284cf154ef1ab2c2633d3ffb5ba", + "evidence": { + "total": "1", + "orderId": "2085910775399514113", + "orderNo": "FL2085910775399514113", + "status": "DRAFT" + } + }, + { + "module": "order-filters", + "name": "order keyword filter finds draft by order number", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.799Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-86237cc8-a619-44d2-bd44-69338bbcee7a, client-e2e-86237cc8-a619-44d2-bd44-69338bbcee7a", + "traceId": "ca19796c7ee64286a01051af5e79c3bb", + "evidence": { + "total": "1", + "orderId": "2085910775399514113" + } + }, + { + "module": "order-filters", + "name": "DRAFT status filter contains draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.843Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-92b5e47b-5a0a-42c4-a5d6-f7899a740300, client-e2e-92b5e47b-5a0a-42c4-a5d6-f7899a740300", + "traceId": "37078cb710f14e73a3fea3d74d7c72b8", + "evidence": { + "total": "2", + "orderId": "2085910775399514113", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.874Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b37cc6ad-dcdc-4377-b2b4-a5d3a0d6ea9b, client-e2e-b37cc6ad-dcdc-4377-b2b4-a5d3a0d6ea9b", + "traceId": "aad9155c43b042e2a4439b83b04dd536", + "evidence": { + "orderId": "2085910775399514113" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.928Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-63e90c7b-be91-477c-8de7-9f2b0981bc8f, client-e2e-63e90c7b-be91-477c-8de7-9f2b0981bc8f", + "traceId": "ab761910859f448b87b34b5eba84f67d", + "evidence": { + "orderId": "2085910775399514113", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.960Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bdfac3c8-5fda-4b5b-9bae-62b8ec95b5ef, client-e2e-bdfac3c8-5fda-4b5b-9bae-62b8ec95b5ef", + "traceId": "ccd03d1977eb4aa4990d2b050139daf8", + "evidence": { + "orderId": "2085910775399514113", + "orderNo": "FL2085910775399514113", + "status": "SUBMITTED" + } + }, + { + "module": "order-filters", + "name": "SUBMITTED status filter contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:38.990Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c878237b-eaea-4766-9f88-221081d0e227, client-e2e-c878237b-eaea-4766-9f88-221081d0e227", + "traceId": "0e35d3ed23e54d00a0b6745f551d9dab", + "evidence": { + "total": "1", + "orderId": "2085910775399514113", + "status": "SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "submitted order cannot be edited by client", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.028Z", + "durationMs": 39, + "http": 200, + "code": "B0001", + "message": "当前订单状态不允许编辑订单资料", + "requestId": "client-e2e-e53fbc8b-c039-4117-84e9-2a7d514640b6, client-e2e-e53fbc8b-c039-4117-84e9-2a7d514640b6", + "traceId": "401defada71c49cf8fc5bef044ed335b", + "evidence": { + "orderId": "2085910775399514113", + "rejectionCode": "B0001", + "message": "当前订单状态不允许编辑订单资料" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"A0409\" actual=\"B0001\"" + } + }, + { + "module": "unified-orders", + "name": "unified order list contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.068Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-61435fcf-a17a-4927-848b-7490639612bc, client-e2e-61435fcf-a17a-4927-848b-7490639612bc", + "traceId": "d511c326aa194826a4bb62fd0416b5ae", + "evidence": { + "total": "1", + "orderId": "2085910775399514113", + "mainStatus": "PENDING_REVIEW", + "internalOrderStatus": "SUBMITTED" + } + }, + { + "module": "unified-orders", + "name": "unified order detail returns timeline", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.106Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-220fa00a-f5bf-46e1-9fa2-3cab7dbffdee, client-e2e-220fa00a-f5bf-46e1-9fa2-3cab7dbffdee", + "traceId": "99eabc257bbd4bf7a84aa3316eb85720", + "evidence": { + "orderId": "2085910775399514113", + "mainStatus": "PENDING_REVIEW", + "timelineCount": 3 + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.147Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4f61bd85-6c9b-4c90-b304-7208be40c4f9, client-e2e-4f61bd85-6c9b-4c90-b304-7208be40c4f9", + "traceId": "5262a592c7154b15a28bdcaad37a4bc2", + "evidence": { + "orderId": "2085910777945456642" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.209Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1d5cc751-f78b-4324-9467-95157c03257c, client-e2e-1d5cc751-f78b-4324-9467-95157c03257c", + "traceId": "d20bafc673324ae48c9ceee6706efcbd", + "evidence": { + "orderId": "2085910777945456642" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.245Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-76ee366f-b278-4af7-945a-84bb42f421dd, client-e2e-76ee366f-b278-4af7-945a-84bb42f421dd", + "traceId": "677de583f8174c2fb424dac108c25dbd", + "evidence": { + "orderId": "2085910777945456642", + "status": "CANCELLED" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be cancelled again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.284Z", + "durationMs": 34, + "http": 200, + "code": "A0409", + "message": "该操作已完成,请勿重复提交", + "requestId": "client-e2e-a9ef41c5-c89a-445b-9049-d3d3cb9b6e20, client-e2e-a9ef41c5-c89a-445b-9049-d3d3cb9b6e20", + "traceId": "589d4972d195413888793284e2473cbd", + "evidence": { + "orderId": "2085910777945456642", + "rejectionCode": "A0409", + "message": "该操作已完成,请勿重复提交" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be submitted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.319Z", + "durationMs": 26, + "http": 200, + "code": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED", + "requestId": "client-e2e-94bdb2b3-2d9a-4d24-a0c6-1b8381264d80, client-e2e-94bdb2b3-2d9a-4d24-a0c6-1b8381264d80", + "traceId": "b838b3a9a74e41ac8615f7cd8f53d471", + "evidence": { + "orderId": "2085910777945456642", + "rejectionCode": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "invalid order page size is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.346Z", + "durationMs": 18, + "http": 200, + "code": "A0422", + "message": "size: must be less than or equal to 200", + "requestId": "client-e2e-5c434b56-e36b-4deb-95bc-14e2210d1599, client-e2e-5c434b56-e36b-4deb-95bc-14e2210d1599", + "traceId": "f6f7d38ca08840d1a86eed3a5ccc821d", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.365Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d3de5a79-14f4-4d13-b389-9feefa7419f9, client-e2e-d3de5a79-14f4-4d13-b389-9feefa7419f9", + "traceId": "2c5dd8fddddd4ff1a944c1213393b460", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.699Z", + "durationMs": 29, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-1acf7eec-99ee-4f06-9410-6825cbe97088, client-e2e-1acf7eec-99ee-4f06-9410-6825cbe97088", + "traceId": "9f153bac4b3d45ab916f92f1bd8a1a34", + "evidence": { + "orderId": "2085910775399514113", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client product image access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.729Z", + "durationMs": 50, + "http": 200, + "code": "A0404", + "message": "产品图片不存在", + "requestId": "client-e2e-46af6fd4-0c05-4f26-8122-0c9142d8133d, client-e2e-46af6fd4-0c05-4f26-8122-0c9142d8133d", + "traceId": "7a44aa042def4b7e913b225d58e6d0d0", + "evidence": { + "fileId": "2085910774262857729", + "rejectionCode": "A0404" + } + }, + { + "module": "account-security", + "name": "rotate refresh token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.780Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5f4fe7da-0073-4313-934d-11d74785638f, client-e2e-5f4fe7da-0073-4313-934d-11d74785638f", + "traceId": "c2c867d8b27240ef9ac3040593e7a2ac", + "evidence": { + "rotated": true + } + }, + { + "module": "account-security", + "name": "change owner password to temporary value", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:39.814Z", + "durationMs": 973, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-88bd310e-4574-4677-935e-0868228aee59, client-e2e-88bd310e-4574-4677-935e-0868228aee59", + "traceId": "983c914b11404c5ea0019ba35f480c6e", + "evidence": { + "username": "client_20260808020730_74a605", + "passwordChanged": true + } + }, + { + "module": "account-security", + "name": "original password is rejected after change", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:40.787Z", + "durationMs": 325, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-3bb728bc-cc12-4dce-a69d-1bc595f40c70, client-e2e-3bb728bc-cc12-4dce-a69d-1bc595f40c70", + "traceId": "5381e21d3b4248f3828b96ab0c286d6d", + "evidence": { + "username": "client_20260808020730_74a605", + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "temporary password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:41.113Z", + "durationMs": 338, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-605d8267-abf4-45e3-8cc9-b2aa15459680, client-e2e-605d8267-abf4-45e3-8cc9-b2aa15459680", + "traceId": "8aa7fc39e6954ed8875dce2ff17e738b", + "evidence": { + "username": "client_20260808020730_74a605" + } + }, + { + "module": "account-security", + "name": "restore owner password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:41.452Z", + "durationMs": 982, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9ba0eb4b-9f9a-4dab-8412-6e11c4ac4a68, client-e2e-9ba0eb4b-9f9a-4dab-8412-6e11c4ac4a68", + "traceId": "f7823f6472334688b1159fe128943147", + "evidence": { + "username": "client_20260808020730_74a605", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "restored owner password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:42.434Z", + "durationMs": 331, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1cdb35a9-a303-41cc-814c-bb21a340ad95, client-e2e-1cdb35a9-a303-41cc-814c-bb21a340ad95", + "traceId": "0ba911cee61f4d3887ca27972b9ae772", + "evidence": { + "username": "client_20260808020730_74a605", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "logout current client session", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:42.766Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a7010ba0-6d49-4001-bf63-047fb22dfae2, client-e2e-a7010ba0-6d49-4001-bf63-047fb22dfae2", + "traceId": "731e33b1d5554794b89e0c1784779f77", + "evidence": { + "username": "client_20260808020730_74a605" + } + }, + { + "module": "account-security", + "name": "logged-out refresh token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T02:07:42.798Z", + "durationMs": 17, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-14bc6bf1-49a2-4e40-bae4-d20a31a1e8be, client-e2e-14bc6bf1-49a2-4e40-bae4-d20a31a1e8be", + "traceId": "322d22e499ac42489598bcb241548ae7", + "evidence": { + "rejectionCode": "A0401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/scripts/admin-test-env-acceptance.mjs b/scripts/admin-test-env-acceptance.mjs new file mode 100644 index 000000000..66b84b3d0 --- /dev/null +++ b/scripts/admin-test-env-acceptance.mjs @@ -0,0 +1,448 @@ +#!/usr/bin/env node + +// Test environment administrator / 测试环境管理员 +// Username: platform_admin +// Password: ChangeMe123! + +import { mkdir, readFile, writeFile } from 'node:fs/promises' +import { dirname, resolve } from 'node:path' +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 WEIGHT_IMAGE_PATH = 'C:/Users/BY-OY/Desktop/上传图片包/测量图片/测量图片/orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG' +const CUSTOMER_FIELDS = [ + 'id', 'tenantCode', 'tenantName', 'status', 'legalName', 'legalRepresentative', + 'contactName', 'contactPhone', 'contactEmail', 'contactWechat', + 'servicePackage', 'salesOwnerName', 'paymentTermDays', 'enterpriseType', 'establishedDate', + 'registeredCapital', 'registeredCapitalCurrency', 'registeredAddress', 'internalRemark', + 'createdAt', +] +const BOX_DEFAULTS = [ + { boxType: 'SMALL', dimensions: ['30.000', '20.000', '20.000'], remark: '标准小箱' }, + { boxType: 'MEDIUM', dimensions: ['40.000', '30.000', '30.000'], remark: '标准中箱' }, + { boxType: 'LARGE', dimensions: ['50.000', '40.000', '40.000'], remark: '标准大箱' }, + { boxType: 'EXTRA_LARGE', dimensions: ['60.000', '50.000', '50.000'], remark: '特大箱' }, +] + +function usage() { + console.log(`后台管理测试环境 HTTP API 验收 + +测试管理员: ${DEFAULT_USERNAME} / ${DEFAULT_PASSWORD} + +用法: + node scripts/admin-test-env-acceptance.mjs [options] + +选项: + --gateway Gateway 地址,默认 ${DEFAULT_GATEWAY} + --username 管理员账号,默认 ${DEFAULT_USERNAME} + --password 管理员密码,默认使用上方测试密码 + --modules 逗号分隔,默认 ${DEFAULT_MODULES.join(',')} + --output JSON 报告路径,默认 reports/ + --help 显示帮助 + +环境变量覆盖: ADMIN_TEST_GATEWAY, ADMIN_TEST_USERNAME, ADMIN_TEST_PASSWORD`) +} + +function parseArguments(argv) { + if (argv.includes('--help')) { usage(); process.exit(0) } + const values = new Map() + for (let index = 0; index < argv.length; index += 1) { + const argument = argv[index] + if (!argument.startsWith('--')) throw new Error(`无法识别的参数: ${argument}`) + const separator = argument.indexOf('=') + const name = separator >= 0 ? argument.slice(2, separator) : argument.slice(2) + const inline = separator >= 0 ? argument.slice(separator + 1) : undefined + if (inline !== undefined) values.set(name, inline) + else { + const next = argv[index + 1] + if (!next || next.startsWith('--')) throw new Error(`参数 --${name} 缺少值`) + values.set(name, next); index += 1 + } + } + return { + gateway: (values.get('gateway') || process.env.ADMIN_TEST_GATEWAY || DEFAULT_GATEWAY).replace(/\/$/, ''), + username: values.get('username') || process.env.ADMIN_TEST_USERNAME || DEFAULT_USERNAME, + password: values.get('password') || process.env.ADMIN_TEST_PASSWORD || DEFAULT_PASSWORD, + modules: (values.get('modules') || DEFAULT_MODULES.join(',')).split(',').map((v) => v.trim()).filter(Boolean), + output: values.get('output') || '', + } +} + +function own(value, field) { return value !== null && typeof value === 'object' && Object.hasOwn(value, field) } +function hasFields(value, fields) { return fields.every((field) => own(value, field)) } +function numberEquals(actual, expected) { return Math.abs(Number(actual) - Number(expected)) < 0.0005 } +function halfUp3(value) { return Math.round((Number(value) + Number.EPSILON) * 1000) / 1000 } +function derived(length, width, height, edge) { + const outerLength = Number(length) + Number(edge) * 2 + const outerWidth = Number(width) + Number(edge) * 2 + const outerHeight = Number(height) + Number(edge) * 2 + return { outerLength, outerWidth, outerHeight, volume: halfUp3(outerLength * outerWidth * outerHeight / 1_000_000) } +} + +class AcceptanceRun { + constructor(options) { + this.options = options + this.marker = `ADMIN-API-${new Date().toISOString().replace(/\D/g, '').slice(0, 17)}` + this.startedAt = new Date().toISOString() + this.steps = [] + this.modules = [] + this.scenarios = [] + this.createdResources = {} + this.deploymentBlockers = [] + this.context = {} + this.token = '' + this.fatal = null + } + + async request(method, path, body = undefined, token = this.token) { + const headers = { Accept: 'application/json' } + if (token) headers.Authorization = `Bearer ${token}` + if (body !== undefined) headers['Content-Type'] = 'application/json; charset=utf-8' + try { + const response = await fetch(`${this.options.gateway}${path}`, { + method, headers, body: body === undefined ? undefined : JSON.stringify(body), + signal: AbortSignal.timeout(30_000), + }) + const content = await response.text() + let payload = null + try { payload = content ? JSON.parse(content) : null } catch { /* Raw response is recorded below. */ } + return { + method, path, http: response.status, body: payload, + raw: payload === null ? content.slice(0, 500) : null, + requestId: payload?.requestId || response.headers.get('x-request-id'), + traceId: payload?.traceId || response.headers.get('x-trace-id'), + } + } catch (error) { + return { method, path, http: 0, body: null, raw: error instanceof Error ? error.message : String(error), requestId: null, traceId: null } + } + } + + async requestBinary(method, path) { + const headers = { Accept: '*/*', Authorization: `Bearer ${this.token}` } + try { + const response = await fetch(`${this.options.gateway}${path}`, { method, headers, signal: AbortSignal.timeout(120_000) }) + const bytes = new Uint8Array(await response.arrayBuffer()) + const contentType = response.headers.get('content-type') || '' + let payload = null + if (contentType.toLowerCase().includes('json')) { + try { payload = JSON.parse(new TextDecoder().decode(bytes)) } catch { /* Invalid envelope remains binary evidence. */ } + } + return { + method, path, http: response.status, body: payload, bytes, contentType, + raw: payload ? null : `${bytes.length} bytes (${contentType || 'unknown'})`, + requestId: payload?.requestId || response.headers.get('x-request-id'), + traceId: payload?.traceId || response.headers.get('x-trace-id'), + } + } catch (error) { + return { method, path, http: 0, body: null, bytes: new Uint8Array(), contentType: '', raw: String(error), requestId: null, traceId: null } + } + } + + addStep(module, name, response, passed, evidence = '', options = {}) { + const step = { + module, scenario: options.scenario || null, name, passed: Boolean(passed), + deploymentBlocker: Boolean(options.deploymentBlocker && !passed), + request: response ? { method: response.method, path: response.path } : null, + http: response?.http ?? null, + code: response?.body?.code === undefined ? null : String(response.body.code), + message: response?.body?.message || response?.raw || null, + requestId: response?.requestId || null, traceId: response?.traceId || null, + evidence, checkedAt: new Date().toISOString(), + } + this.steps.push(step) + if (step.deploymentBlocker) this.deploymentBlockers.push({ module, scenario: step.scenario, name, evidence, code: step.code, requestId: step.requestId, traceId: step.traceId }) + console.log(`[${step.passed ? 'PASS' : 'FAIL'}] [${module}${step.scenario ? `/${step.scenario}` : ''}] ${name}${evidence ? ` - ${evidence}` : ''}`) + return step.passed + } + + apiSuccess(module, name, response, evidence = '', options = {}) { + const passed = response.http === 200 && String(response.body?.code) === '200' + this.addStep(module, name, response, passed, evidence, options) + return passed ? response.body.data : null + } + + assert(module, name, response, condition, evidence, options = {}) { + return this.addStep(module, name, response, Boolean(condition), evidence, options) + } + + expectConflict(module, name, response, scenario) { + const passed = response.http === 200 && ['A0409', '409'].includes(String(response.body?.code)) + this.addStep(module, name, response, passed, `HTTP=${response.http}, code=${response.body?.code ?? 'missing'}`, { scenario, deploymentBlocker: true }) + return passed + } + + async executeModule(name, handler) { + const startedAt = new Date().toISOString(); const start = this.steps.length; let fatal = null + try { await handler() } catch (error) { + fatal = error instanceof Error ? error.message : String(error) + this.addStep(name, '模块执行', null, false, fatal) + } + const steps = this.steps.slice(start) + this.modules.push({ name, startedAt, finishedAt: new Date().toISOString(), success: fatal === null && steps.every((s) => s.passed), passed: steps.filter((s) => s.passed).length, failed: steps.filter((s) => !s.passed).length, fatal }) + } + + async findAvailablePhone(module = 'customers') { + const seed = BigInt(Date.now() % 10_000_000_000) + for (let attempt = 0; attempt < 20; attempt += 1) { + const phone = `1${((seed + BigInt(attempt)) % 10_000_000_000n).toString().padStart(10, '0')}` + const response = await this.request('GET', `/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=${phone}`) + if (this.apiSuccess(module, '检查测试联系电话可用性', response, `attempt=${attempt + 1}`) === true) return phone + } + throw new Error('连续 20 个测试联系电话均不可用') + } + + async runCustomerDimensionRules(tenantId) { + const module = 'customers'; const scenario = 'customer-dimension-rules'; const start = this.steps.length + const options = { scenario, deploymentBlocker: true } + const path = `/api/platform/v1/first-leg/customer-dimension-config?tenantId=${tenantId}` + const initialResponse = await this.request('GET', path) + const group = this.apiSuccess(module, '新客户尺寸规则可查询', initialResponse, `tenantId=${tenantId}`, options) + const rules = Array.isArray(group?.rules) ? group.rules : [] + const orderedTypes = rules.map((rule) => rule.boxType) + this.assert(module, '固定四箱规顺序完整且无重复', initialResponse, + rules.length === 4 && orderedTypes.join(',') === BOX_DEFAULTS.map((item) => item.boxType).join(',') && new Set(orderedTypes).size === 4, + `count=${rules.length}, order=${orderedTypes.join(',')}`, options) + + const defaultsCorrect = BOX_DEFAULTS.every((expected, index) => { + const rule = rules[index] + return rule?.boxType === expected.boxType + && numberEquals(rule.innerLengthCm, expected.dimensions[0]) + && numberEquals(rule.innerWidthCm, expected.dimensions[1]) + && numberEquals(rule.innerHeightCm, expected.dimensions[2]) + && numberEquals(rule.edgeAdditionCm, '2.000') && rule.remark === expected.remark + }) + this.assert(module, '四箱规默认内径、加边和备注正确', initialResponse, defaultsCorrect, + defaultsCorrect ? 'defaults=matched' : '默认尺寸、edge 或备注不匹配', options) + + const identityCorrect = typeof group?.tenantId === 'string' && group.tenantId === tenantId + && rules.length === 4 && rules.every((rule) => typeof rule.id === 'string' && Number(rule.version) === 0) + this.assert(module, '客户 ID、规则 ID 为字符串且初始版本为0', initialResponse, identityCorrect, + `groupTenantIdType=${typeof group?.tenantId}, rows=${rules.map((r) => `${typeof r.id}/v${r.version}`).join(',')}`, options) + + const initialDerivedCorrect = rules.length === 4 && rules.every((rule) => { + const value = derived(rule.innerLengthCm, rule.innerWidthCm, rule.innerHeightCm, rule.edgeAdditionCm) + return numberEquals(rule.outerLengthCm, value.outerLength) && numberEquals(rule.outerWidthCm, value.outerWidth) + && numberEquals(rule.outerHeightCm, value.outerHeight) && numberEquals(rule.volumeCbm, value.volume) + }) + this.assert(module, '默认规则外径与 HALF_UP 三位 CBM 正确', initialResponse, initialDerivedCorrect, + `derivedRows=${rules.length}`, options) + + if (rules.length === 4) { + const updatePayload = { rules: rules.map((rule, index) => ({ + boxType: rule.boxType, + innerLengthCm: Number((Number(rule.innerLengthCm) + index + 0.125).toFixed(3)), + innerWidthCm: Number((Number(rule.innerWidthCm) + index + 0.250).toFixed(3)), + innerHeightCm: Number((Number(rule.innerHeightCm) + index + 0.375).toFixed(3)), + edgeAdditionCm: Number((2.125 + index * 0.125).toFixed(3)), + remark: `${this.marker}-${rule.boxType}`, + version: Number(rule.version), + })) } + const allowed = ['boxType', 'innerLengthCm', 'innerWidthCm', 'innerHeightCm', 'edgeAdditionCm', 'remark', 'version'] + this.assert(module, 'PUT 每行只发送约定7字段并整组保存', initialResponse, + updatePayload.rules.length === 4 && updatePayload.rules.every((row) => Object.keys(row).join(',') === allowed.join(',')), + `fields=${Object.keys(updatePayload.rules[0]).join(',')}`, options) + + const updateResponse = await this.request('PUT', path, updatePayload) + const updatedGroup = this.apiSuccess(module, '一次 PUT 保存四条三位小数规则', updateResponse, 'rows=4', options) + const updatedRules = Array.isArray(updatedGroup?.rules) ? updatedGroup.rules : [] + const updatedCorrect = updatedRules.length === 4 && updatePayload.rules.every((expected, index) => { + const actual = updatedRules[index]; const value = derived(expected.innerLengthCm, expected.innerWidthCm, expected.innerHeightCm, expected.edgeAdditionCm) + return actual?.boxType === expected.boxType && Number(actual.version) === expected.version + 1 + && numberEquals(actual.innerLengthCm, expected.innerLengthCm) && numberEquals(actual.innerWidthCm, expected.innerWidthCm) + && numberEquals(actual.innerHeightCm, expected.innerHeightCm) && numberEquals(actual.edgeAdditionCm, expected.edgeAdditionCm) + && numberEquals(actual.outerLengthCm, value.outerLength) && numberEquals(actual.outerWidthCm, value.outerWidth) + && numberEquals(actual.outerHeightCm, value.outerHeight) && numberEquals(actual.volumeCbm, value.volume) + && actual.remark === expected.remark + }) + this.assert(module, '修改后四行版本+1且派生外径/CBM正确', updateResponse, updatedCorrect, + `versions=${updatedRules.map((r) => r.version).join(',')}`, options) + + const stalePayload = { rules: updatePayload.rules.map((rule) => ({ + ...rule, + innerLengthCm: Number((Number(rule.innerLengthCm) + 9).toFixed(3)), + })) } + const staleResponse = await this.request('PUT', path, stalePayload) + this.expectConflict(module, '旧 version 重放 PUT 返回冲突', staleResponse, scenario) + const afterConflictResponse = await this.request('GET', path) + const afterConflict = this.apiSuccess(module, '冲突后重新查询四条规则', afterConflictResponse, '', options) + const afterRules = Array.isArray(afterConflict?.rules) ? afterConflict.rules : [] + const stableSnapshot = (rule) => JSON.stringify({ + id: String(rule.id), boxType: rule.boxType, + innerLengthCm: Number(rule.innerLengthCm), innerWidthCm: Number(rule.innerWidthCm), + innerHeightCm: Number(rule.innerHeightCm), edgeAdditionCm: Number(rule.edgeAdditionCm), + outerLengthCm: Number(rule.outerLengthCm), outerWidthCm: Number(rule.outerWidthCm), + outerHeightCm: Number(rule.outerHeightCm), volumeCbm: Number(rule.volumeCbm), + remark: rule.remark ?? null, version: Number(rule.version), updatedAt: rule.updatedAt ?? null, + }) + const atomic = afterRules.length === 4 && updatedRules.length === 4 + && afterRules.every((rule, index) => stableSnapshot(rule) === stableSnapshot(updatedRules[index])) + this.assert(module, '冲突请求未造成四行部分更新', afterConflictResponse, atomic, + `unchangedRows=${atomic ? 4 : 0}`, options) + + const currentByType = new Map(afterRules.map((rule) => [rule.boxType, rule])) + const restorePayload = { rules: rules.map((original) => ({ + boxType: original.boxType, + innerLengthCm: Number(original.innerLengthCm), + innerWidthCm: Number(original.innerWidthCm), + innerHeightCm: Number(original.innerHeightCm), + edgeAdditionCm: Number(original.edgeAdditionCm), + remark: original.remark ?? null, + version: Number(currentByType.get(original.boxType)?.version), + })) } + const restorable = restorePayload.rules.length === 4 + && restorePayload.rules.every((rule) => Number.isInteger(rule.version) && rule.version >= 0) + if (restorable) { + const restoreResponse = await this.request('PUT', path, restorePayload) + const restoredGroup = this.apiSuccess(module, '恢复本轮修改前的四箱规配置', restoreResponse, + 'restore=original-values', options) + const restoredRules = Array.isArray(restoredGroup?.rules) ? restoredGroup.rules : [] + const restored = restoredRules.length === 4 && rules.every((original, index) => { + const actual = restoredRules[index] + return actual?.boxType === original.boxType + && numberEquals(actual.innerLengthCm, original.innerLengthCm) + && numberEquals(actual.innerWidthCm, original.innerWidthCm) + && numberEquals(actual.innerHeightCm, original.innerHeightCm) + && numberEquals(actual.edgeAdditionCm, original.edgeAdditionCm) + && actual.remark === original.remark + && Number(actual.version) === restorePayload.rules[index].version + 1 + }) + this.assert(module, '尺寸规则恢复后回显与初始值一致', restoreResponse, restored, + `restoredRows=${restored ? 4 : 0}`, options) + } else { + this.assert(module, '恢复本轮修改前的四箱规配置', afterConflictResponse, false, + '冲突后未返回完整四行及有效版本,无法安全恢复', options) + } + } else { + this.assert(module, '尺寸规则编辑与并发冲突场景', initialResponse, false, '默认规则不是完整四条,禁止降级跳过', options) + } + + const steps = this.steps.slice(start) + this.scenarios.push({ name: scenario, module, success: steps.every((step) => step.passed), deploymentBlocked: steps.some((step) => step.deploymentBlocker), passed: steps.filter((step) => step.passed).length, failed: steps.filter((step) => !step.passed).length }) + } + + async runCustomers() { + const module = 'customers'; const phone = await this.findAvailablePhone(module); const suffix = this.marker.slice(-12) + const payload = { + tenantName: `后台客户验收-${suffix}`, legalName: `后台客户验收有限公司-${suffix}`, + legalRepresentative: '接口验收法人', contactName: '接口验收联系人', contactPhone: phone, + contactEmail: `admin-api-${suffix.toLowerCase()}@example.com`, servicePackage: 'API验收套餐', + contactWechat: `api_${suffix.toLowerCase()}`, salesOwnerName: '接口验收销售', paymentTermDays: 30, + enterpriseType: 'LIMITED_COMPANY', establishedDate: '2020-01-02', registeredCapital: 5000000, + registeredCapitalCurrency: 'CNY', registeredAddress: '深圳市南山区接口验收地址', internalRemark: this.marker, + } + const createResponse = await this.request('POST', '/api/platform/v1/iam/tenants', payload) + const createData = this.apiSuccess(module, '创建客户', createResponse) + if (!createData) throw new Error('创建客户失败,后续客户模块无法继续') + const customer = createData.tenant || createData.customer || createData + const tenantId = String(customer.id || createData.tenantId || '') + if (!tenantId) throw new Error('创建响应未返回客户 ID') + this.context.customerId = tenantId + this.createdResources.customer = { tenantId, marker: this.marker, contactPhone: phone } + this.assert(module, '创建响应客户字段完整', createResponse, hasFields(customer, CUSTOMER_FIELDS), `missing=${CUSTOMER_FIELDS.filter((f) => !own(customer, f)).join(',') || 'none'}`) + this.assert(module, '新客户基础字段正确', createResponse, customer.tenantName === payload.tenantName && customer.contactPhone === phone && customer.status === 'PROFILE_REQUIRED', `tenantId=${tenantId}, status=${customer.status}`) + const ownerProvisioningOptions = { scenario: 'customer-owner-provisioning', deploymentBlocker: true } + this.assert(module, '创建客户生成初始密码', createResponse, + typeof createData.temporaryPassword === 'string' && createData.temporaryPassword.length >= 8 + && /[A-Za-z]/.test(createData.temporaryPassword) && /\d/.test(createData.temporaryPassword), + `generated=${typeof createData.temporaryPassword === 'string'}, length=${createData.temporaryPassword?.length || 0}`, + ownerProvisioningOptions) + this.assert(module, '管理员用户名默认使用联系电话', createResponse, + createData.administratorUsername === phone, + `matches=${createData.administratorUsername === phone}`, + ownerProvisioningOptions) + this.assert(module, '待完善客户的审核字段保持为空', createResponse, + customer.unifiedSocialCreditCode == null && customer.approvedAt == null, + `creditCode=${customer.unifiedSocialCreditCode ?? 'omitted'}, approvedAt=${customer.approvedAt ?? 'omitted'}`) + + await this.runCustomerDimensionRules(tenantId) + + const listResponse = await this.request('GET', `/api/platform/v1/iam/tenants?page=1&size=20&keyword=${encodeURIComponent(payload.tenantName)}`) + const page = this.apiSuccess(module, '查询客户列表', listResponse); const listed = page?.records?.find((item) => String(item.id) === tenantId) + this.assert(module, '列表包含新客户且字段完整', listResponse, listed && hasFields(listed, CUSTOMER_FIELDS), `found=${Boolean(listed)}, missing=${listed ? CUSTOMER_FIELDS.filter((f) => !own(listed, f)).join(',') || 'none' : 'all'}`) + const detailPath = `/api/platform/v1/iam/tenants/${tenantId}` + const detailResponse = await this.request('GET', detailPath); const detail = this.apiSuccess(module, '查询客户详情', detailResponse) + this.assert(module, '客户详情基本信息正确', detailResponse, detail && detail.tenantName === payload.tenantName && detail.contactPhone === phone && detail.internalRemark === payload.internalRemark, `tenantId=${tenantId}`) + const editedPayload = { ...payload, tenantName: `${payload.tenantName}-已编辑`, contactName: '接口验收联系人-已编辑', contactEmail: `edited-${payload.contactEmail}`, paymentTermDays: 45, internalRemark: `${this.marker}-EDITED` } + const editResponse = await this.request('PUT', detailPath, editedPayload); const edited = this.apiSuccess(module, '编辑客户', editResponse) + this.assert(module, '客户编辑正确回显', editResponse, edited?.tenantName === editedPayload.tenantName && edited?.contactEmail === editedPayload.contactEmail && Number(edited?.paymentTermDays) === 45, `tenantId=${tenantId}`) + const persistedResponse = await this.request('GET', detailPath); const persisted = this.apiSuccess(module, '回查客户编辑结果', persistedResponse) + this.assert(module, '客户编辑已持久化', persistedResponse, persisted?.tenantName === editedPayload.tenantName && persisted?.internalRemark === editedPayload.internalRemark, `tenantId=${tenantId}`) + const qualificationResponse = await this.request('GET', `${detailPath}/qualifications`); const qualifications = this.apiSuccess(module, '业务概况查询资质', qualificationResponse) + this.assert(module, '资质概况结构正确', qualificationResponse, Array.isArray(qualifications), `count=${Array.isArray(qualifications) ? qualifications.length : 'n/a'}`) + const memberResponse = await this.request('GET', `${detailPath}/members`); const members = this.apiSuccess(module, '业务概况查询成员', memberResponse) + const owner = members?.find?.((item) => item.memberType === 'OWNER') + this.assert(module, '联系电话账号是企业管理员', memberResponse, + owner?.username === phone, + `ownerFound=${Boolean(owner)}, matches=${owner?.username === phone}`, + ownerProvisioningOptions) + const countResponse = await this.request('GET', `/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=${tenantId}`); const counts = this.apiSuccess(module, '业务概况查询运单数量', countResponse); const count = counts?.find?.((item) => String(item.tenantId) === tenantId) + this.assert(module, '业务概况返回当前客户运单数', countResponse, count && Number.isFinite(Number(count.orderCount)), `orderCount=${count?.orderCount ?? 'missing'}`) + const ordersResponse = await this.request('GET', `/api/platform/v1/orders/first-leg?tenantId=${tenantId}&page=1&size=10`); const orders = this.apiSuccess(module, '查询客户运单记录', ordersResponse) + this.assert(module, '运单记录分页结构正确', ordersResponse, Array.isArray(orders?.records) && Number.isFinite(Number(orders?.total)), `records=${orders?.records?.length ?? 'n/a'}, total=${orders?.total ?? 'n/a'}`) + const archiveOptions = { scenario: 'customer-draft-archive', deploymentBlocker: true } + const archiveResponse = await this.request('POST', `${detailPath}/archive`) + const archived = this.apiSuccess(module, '归档测试客户', archiveResponse, `tenantId=${tenantId}`, archiveOptions) + if (archived) { + this.assert(module, '测试客户归档后处于停用状态', archiveResponse, + archived.status === 'DISABLED', `status=${archived.status ?? 'missing'}`, archiveOptions) + } + } + + async run() { + const loginResponse = await this.request('POST', '/api/auth/login', { username: this.options.username, password: this.options.password }, '') + const login = this.apiSuccess('authentication', '平台管理员登录', loginResponse) + if (!login?.accessToken) this.fatal = '平台管理员登录失败,未执行业务模块' + else { + this.token = login.accessToken + const handlers = { customers: () => this.runCustomers() } + for (const module of this.options.modules) { + let handler = handlers[module] + if (!handler) { + try { + const extension = await import(new URL(`./admin-test-env-modules/${module}.mjs`, import.meta.url)) + if (typeof extension.run !== 'function') throw new Error('模块必须导出 async function run(context)') + handler = () => extension.run(this) + } catch (error) { + const reason = error instanceof Error ? error.message : String(error) + this.addStep(module, '模块注册检查', null, false, `无法加载模块: ${reason}`) + this.modules.push({ name: module, success: false, passed: 0, failed: 1, fatal: reason }) + continue + } + } + await this.executeModule(module, handler) + } + } + const failed = this.steps.filter((step) => !step.passed).length + return { + reportName: '后台管理测试环境 HTTP API 验收', marker: this.marker, + gateway: this.options.gateway, generatedAt: new Date().toISOString(), startedAt: this.startedAt, + success: this.fatal === null && failed === 0, fatal: this.fatal, + summary: { total: this.steps.length, passed: this.steps.length - failed, failed }, + modules: this.modules, scenarios: this.scenarios, deploymentBlockers: this.deploymentBlockers, + createdResources: this.createdResources, + excluded: [ + { scope: 'dashboard', reason: '首页为静态演示数据,不调用后端 API' }, + { scope: 'hidden-prototypes', reason: '隐藏原型页面尚无已确认后端契约' }, + ], + securityNote: '报告不保存登录密码、Access Token、Refresh Token、图片二进制或 OCR 原文全文。', + steps: this.steps, + } + } +} + +async function main() { + const options = parseArguments(process.argv.slice(2)) + const timestamp = new Date().toISOString().replace(/\D/g, '').slice(0, 14) + const outputPath = resolve(options.output || `reports/admin-test-env-acceptance-${timestamp}.json`) + const report = await new AcceptanceRun(options).run() + await mkdir(dirname(outputPath), { recursive: true }) + await writeFile(outputPath, `${JSON.stringify(report, null, 2)}\n`, 'utf8') + console.log(`REPORT=${outputPath}`) + console.log(`RESULT=${report.success ? 'PASS' : 'FAIL'} total=${report.summary.total} passed=${report.summary.passed} failed=${report.summary.failed}`) + process.exitCode = report.success ? 0 : 1 +} + +main().catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exitCode = 1 }) diff --git a/scripts/admin-test-env-modules/OWNERSHIP.md b/scripts/admin-test-env-modules/OWNERSHIP.md new file mode 100644 index 000000000..3747cdcc6 --- /dev/null +++ b/scripts/admin-test-env-modules/OWNERSHIP.md @@ -0,0 +1,21 @@ +# Admin HTTP 验收模块协作表 + +所有对话共用入口 `../admin-test-env-acceptance.mjs`,原则上只修改自己负责的模块文件。 + +| 对话 ID | 主题 | 负责文件 / 场景 | +|---|---|---| +| 当前总控对话 | Admin 全量脚本 | 总入口、`system.mjs`、`master-data.mjs`、`downloads.mjs`、最终集成与全量报告 | +| `019fdbd3-f24f-7903-9124-de79c3ba37d0` | 客户尺寸规则 | 总入口内 `customer-dimension-rules` 子场景;不得改其他 customers 流程 | +| `019fdb7d-8e29-7c40-bda6-5a29dcb37971` | OCR 扫描 | `inbound-weight-ocr.mjs` | +| `019fdac1-ae04-7032-bac0-968497ea54ad` | 墨家测量 | `inbound-measurement.mjs` | +| `019fd5af-2e85-74b0-94e5-98c1b9ea4d3e` | 船期价格表 | `pricing.mjs` | +| `019fdbb1-ca56-7263-8914-a29d96cc5177` | 客户端创建订单 | `orders.mjs`,负责创建隔离测试订单并补 Admin 状态流程 | + +## 统一交付要求 + +1. 模块导出 `async function run(context)`,接口见 `README.md`。 +2. 测试数据必须带 `context.marker`,不得修改无关既有订单或主数据。 +3. 模块完成后运行 `node --check scripts/admin-test-env-modules/.mjs`。 +4. 再运行 `node scripts/admin-test-env-acceptance.mjs --modules `,报告写入 `reports/`。 +5. 报告不得包含密码、Token、图片二进制或 OCR 原文全文。 +6. 未部署的新契约必须记录 `deploymentBlocker`,不得跳过或模拟成功。 diff --git a/scripts/admin-test-env-modules/README.md b/scripts/admin-test-env-modules/README.md new file mode 100644 index 000000000..f8e327377 --- /dev/null +++ b/scripts/admin-test-env-modules/README.md @@ -0,0 +1,37 @@ +# Admin 测试环境 HTTP 模块 + +总入口是 `../admin-test-env-acceptance.mjs`。每个业务模块使用独立的同名 `.mjs` 文件,避免多个对话同时修改总入口。 + +例如 `--modules system,inbound-weight-ocr` 会依次加载: + +- `system.mjs` +- `inbound-weight-ocr.mjs` + +模块只需导出: + +```js +export async function run(context) { + const response = await context.request('GET', '/api/platform/v1/example') + const data = context.apiSuccess('example', '查询示例', response) + context.assert('example', '示例结构正确', response, Array.isArray(data), `count=${data?.length ?? 'n/a'}`) +} +``` + +## 可用上下文 + +- `request(method, path, body?)`:JSON HTTP 请求,自动使用平台 Token。 +- `requestBinary(method, path)`:文件下载,不把二进制写入报告。 +- `apiSuccess(module, name, response, evidence?, options?)`:断言 HTTP 200 + body code `200`,成功时返回 data。 +- `assert(module, name, response, condition, evidence, options?)`:业务断言。 +- `expectConflict(module, name, response, scenario)`:断言并发冲突。 +- `addStep(...)`:写入统一步骤报告。 +- `marker`:本轮唯一测试标记。 +- `createdResources`:登记测试资源 ID。 +- `context`:模块间共享少量 ID;模块应尽量独立。 + +## 约束 + +- 不记录密码、Token、图片二进制或 OCR 原文全文。 +- 测试数据必须带 `context.marker`;可删除的清理,不能删除的最终停用。 +- 缺少已确认契约时记录失败或 `deploymentBlocker`,不得模拟成功。 +- 一个模块只修改自己的 `.mjs`,不要修改其他模块文件。 diff --git a/scripts/admin-test-env-modules/_template.mjs b/scripts/admin-test-env-modules/_template.mjs new file mode 100644 index 000000000..fcfc4d921 --- /dev/null +++ b/scripts/admin-test-env-modules/_template.mjs @@ -0,0 +1,7 @@ +export async function run(context) { + const module = 'replace-with-module-name' + const response = await context.request('GET', '/api/platform/v1/replace-with-real-api') + const data = context.apiSuccess(module, '查询模块列表', response) + context.assert(module, '列表结构正确', response, Array.isArray(data?.records), + `records=${data?.records?.length ?? 'n/a'}`) +} diff --git a/scripts/admin-test-env-modules/downloads.mjs b/scripts/admin-test-env-modules/downloads.mjs new file mode 100644 index 000000000..9b8cbf682 --- /dev/null +++ b/scripts/admin-test-env-modules/downloads.mjs @@ -0,0 +1,43 @@ +function wait(milliseconds) { return new Promise((resolve) => setTimeout(resolve, milliseconds)) } +function isXlsx(response) { + return response.http === 200 && response.bytes?.length > 4 && response.bytes[0] === 0x50 && response.bytes[1] === 0x4b +} + +export async function run(context) { + const module = 'downloads' + const createResponse = await context.request('POST', '/api/platform/v1/files/export-tasks', { + exportType: 'CUSTOMER_LIST', format: 'XLSX', taskName: `Admin全量验收-${context.marker}`, + parameters: { keyword: context.marker }, + }) + const task = context.apiSuccess(module, '创建客户列表导出任务', createResponse) + const taskId = task?.id == null ? '' : String(task.id) + context.assert(module, '导出任务创建字段正确', createResponse, + taskId && task?.exportType === 'CUSTOMER_LIST' && task?.format === 'XLSX', + `taskId=${taskId || 'missing'}, status=${task?.status ?? 'missing'}`) + if (!taskId) throw new Error('导出任务创建失败') + context.createdResources.exportTask = { id: taskId } + + const listResponse = await context.request('GET', '/api/platform/v1/files/export-tasks?page=1&size=20&exportType=CUSTOMER_LIST') + const page = context.apiSuccess(module, '查询下载中心任务列表', listResponse) + context.assert(module, '下载中心列表包含新任务', listResponse, + page?.records?.some((item) => String(item.id) === taskId), `records=${page?.records?.length ?? 'n/a'}`) + + let latestResponse = createResponse + let latest = task + for (let attempt = 0; attempt < 30 && !['SUCCEEDED', 'FAILED', 'EXPIRED'].includes(latest?.status); attempt += 1) { + await wait(2000) + latestResponse = await context.request('GET', `/api/platform/v1/files/export-tasks/${encodeURIComponent(taskId)}`) + if (latestResponse.http === 200 && String(latestResponse.body?.code) === '200') latest = latestResponse.body.data + } + context.addStep(module, '轮询导出任务直到终态', latestResponse, + latest?.status === 'SUCCEEDED', `status=${latest?.status ?? 'missing'}, processedRows=${latest?.processedRows ?? 'n/a'}`) + if (latest?.status !== 'SUCCEEDED') return + const detailResponse = await context.request('GET', `/api/platform/v1/files/export-tasks/${encodeURIComponent(taskId)}`) + const detail = context.apiSuccess(module, '查询导出任务详情', detailResponse) + context.assert(module, '导出详情行数和文件元数据正确', detailResponse, + String(detail?.id) === taskId && Number.isFinite(Number(detail?.processedRows)) && Number(detail?.sizeBytes) > 0, + `processedRows=${detail?.processedRows ?? 'n/a'}, sizeBytes=${detail?.sizeBytes ?? 'n/a'}`) + const downloadResponse = await context.requestBinary('GET', `/api/platform/v1/files/export-tasks/${encodeURIComponent(taskId)}/download`) + context.addStep(module, '下载并校验客户列表 XLSX', downloadResponse, isXlsx(downloadResponse), + `bytes=${downloadResponse.bytes?.length ?? 0}, contentType=${downloadResponse.contentType || 'missing'}`) +} diff --git a/scripts/admin-test-env-modules/inbound-measurement.mjs b/scripts/admin-test-env-modules/inbound-measurement.mjs new file mode 100644 index 000000000..4eba29bc9 --- /dev/null +++ b/scripts/admin-test-env-modules/inbound-measurement.mjs @@ -0,0 +1,344 @@ +import { readFile } from 'node:fs/promises' + +const MODULE = 'inbound-measurement' +const SCENARIO = 'mojia-carton-measurement' +const OPTIONS = { scenario: SCENARIO, deploymentBlocker: true } + +function asId(value) { return value == null ? '' : String(value) } +function asNumber(value) { return Number(value) } +function closeTo(actual, expected, tolerance = 0.000001) { + return Number.isFinite(asNumber(actual)) && Math.abs(asNumber(actual) - expected) <= tolerance +} +function ceiling(value, scale) { + const factor = 10 ** scale + return Math.ceil((value - Number.EPSILON) * factor) / factor +} +function query(tenantId) { return `tenantId=${encodeURIComponent(tenantId)}` } +function validPdf(response) { + return response.http === 200 && response.contentType.toLowerCase().includes('pdf') + && response.bytes?.length > 4 && new TextDecoder().decode(response.bytes.slice(0, 4)) === '%PDF' +} + +function findIsolatedInbound(context) { + const roots = [context.createdResources, context.context] + const visited = new Set() + const candidates = [] + + function visit(value, inheritedMarker = '') { + if (!value || typeof value !== 'object' || visited.has(value)) return + visited.add(value) + const marker = String(value.marker || value.testMarker || inheritedMarker || '') + const inboundId = asId(value.inboundId || value.inbound?.id || value.inbound?.inboundId) + const tenantId = asId(value.tenantId || value.customerId || value.inbound?.tenantId) + if (marker === context.marker && inboundId && tenantId) { + candidates.push({ inboundId, tenantId, marker, source: value }) + } + for (const [key, child] of Object.entries(value)) { + if (key === 'temporaryPassword' || key === 'token') continue + if (child && typeof child === 'object') visit(child, marker) + } + } + + roots.forEach((root) => visit(root)) + return candidates[0] || null +} + +async function multipartRequest(context, path, data) { + const form = new FormData() + form.append('data', new Blob([JSON.stringify(data)], { type: 'application/json' })) + const image = await readFile(new URL('../../../apps/pda-uniapp/static/c7.png', import.meta.url)) + form.append('image', new Blob([image], { type: 'image/png' }), 'carton-evidence.png') + try { + const response = await fetch(`${context.options.gateway}${path}`, { + method: 'POST', + headers: { Accept: 'application/json', Authorization: `Bearer ${context.token}` }, + body: form, + signal: AbortSignal.timeout(60_000), + }) + const content = await response.text() + let body = null + try { body = content ? JSON.parse(content) : null } catch { /* Preserve only a bounded error string. */ } + return { + method: 'POST', path, http: response.status, body, + raw: body === null ? content.slice(0, 500) : null, + requestId: body?.requestId || response.headers.get('x-request-id'), + traceId: body?.traceId || response.headers.get('x-trace-id'), + } + } catch (error) { + return { method: 'POST', path, http: 0, body: null, raw: error instanceof Error ? error.message : String(error), requestId: null, traceId: null } + } +} + +async function requestWithHeaders(context, method, path, body, extraHeaders) { + try { + const response = await fetch(`${context.options.gateway}${path}`, { + method, + headers: { + Accept: 'application/json', Authorization: `Bearer ${context.token}`, + 'Content-Type': 'application/json; charset=utf-8', ...extraHeaders, + }, + body: JSON.stringify(body), signal: AbortSignal.timeout(30_000), + }) + const content = await response.text() + let payload = null + try { payload = content ? JSON.parse(content) : null } catch { /* Preserve only a bounded error string. */ } + return { + method, path, http: response.status, body: payload, + raw: payload === null ? content.slice(0, 500) : null, + requestId: payload?.requestId || response.headers.get('x-request-id'), + traceId: payload?.traceId || response.headers.get('x-trace-id'), + } + } catch (error) { + return { method, path, http: 0, body: null, raw: error instanceof Error ? error.message : String(error), requestId: null, traceId: null } + } +} + +function finishScenario(context, start) { + const steps = context.steps.slice(start) + context.scenarios.push({ + name: SCENARIO, module: MODULE, success: steps.every((step) => step.passed), + deploymentBlocked: steps.some((step) => step.deploymentBlocker), + passed: steps.filter((step) => step.passed).length, + failed: steps.filter((step) => !step.passed).length, + }) +} + +export async function run(context) { + const start = context.steps.length + const isolated = findIsolatedInbound(context) + if (!isolated) { + context.addStep(MODULE, '取得隔离的待测量入库单', null, false, + `orders 模块未提供 marker=${context.marker} 的 inboundId/tenantId;为避免修改随机历史订单,本模块停止写入`, OPTIONS) + finishScenario(context, start) + return + } + + const { inboundId, tenantId } = isolated + const detailPath = `/api/platform/inbounds/${inboundId}?${query(tenantId)}` + const inboundResponse = await context.request('GET', detailPath) + const inboundDetail = context.apiSuccess(MODULE, '查询隔离入库单详情', inboundResponse, + `inboundId=${inboundId}, tenantId=${tenantId}`, OPTIONS) + const summary = inboundDetail?.summary + const provenanceOk = asId(summary?.id) === inboundId && asId(summary?.tenantId) === tenantId + && ['WAIT_MEASURE', 'MEASURING'].includes(summary?.processStatus) + context.assert(MODULE, '隔离入库单身份与可测量状态正确', inboundResponse, provenanceOk, + `identity=${asId(summary?.id) === inboundId && asId(summary?.tenantId) === tenantId}, status=${summary?.processStatus ?? 'missing'}`, OPTIONS) + if (!provenanceOk) { + finishScenario(context, start) + return + } + + const inboundCode = String(summary.inboundCode || '') + if (!inboundCode) { + context.assert(MODULE, '箱码生成前置数据完整', inboundResponse, false, + 'inboundCode=missing', OPTIONS) + finishScenario(context, start) + return + } + + const labelPath = `/api/platform/inbounds/${inboundId}/carton-label-pdf?${query(tenantId)}` + const labelResponse = await context.requestBinary('POST', labelPath) + const pdfOk = validPdf(labelResponse) + context.assert(MODULE, '生成箱唛 PDF 并冻结稳定箱码', labelResponse, pdfOk, + `contentType=${labelResponse.contentType || 'missing'}, bytes=${labelResponse.bytes?.length ?? 0}`, OPTIONS) + if (!pdfOk) { + finishScenario(context, start) + return + } + + const frozenInboundResponse = await context.request('GET', detailPath) + const frozenInbound = context.apiSuccess(MODULE, '首次打印后回查冻结箱数', frozenInboundResponse, '', OPTIONS) + const frozenSummary = frozenInbound?.summary + const originalPackageCount = Number(frozenSummary?.totalPackageCount) + context.assert(MODULE, '首次打印按订单货物冻结原始总箱数', frozenInboundResponse, + frozenSummary?.inboundCode === inboundCode && Number.isInteger(originalPackageCount) && originalPackageCount >= 1, + `inboundCodeStable=${frozenSummary?.inboundCode === inboundCode}, totalPackageCount=${frozenSummary?.totalPackageCount ?? 'missing'}`, OPTIONS) + if (!Number.isInteger(originalPackageCount) || originalPackageCount < 1) { + finishScenario(context, start) + return + } + + const boxCode = `${inboundCode}#${originalPackageCount}-1` + const reprintResponse = await context.requestBinary('POST', labelPath) + context.assert(MODULE, '重复整单打印复用已冻结箱码映射', reprintResponse, validPdf(reprintResponse), + `boxCode=${boxCode}, contentType=${reprintResponse.contentType || 'missing'}, bytes=${reprintResponse.bytes?.length ?? 0}`, OPTIONS) + + const partialPrintPath = `${labelPath}&cartonIndex=1` + const partialPrintResponse = await context.requestBinary('POST', partialPrintPath) + context.assert(MODULE, '指定第1箱补打复用已冻结箱码映射', partialPrintResponse, validPdf(partialPrintResponse), + `boxCode=${boxCode}, cartonIndex=1, contentType=${partialPrintResponse.contentType || 'missing'}, bytes=${partialPrintResponse.bytes?.length ?? 0}`, OPTIONS) + if (!validPdf(reprintResponse) || !validPdf(partialPrintResponse)) { + finishScenario(context, start) + return + } + + const scanPath = `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/carton-scans?${query(tenantId)}` + const firstDimensions = { length: 60.1, width: 40.2, height: 30.3, weight: 12.5 } + const firstScanResponse = await multipartRequest(context, scanPath, { + boxCode, ...firstDimensions, machineNo: 'MJ-ADMIN-E2E-01', measuredAt: new Date().toISOString().slice(0, 19), + }) + const firstScan = context.apiSuccess(MODULE, '模拟墨家首次扫描单箱', firstScanResponse, + `boxCode=${boxCode}, machineNo=MJ-ADMIN-E2E-01`, OPTIONS) + context.assert(MODULE, '首次扫描新增一条且默认代表1箱', firstScanResponse, + firstScan?.created === true && asId(firstScan?.boxCode) === boxCode + && Number(firstScan?.confirmedPackageCount) === 1 && asId(firstScan?.itemId), + `created=${firstScan?.created}, confirmedPackageCount=${firstScan?.confirmedPackageCount ?? 'missing'}`, OPTIONS) + context.assert(MODULE, '重复打印及指定箱补打后原箱码仍可解析', firstScanResponse, + firstScan?.created === true && firstScan?.boxCode === boxCode, + `boxCodeStable=${firstScan?.boxCode === boxCode}, resolvedInboundId=${inboundId}`, OPTIONS) + if (!firstScan?.itemId || !firstScan?.measurementId) { + finishScenario(context, start) + return + } + + const measurementPath = `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement?${query(tenantId)}` + const firstQueryResponse = await context.request('GET', measurementPath) + const firstQuery = context.apiSuccess(MODULE, '查询箱级测量详情', firstQueryResponse, + `measurementId=${asId(firstScan.measurementId)}`, OPTIONS) + const firstItem = firstQuery?.items?.find((item) => asId(item.id) === asId(firstScan.itemId)) + context.assert(MODULE, '箱级查询回显箱码、尺寸、图片与设备信息', firstQueryResponse, + firstItem?.boxCode === boxCode && asId(firstItem?.intelligentImageFileId) + && firstItem?.machineNo === 'MJ-ADMIN-E2E-01' + && closeTo(firstItem?.lengthCm, firstDimensions.length) + && closeTo(firstItem?.widthCm, firstDimensions.width) + && closeTo(firstItem?.heightCm, firstDimensions.height), + `itemFound=${Boolean(firstItem)}, imageFileId=${asId(firstItem?.intelligentImageFileId) || 'missing'}`, OPTIONS) + + const countResponse = await context.request('PUT', + `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/items/${firstScan.itemId}/confirmed-package-count?${query(tenantId)}`, + { measurementVersion: Number(firstScan.measurementVersion), confirmedPackageCount: originalPackageCount }) + const countResult = context.apiSuccess(MODULE, '人工确认当前测量代表箱数', countResponse, + `confirmedPackageCount=${originalPackageCount}`, OPTIONS) + context.assert(MODULE, '人工箱数更新且测量版本递增', countResponse, + Number(countResult?.confirmedPackageCount) === originalPackageCount + && Number(countResult?.measurementVersion) === Number(firstScan.measurementVersion) + 1, + `version=${countResult?.measurementVersion ?? 'missing'}`, OPTIONS) + + const replacement = { length: 61.1, width: 41.2, height: 31.3, weight: 13.6 } + const rescanResponse = await multipartRequest(context, scanPath, { + boxCode, ...replacement, machineNo: 'MJ-ADMIN-E2E-02', measuredAt: new Date().toISOString().slice(0, 19), + }) + const rescan = context.apiSuccess(MODULE, '同箱号重新扫描覆盖当前记录', rescanResponse, + `boxCode=${boxCode}, machineNo=MJ-ADMIN-E2E-02`, OPTIONS) + context.assert(MODULE, '覆盖保留同一条记录和人工箱数', rescanResponse, + rescan?.created === false && asId(rescan?.itemId) === asId(firstScan.itemId) + && Number(rescan?.confirmedPackageCount) === originalPackageCount + && closeTo(rescan?.lengthCm, replacement.length), + `sameItem=${asId(rescan?.itemId) === asId(firstScan.itemId)}, confirmedPackageCount=${rescan?.confirmedPackageCount ?? 'missing'}`, OPTIONS) + + const measuredResponse = await context.request('GET', measurementPath) + const measured = context.apiSuccess(MODULE, '回查覆盖后的尺寸与体积结果', measuredResponse, '', OPTIONS) + const measuredItem = measured?.items?.find((item) => asId(item.id) === asId(firstScan.itemId)) + const unitVolume = ceiling(replacement.length * replacement.width * replacement.height / 1_000_000, 4) + const totalVolume = ceiling(unitVolume * originalPackageCount, 4) + const volumeWeight = ceiling(totalVolume * 167, 3) + const girth = ceiling(replacement.length + 2 * (replacement.width + replacement.height), 3) + context.assert(MODULE, '覆盖尺寸、箱数和服务端体积公式正确', measuredResponse, + measuredItem && closeTo(measuredItem.lengthCm, replacement.length) + && closeTo(measuredItem.widthCm, replacement.width) && closeTo(measuredItem.heightCm, replacement.height) + && Number(measuredItem.confirmedPackageCount) === originalPackageCount + && closeTo(measuredItem.unitVolumeCbm, unitVolume) && closeTo(measuredItem.totalVolumeCbm, totalVolume) + && closeTo(measuredItem.volumeWeightKg, volumeWeight) && closeTo(measuredItem.girthCm, girth) + && closeTo(measured.actualVolumeCbm, totalVolume) && closeTo(measured.volumeWeightKg, volumeWeight), + `unitVolume=${unitVolume}, totalVolume=${totalVolume}, volumeWeight=${volumeWeight}, girth=${girth}`, OPTIONS) + + let inboundDetailId = measuredItem?.inboundDetailId + if (!inboundDetailId) { + const orderId = asId(frozenSummary?.orderId || context.createdResources?.orders?.orderId) + const orderDetailResponse = await context.request('GET', + `/api/platform/v1/orders/first-leg/${encodeURIComponent(orderId)}?${query(tenantId)}`) + const orderDetail = context.apiSuccess(MODULE, '测量详情缺少货物ID时回查隔离订单', orderDetailResponse, + `orderId=${orderId}`, OPTIONS) + const cargoes = Array.isArray(orderDetail?.cargoes) ? [...orderDetail.cargoes] : [] + cargoes.sort((left, right) => Number(left?.itemNo ?? Number.MAX_SAFE_INTEGER) + - Number(right?.itemNo ?? Number.MAX_SAFE_INTEGER) || asId(left?.id).localeCompare(asId(right?.id))) + const firstCargo = cargoes[0] + const cargoBelongsToRun = asId(orderDetail?.order?.id) === orderId + && String(firstCargo?.cargoRemark || '').includes(context.marker) + inboundDetailId = cargoBelongsToRun ? firstCargo?.id : null + context.assert(MODULE, '草稿绑定本轮箱码对应的隔离货物', orderDetailResponse, + cargoBelongsToRun && asId(inboundDetailId), + `cargoCount=${cargoes.length}, markerMatched=${cargoBelongsToRun}, inboundDetailId=${asId(inboundDetailId) || 'missing'}`, OPTIONS) + } + if (!inboundDetailId || !measuredItem?.intelligentImageFileId) { + context.assert(MODULE, '草稿保存前置字段完整', measuredResponse, false, + `inboundDetailId=${asId(inboundDetailId) || 'missing'}, imageFileId=${asId(measuredItem?.intelligentImageFileId) || 'missing'}`, OPTIONS) + finishScenario(context, start) + return + } + + const draftPayload = { + measurementId: measured.measurementId, version: Number(measured.version), + originalDocumentNo: context.marker, originalGrossWeightKg: replacement.weight * originalPackageCount, + originalVolumeCbm: totalVolume, actualGoodsName: `墨家测量验收-${context.marker.slice(-12)}`, + items: [{ + inboundDetailId, itemNo: measuredItem.itemNo, + boxSpecification: measuredItem.boxSpecification, packageCount: originalPackageCount, + lengthCm: replacement.length, widthCm: replacement.width, heightCm: replacement.height, + unitWeightKg: replacement.weight, intelligentImageFileId: measuredItem.intelligentImageFileId, + overLimitWarning: measuredItem.overLimitWarning ?? null, + outerLengthCm: measuredItem.outerLengthCm ?? null, outerWidthCm: measuredItem.outerWidthCm ?? null, + outerHeightCm: measuredItem.outerHeightCm ?? null, remark: context.marker, + }], + } + const draftResponse = await context.request('PUT', + `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/draft?${query(tenantId)}`, draftPayload) + const draft = context.apiSuccess(MODULE, '保存同一测量批次草稿', draftResponse, + `measurementId=${asId(measured.measurementId)}, items=1`, OPTIONS) + context.assert(MODULE, '草稿沿用批次并递增版本', draftResponse, + asId(draft?.measurementId) === asId(measured.measurementId) + && Number(draft?.version) === Number(measured.version) + 1 && draft?.status === 'DRAFT', + `status=${draft?.status ?? 'missing'}, version=${draft?.version ?? 'missing'}`, OPTIONS) + if (!draft?.measurementId) { + finishScenario(context, start) + return + } + + const submitResponse = await context.request('POST', + `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/submit?${query(tenantId)}`, + { measurementId: draft.measurementId, version: Number(draft.version) }) + const submitted = context.apiSuccess(MODULE, '提交测量审核', submitResponse, + `measurementId=${asId(draft.measurementId)}`, OPTIONS) + context.assert(MODULE, '提交后进入待测量审核状态', submitResponse, + submitted?.processStatus === 'MEASURE_PENDING' && submitted?.measureReviewStatus === 'PENDING', + `processStatus=${submitted?.processStatus ?? 'missing'}, reviewStatus=${submitted?.measureReviewStatus ?? 'missing'}`, OPTIONS) + + const rejectedScanResponse = await multipartRequest(context, scanPath, { + boxCode, ...replacement, machineNo: 'MJ-ADMIN-E2E-03', measuredAt: new Date().toISOString().slice(0, 19), + }) + const rejected = rejectedScanResponse.http === 200 && String(rejectedScanResponse.body?.code) === 'A0409' + && String(rejectedScanResponse.body?.message || '').includes('测量已提交') + context.assert(MODULE, '测量提交后拒绝设备覆盖并返回中文提示', rejectedScanResponse, rejected, + `HTTP=${rejectedScanResponse.http}, code=${rejectedScanResponse.body?.code ?? 'missing'}, chineseMessage=${String(rejectedScanResponse.body?.message || '').includes('测量已提交')}`, OPTIONS) + + const pendingInboundResponse = await context.request('GET', detailPath) + const pendingInbound = context.apiSuccess(MODULE, '审核前读取最新入库单版本', pendingInboundResponse, '', OPTIONS) + const pendingSummary = pendingInbound?.summary + context.assert(MODULE, '审核前状态和版本有效', pendingInboundResponse, + pendingSummary?.processStatus === 'MEASURE_PENDING' && pendingSummary?.measureReviewStatus === 'PENDING' + && Number.isInteger(Number(pendingSummary?.version)), + `status=${pendingSummary?.processStatus ?? 'missing'}, version=${pendingSummary?.version ?? 'missing'}`, OPTIONS) + + const approvalPath = `/api/platform/v1/inbounds/${inboundId}/measurements/approve?${query(tenantId)}` + const approvalResponse = await requestWithHeaders(context, 'POST', approvalPath, { + measurementId: draft.measurementId, expectedVersion: Number(pendingSummary?.version), reason: null, + }, { 'Idempotency-Key': `${context.marker}-mojia-approve`.slice(0, 128) }) + context.apiSuccess(MODULE, 'Admin 审核通过墨家测量', approvalResponse, + `measurementId=${asId(draft.measurementId)}`, OPTIONS) + + const finalResponse = await context.request('GET', measurementPath) + const finalMeasurement = context.apiSuccess(MODULE, '查询审核后的最终测量状态', finalResponse, '', OPTIONS) + context.assert(MODULE, '审核后入库与测量状态闭环且结果未变化', finalResponse, + finalMeasurement?.processStatus === 'INBOUNDED' && finalMeasurement?.measureReviewStatus === 'APPROVED' + && finalMeasurement?.measurementStatus === 'APPROVED' + && Number(finalMeasurement?.actualPackageCount) === originalPackageCount + && closeTo(finalMeasurement?.actualVolumeCbm, totalVolume) + && closeTo(finalMeasurement?.volumeWeightKg, volumeWeight), + `processStatus=${finalMeasurement?.processStatus ?? 'missing'}, measurementStatus=${finalMeasurement?.measurementStatus ?? 'missing'}, packages=${finalMeasurement?.actualPackageCount ?? 'missing'}`, OPTIONS) + + context.createdResources.inboundMeasurement = { + marker: context.marker, tenantId, inboundId, measurementId: asId(draft.measurementId), + boxCode, finalStatus: finalMeasurement?.measurementStatus || null, + } + finishScenario(context, start) +} diff --git a/scripts/admin-test-env-modules/inbound-weight-ocr.mjs b/scripts/admin-test-env-modules/inbound-weight-ocr.mjs new file mode 100644 index 000000000..96c01e29e --- /dev/null +++ b/scripts/admin-test-env-modules/inbound-weight-ocr.mjs @@ -0,0 +1,452 @@ +import { readFile } from 'node:fs/promises' +import { basename } from 'node:path' +import process from 'node:process' + +const MODULE = 'inbound-weight-ocr' +const SCENARIO = 'weight-image-recognition-and-confirmation' +const DEFAULT_IMAGE = 'C:/Users/BY-OY/Desktop/上传图片包/测量图片/测量图片/orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG' +const EDITABLE_STATUSES = new Set(['WAIT_MEASURE', 'MEASURING', 'MEASURE_REJECTED']) +const OCR_STATUSES = new Set(['RECOGNIZED', 'FAILED']) +const NEW_CONTRACT_OPTIONS = { scenario: SCENARIO, deploymentBlocker: true } +const SCENARIO_OPTIONS = { scenario: SCENARIO } + +function id(value) { + return value == null ? '' : String(value) +} + +function apiOk(response) { + return response?.http === 200 && String(response?.body?.code) === '200' +} + +function closeNumber(actual, expected, tolerance = 0.0005) { + return Number.isFinite(Number(actual)) && Math.abs(Number(actual) - Number(expected)) < tolerance +} + +function expectedConflict(response) { + return response?.http === 200 && ['A0409', '409'].includes(String(response?.body?.code)) +} + +function expectedRejection(response) { + return response?.http === 200 && response?.body && String(response.body.code) !== '200' +} + +function markerVisible(detail, marker) { + const values = [ + detail?.publicRemark, + detail?.summary?.inboundCode, + detail?.summary?.orderNo, + detail?.summary?.customerName, + detail?.summary?.companyName, + ...(Array.isArray(detail?.internalNotes) ? detail.internalNotes.map((note) => note?.content) : []), + ] + return values.some((value) => typeof value === 'string' && value.includes(marker)) +} + +function candidateValues(context) { + const shared = context.context || {} + return [ + shared.inboundWeightOcr, + shared.ocrInbound, + shared.testInbound, + shared.createdInbound, + shared.inboundId && shared.tenantId + ? { inboundId: shared.inboundId, tenantId: shared.tenantId, marker: shared.inboundMarker } + : null, + ].filter(Boolean) +} + +async function resolveMarkedInbound(context) { + for (const candidate of candidateValues(context)) { + const tenantId = id(candidate.tenantId || candidate.customerId) + const inboundId = id(candidate.inboundId || candidate.id) + if (!tenantId || !inboundId) continue + const response = await context.request( + 'GET', `/api/platform/inbounds/${encodeURIComponent(inboundId)}?tenantId=${encodeURIComponent(tenantId)}`, + ) + const detail = apiOk(response) ? response.body.data : null + const marked = markerVisible(detail, context.marker) + const editable = EDITABLE_STATUSES.has(detail?.summary?.processStatus) + if (detail && marked && editable) return { tenantId, inboundId, detail, response } + } + + const filters = [ + `inboundCode=${encodeURIComponent(context.marker)}`, + `orderNo=${encodeURIComponent(context.marker)}`, + ] + for (const filter of filters) { + const pageResponse = await context.request('GET', `/api/platform/inbounds?page=1&size=20&${filter}`) + if (!apiOk(pageResponse)) continue + for (const row of pageResponse.body.data?.records || []) { + const tenantId = id(row.tenantId) + const inboundId = id(row.id) + if (!tenantId || !inboundId || !EDITABLE_STATUSES.has(row.processStatus)) continue + const detailResponse = await context.request( + 'GET', `/api/platform/inbounds/${encodeURIComponent(inboundId)}?tenantId=${encodeURIComponent(tenantId)}`, + ) + const detail = apiOk(detailResponse) ? detailResponse.body.data : null + if (detail && markerVisible(detail, context.marker)) { + return { tenantId, inboundId, detail, response: detailResponse } + } + } + } + return null +} + +async function multipart(context, path, file, token = context.token) { + const form = new FormData() + form.append('file', new Blob([file.bytes], { type: file.contentType }), file.name) + const headers = { Accept: 'application/json' } + if (token) headers.Authorization = `Bearer ${token}` + try { + const response = await fetch(`${context.options.gateway}${path}`, { + method: 'POST', headers, body: form, signal: AbortSignal.timeout(120_000), + }) + const content = await response.text() + let payload = null + try { payload = content ? JSON.parse(content) : null } catch { /* Keep bounded diagnostic text only. */ } + return { + method: 'POST', path, http: response.status, body: payload, + raw: payload === null ? content.slice(0, 500) : null, + requestId: payload?.requestId || response.headers.get('x-request-id'), + traceId: payload?.traceId || response.headers.get('x-trace-id'), + } + } catch (error) { + return { + method: 'POST', path, http: 0, body: null, + raw: error instanceof Error ? error.message : String(error), + requestId: null, traceId: null, + } + } +} + +function jpegDimensions(bytes) { + if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) return null + const standalone = new Set([0x01, 0xd8, 0xd9, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7]) + const startsOfFrame = new Set([0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf]) + let offset = 2 + while (offset + 3 < bytes.length) { + while (offset < bytes.length && bytes[offset] !== 0xff) offset += 1 + while (offset < bytes.length && bytes[offset] === 0xff) offset += 1 + if (offset >= bytes.length) break + const marker = bytes[offset] + offset += 1 + if (standalone.has(marker)) continue + if (offset + 1 >= bytes.length) break + const length = bytes[offset] * 256 + bytes[offset + 1] + if (length < 2 || offset + length > bytes.length) break + if (startsOfFrame.has(marker) && length >= 7) { + return { + height: bytes[offset + 3] * 256 + bytes[offset + 4], + width: bytes[offset + 5] * 256 + bytes[offset + 6], + } + } + offset += length + } + return null +} + +function workspacePath(tenantId, inboundId) { + return `/api/platform/v1/first-leg/inbounds/${encodeURIComponent(inboundId)}/measurement?tenantId=${encodeURIComponent(tenantId)}` +} + +function resultPath(inboundId, resultId) { + return `/api/platform/v1/first-leg/inbounds/${encodeURIComponent(inboundId)}/weight-results/${encodeURIComponent(resultId)}` +} + +function confirmPath(tenantId, inboundId, resultId) { + return `${resultPath(inboundId, resultId)}/confirm?tenantId=${encodeURIComponent(tenantId)}` +} + +function deletePath(tenantId, inboundId, resultId, version) { + return `${resultPath(inboundId, resultId)}?tenantId=${encodeURIComponent(tenantId)}&version=${version}` +} + +async function createUploadedResult(context, target, image, overrides = {}) { + const imagePath = `/api/platform/v1/files/measurements/${encodeURIComponent(target.tenantId)}/${encodeURIComponent(target.inboundId)}` + const uploadResponse = await multipart(context, imagePath, image) + const upload = context.apiSuccess(MODULE, '上传称重图片并执行 OCR', uploadResponse, + `file=${image.name}, size=${image.bytes.length}`, SCENARIO_OPTIONS) + const fileId = id(upload?.fileId) + context.assert(MODULE, '上传响应保持文件 ID 字符串契约', uploadResponse, + Boolean(fileId) && typeof upload?.fileId === 'string', + `fileIdType=${typeof upload?.fileId}, status=${upload?.recognitionStatus ?? 'missing'}`, SCENARIO_OPTIONS) + context.assert(MODULE, 'OCR 上传响应字段完整且置信度受限', uploadResponse, + upload && OCR_STATUSES.has(upload.recognitionStatus) + && Object.hasOwn(upload, 'weightValue') && Object.hasOwn(upload, 'weightUnit') + && Object.hasOwn(upload, 'confidence') + && (upload.confidence == null || (Number(upload.confidence) >= 0 && Number(upload.confidence) <= 1)), + `status=${upload?.recognitionStatus ?? 'missing'}, hasWeight=${upload?.weightValue != null}, confidence=${upload?.confidence ?? 'null'}`, + SCENARIO_OPTIONS) + if (!fileId) throw new Error('称重图片上传未返回 fileId,无法登记和清理测试资源') + + let recognized = upload + if (overrides.retry) { + const retryPath = `${imagePath}/${encodeURIComponent(fileId)}/recognize` + const retryResponse = await context.request('POST', retryPath) + const retry = context.apiSuccess(MODULE, '重试当前称重图片 OCR', retryResponse, + `fileId=${fileId}`, SCENARIO_OPTIONS) + context.assert(MODULE, 'OCR 重试保持文件身份并返回识别契约', retryResponse, + id(retry?.fileId) === fileId && OCR_STATUSES.has(retry?.recognitionStatus) + && Object.hasOwn(retry || {}, 'weightValue') && Object.hasOwn(retry || {}, 'confidence'), + `sameFile=${id(retry?.fileId) === fileId}, status=${retry?.recognitionStatus ?? 'missing'}`, + SCENARIO_OPTIONS) + if (retry) recognized = retry + } + + const payload = { + fileId, + ocrProvider: `ADMIN_ACCEPTANCE_${context.marker.replace(/[^A-Za-z0-9]/g, '').slice(-24)}`, + ocrRawText: overrides.manual ? null : (recognized.ocrRawText || null), + ocrWeightValue: overrides.manual ? null : recognized.weightValue, + ocrWeightUnit: overrides.manual ? null : recognized.weightUnit, + confidence: overrides.manual ? null : recognized.confidence, + } + const createPath = `/api/platform/v1/first-leg/inbounds/${encodeURIComponent(target.inboundId)}/weight-results?tenantId=${encodeURIComponent(target.tenantId)}` + let createResponse = await context.request('POST', createPath, payload) + let result = context.apiSuccess(MODULE, overrides.manual ? '登记人工录入重量结果' : '登记 OCR 原值', + createResponse, `fileId=${fileId}`, SCENARIO_OPTIONS) + if (!result && !overrides.manual) { + createResponse = await context.request('POST', createPath, { + ...payload, ocrRawText: null, ocrWeightValue: null, ocrWeightUnit: null, confidence: null, + }) + result = context.apiSuccess(MODULE, 'OCR 原值登记失败后建立可清理人工结果', createResponse, + `fileId=${fileId}`, NEW_CONTRACT_OPTIONS) + } + const resultId = id(result?.id) + context.assert(MODULE, '重量结果 ID、文件 ID 和初始版本契约正确', createResponse, + Boolean(resultId) && typeof result?.id === 'string' && typeof result?.fileId === 'string' + && id(result?.fileId) === fileId && Number(result?.version) === 0, + `resultIdType=${typeof result?.id}, fileIdType=${typeof result?.fileId}, version=${result?.version ?? 'missing'}`, + SCENARIO_OPTIONS) + if (!resultId) throw new Error(`文件 ${fileId} 已上传但重量结果登记失败,需要人工清理该测试文件`) + return { upload: recognized, fileId, result, resultId, version: Number(result.version), deleted: false } +} + +async function verifyImages(context, target, item, image) { + const base = `/api/platform/v1/files/measurements/${encodeURIComponent(target.tenantId)}/${encodeURIComponent(target.inboundId)}/${encodeURIComponent(item.fileId)}` + const original = await context.requestBinary('GET', base) + context.assert(MODULE, '鉴权读取原始称重图片', original, + original.http === 200 && original.bytes.length === image.bytes.length + && /^image\/(jpeg|png|bmp)/i.test(original.contentType), + `contentType=${original.contentType || 'missing'}, bytes=${original.bytes.length}`, SCENARIO_OPTIONS) + + const thumbnail = await context.requestBinary('GET', `${base}/thumbnail`) + const dimensions = jpegDimensions(thumbnail.bytes) + context.assert(MODULE, '缩略图返回受限尺寸 JPEG', thumbnail, + thumbnail.http === 200 && /^image\/jpeg/i.test(thumbnail.contentType) + && thumbnail.bytes.length > 0 && dimensions && dimensions.width <= 480 && dimensions.height <= 320, + `contentType=${thumbnail.contentType || 'missing'}, bytes=${thumbnail.bytes.length}, dimensions=${dimensions ? `${dimensions.width}x${dimensions.height}` : 'unreadable'}`, + NEW_CONTRACT_OPTIONS) +} + +async function loadWorkspace(context, target, name) { + const response = await context.request('GET', workspacePath(target.tenantId, target.inboundId)) + const workspace = context.apiSuccess(MODULE, name, response, `inboundId=${target.inboundId}`, SCENARIO_OPTIONS) + return { response, workspace } +} + +async function rejectWithoutMutation(context, target, item, name, payload) { + const path = confirmPath(target.tenantId, target.inboundId, item.resultId) + const response = await context.request('POST', path, payload) + context.assert(MODULE, name, response, expectedRejection(response), + `HTTP=${response.http}, code=${response.body?.code ?? 'missing'}`, SCENARIO_OPTIONS) + const check = await loadWorkspace(context, target, `${name}后回查工作区`) + const persisted = check.workspace?.weightResults?.find((row) => id(row.id) === item.resultId) + context.assert(MODULE, `${name}未改变重量结果`, check.response, + persisted && Number(persisted.version) === item.version && persisted.recognitionStatus !== 'CONFIRMED', + `version=${persisted?.version ?? 'missing'}, status=${persisted?.recognitionStatus ?? 'missing'}`, SCENARIO_OPTIONS) +} + +async function deleteResult(context, target, item, name, options = NEW_CONTRACT_OPTIONS) { + const path = deletePath(target.tenantId, target.inboundId, item.resultId, item.version) + const response = await context.request('DELETE', path) + const passed = apiOk(response) + context.addStep(MODULE, name, response, passed, + `resultId=${item.resultId}, version=${item.version}`, options) + if (passed) item.deleted = true + return { response, passed } +} + +async function verifyDeleted(context, target, item, baselineWeight) { + const check = await loadWorkspace(context, target, '删除后回查重量工作区') + const missing = !check.workspace?.weightResults?.some((row) => id(row.id) === item.resultId) + context.assert(MODULE, '删除后结果消失且总毛重恢复基线', check.response, + missing && (baselineWeight == null + ? check.workspace?.actualGrossWeightKg == null + : closeNumber(check.workspace?.actualGrossWeightKg, baselineWeight)), + `resultMissing=${missing}, baseline=${baselineWeight ?? 'null'}, actual=${check.workspace?.actualGrossWeightKg ?? 'null'}`, + NEW_CONTRACT_OPTIONS) + + const imagePath = `/api/platform/v1/files/measurements/${encodeURIComponent(target.tenantId)}/${encodeURIComponent(target.inboundId)}/${encodeURIComponent(item.fileId)}` + const image = await context.requestBinary('GET', imagePath) + context.assert(MODULE, '删除结果后原始图片不可再读取', image, + image.http === 200 && image.body && String(image.body.code) !== '200', + `HTTP=${image.http}, code=${image.body?.code ?? 'missing'}`, NEW_CONTRACT_OPTIONS) +} + +export async function run(context) { + const scenarioStart = context.steps.length + const created = [] + const target = await resolveMarkedInbound(context) + context.assert(MODULE, '仅选择带本轮测试标记的可编辑入库单', target?.response || null, + Boolean(target), target + ? `tenantId=${target.tenantId}, inboundId=${target.inboundId}, status=${target.detail.summary.processStatus}` + : `marker=${context.marker}, 未找到本轮创建且状态为 ${[...EDITABLE_STATUSES].join('/')} 的入库单`, + SCENARIO_OPTIONS) + if (!target) { + context.scenarios.push({ + name: SCENARIO, module: MODULE, success: false, deploymentBlocked: false, + passed: 0, failed: 1, + }) + return + } + + context.context.inboundWeightOcr = { + tenantId: target.tenantId, inboundId: target.inboundId, marker: context.marker, + } + context.createdResources.inboundWeightOcr = { + tenantId: target.tenantId, inboundId: target.inboundId, resultIds: [], cleaned: false, + } + + const imagePath = process.env.ADMIN_TEST_OCR_IMAGE || DEFAULT_IMAGE + const imageBytes = await readFile(imagePath) + const image = { bytes: imageBytes, name: basename(imagePath), contentType: 'image/jpeg' } + const initial = await loadWorkspace(context, target, '读取 OCR 测试前重量工作区') + if (!initial.workspace) throw new Error('无法读取测试入库单重量工作区') + const baselineWeight = initial.workspace.actualGrossWeightKg + const baselineIds = new Set((initial.workspace.weightResults || []).map((row) => id(row.id))) + context.assert(MODULE, '测试入库单身份与基线可追踪', initial.response, + id(initial.workspace.inboundId) === target.inboundId + && initial.workspace.processStatus === target.detail.summary.processStatus, + `existingResults=${baselineIds.size}, baselineWeight=${baselineWeight ?? 'null'}`, SCENARIO_OPTIONS) + + const uploadPath = `/api/platform/v1/files/measurements/${encodeURIComponent(target.tenantId)}/${encodeURIComponent(target.inboundId)}` + const noAuth = await multipart(context, uploadPath, image, '') + context.assert(MODULE, '未认证请求不能上传称重图片', noAuth, + noAuth.http === 401 || noAuth.http === 403, + `HTTP=${noAuth.http}, code=${noAuth.body?.code ?? 'none'}`, SCENARIO_OPTIONS) + const wrongType = await multipart(context, uploadPath, { + bytes: new TextEncoder().encode(context.marker), name: `${context.marker}.txt`, contentType: 'text/plain', + }) + context.assert(MODULE, '非图片类型被拒绝且不模拟成功', wrongType, + expectedRejection(wrongType), `HTTP=${wrongType.http}, code=${wrongType.body?.code ?? 'missing'}`, SCENARIO_OPTIONS) + const oversized = await multipart(context, uploadPath, { + bytes: new Uint8Array(5 * 1024 * 1024 + 1), name: `${context.marker}.jpg`, contentType: 'image/jpeg', + }) + context.assert(MODULE, '超过5MB图片被拒绝', oversized, + expectedRejection(oversized), `HTTP=${oversized.http}, code=${oversized.body?.code ?? 'missing'}`, SCENARIO_OPTIONS) + + try { + const original = await createUploadedResult(context, target, image, { retry: true }) + created.push(original) + context.createdResources.inboundWeightOcr.resultIds.push(original.resultId) + await verifyImages(context, target, original, image) + + const registered = await loadWorkspace(context, target, '登记后回查 OCR 重量结果') + const registeredRow = registered.workspace?.weightResults?.find((row) => id(row.id) === original.resultId) + context.assert(MODULE, '工作区保留本轮 OCR 原值且未覆盖历史结果', registered.response, + registeredRow && !baselineIds.has(original.resultId) + && closeNumber(registeredRow.ocrWeightValue, original.result.ocrWeightValue) + && registeredRow.ocrWeightUnit === original.result.ocrWeightUnit, + `resultFound=${Boolean(registeredRow)}, baselineCount=${baselineIds.size}, currentCount=${registered.workspace?.weightResults?.length ?? 'n/a'}`, + SCENARIO_OPTIONS) + + const staleConfirm = await context.request('POST', + confirmPath(target.tenantId, target.inboundId, original.resultId), + { version: original.version + 1 }) + context.assert(MODULE, '旧版本确认返回并发冲突', staleConfirm, expectedConflict(staleConfirm), + `HTTP=${staleConfirm.http}, code=${staleConfirm.body?.code ?? 'missing'}`, NEW_CONTRACT_OPTIONS) + + const recognizedValue = Number(original.result.ocrWeightValue) + const recognizedUnit = original.result.ocrWeightUnit + const canConfirmOriginal = Number.isFinite(recognizedValue) && recognizedValue > 0 + && ['KG', 'KGS', 'LB', 'LBS'].includes(String(recognizedUnit || '').trim().toUpperCase()) + const confirmPayload = canConfirmOriginal + ? { version: original.version } + : { + version: original.version, adjustedWeightValue: 1.234, adjustedWeightUnit: 'KG', + adjustmentReason: `${context.marker} OCR未返回有效重量,人工验收`, + } + const confirmResponse = await context.request('POST', + confirmPath(target.tenantId, target.inboundId, original.resultId), confirmPayload) + const confirmed = context.apiSuccess(MODULE, '确认 OCR 重量并计入实际总毛重', confirmResponse, + `usedOriginal=${canConfirmOriginal}`, NEW_CONTRACT_OPTIONS) + context.assert(MODULE, '确认结果状态、版本和最终KG正确', confirmResponse, + confirmed?.recognitionStatus === 'CONFIRMED' && Number(confirmed?.version) === original.version + 1 + && Number(confirmed?.finalWeightKg) > 0, + `status=${confirmed?.recognitionStatus ?? 'missing'}, version=${confirmed?.version ?? 'missing'}, finalKg=${confirmed?.finalWeightKg ?? 'missing'}`, + NEW_CONTRACT_OPTIONS) + original.version = Number(confirmed?.version ?? original.version) + const afterConfirm = await loadWorkspace(context, target, '确认后回查实际总毛重') + const expectedTotal = Number(baselineWeight || 0) + Number(confirmed?.finalWeightKg || 0) + context.assert(MODULE, '确认后实际总毛重按服务端结果重算', afterConfirm.response, + closeNumber(afterConfirm.workspace?.actualGrossWeightKg, expectedTotal), + `baseline=${baselineWeight ?? 'null'}, added=${confirmed?.finalWeightKg ?? 'missing'}, actual=${afterConfirm.workspace?.actualGrossWeightKg ?? 'missing'}`, + NEW_CONTRACT_OPTIONS) + + const staleDelete = await context.request('DELETE', + deletePath(target.tenantId, target.inboundId, original.resultId, Math.max(0, original.version - 1))) + context.assert(MODULE, '旧版本删除返回并发冲突', staleDelete, expectedConflict(staleDelete), + `HTTP=${staleDelete.http}, code=${staleDelete.body?.code ?? 'missing'}`, NEW_CONTRACT_OPTIONS) + const deletedOriginal = await deleteResult(context, target, original, '删除本轮已确认图片及重量结果') + if (deletedOriginal.passed) await verifyDeleted(context, target, original, baselineWeight) + + const manual = await createUploadedResult(context, target, image, { manual: true }) + created.push(manual) + context.createdResources.inboundWeightOcr.resultIds.push(manual.resultId) + await rejectWithoutMutation(context, target, manual, '零重量确认被拒绝', { + version: manual.version, adjustedWeightValue: 0, adjustedWeightUnit: 'KG', adjustmentReason: context.marker, + }) + await rejectWithoutMutation(context, target, manual, '负重量确认被拒绝', { + version: manual.version, adjustedWeightValue: -1, adjustedWeightUnit: 'KG', adjustmentReason: context.marker, + }) + await rejectWithoutMutation(context, target, manual, 'LB 0.001换算为零后被拒绝', { + version: manual.version, adjustedWeightValue: 0.001, adjustedWeightUnit: 'LB', adjustmentReason: context.marker, + }) + await rejectWithoutMutation(context, target, manual, '超出15位整数重量被拒绝', { + version: manual.version, adjustedWeightValue: 1_000_000_000_000_000, + adjustedWeightUnit: 'KG', adjustmentReason: context.marker, + }) + + const adjustedValue = 10.125 + const adjustedConfirmResponse = await context.request('POST', + confirmPath(target.tenantId, target.inboundId, manual.resultId), { + version: manual.version, adjustedWeightValue: adjustedValue, adjustedWeightUnit: 'LB', + adjustmentReason: `${context.marker} 人工确认 LB`, + }) + const adjusted = context.apiSuccess(MODULE, '人工改重与确认原子完成', adjustedConfirmResponse, + `adjusted=${adjustedValue} LB`, NEW_CONTRACT_OPTIONS) + const expectedKg = Math.round(adjustedValue * 0.45359237 * 1000) / 1000 + context.assert(MODULE, 'LB 人工改重保留输入并正确换算最终KG', adjustedConfirmResponse, + adjusted?.recognitionStatus === 'CONFIRMED' && Number(adjusted?.version) === manual.version + 2 + && closeNumber(adjusted?.adjustedWeightValue, adjustedValue) + && adjusted?.adjustedWeightUnit === 'LB' && closeNumber(adjusted?.finalWeightKg, expectedKg), + `adjusted=${adjusted?.adjustedWeightValue ?? 'missing'} ${adjusted?.adjustedWeightUnit ?? ''}, finalKg=${adjusted?.finalWeightKg ?? 'missing'}, expectedKg=${expectedKg}`, + NEW_CONTRACT_OPTIONS) + manual.version = Number(adjusted?.version ?? manual.version) + const deletedManual = await deleteResult(context, target, manual, '删除本轮人工改重图片及结果') + if (deletedManual.passed) await verifyDeleted(context, target, manual, baselineWeight) + } finally { + for (const item of created.filter((value) => !value.deleted)) { + await deleteResult(context, target, item, '异常收尾清理本轮重量结果', NEW_CONTRACT_OPTIONS) + } + const cleanup = await loadWorkspace(context, target, '最终清理后回查重量工作区') + const createdIds = new Set(created.map((item) => item.resultId)) + const leftovers = (cleanup.workspace?.weightResults || []).filter((row) => createdIds.has(id(row.id))) + const restored = leftovers.length === 0 && (baselineWeight == null + ? cleanup.workspace?.actualGrossWeightKg == null + : closeNumber(cleanup.workspace?.actualGrossWeightKg, baselineWeight)) + context.assert(MODULE, '仅清理本轮结果且订单总毛重恢复运行前基线', cleanup.response, + restored, `leftovers=${leftovers.length}, baseline=${baselineWeight ?? 'null'}, actual=${cleanup.workspace?.actualGrossWeightKg ?? 'null'}`, + NEW_CONTRACT_OPTIONS) + context.createdResources.inboundWeightOcr.cleaned = restored + } + + const steps = context.steps.slice(scenarioStart) + context.scenarios.push({ + name: SCENARIO, module: MODULE, success: steps.every((step) => step.passed), + deploymentBlocked: steps.some((step) => step.deploymentBlocker), + passed: steps.filter((step) => step.passed).length, + failed: steps.filter((step) => !step.passed).length, + }) +} diff --git a/scripts/admin-test-env-modules/master-data.mjs b/scripts/admin-test-env-modules/master-data.mjs new file mode 100644 index 000000000..03b49feef --- /dev/null +++ b/scripts/admin-test-env-modules/master-data.mjs @@ -0,0 +1,157 @@ +function id(value) { return value == null ? '' : String(value) } +function pageOk(value) { return Array.isArray(value?.records) && Number.isFinite(Number(value?.total)) } +function xlsxOk(response) { + return response.http === 200 && response.bytes?.length > 4 + && response.bytes[0] === 0x50 && response.bytes[1] === 0x4b +} + +export async function run(context) { + const module = 'master-data' + const suffix = context.marker.replace(/\D/g, '').slice(-12) + + const warehouseListResponse = await context.request('GET', '/api/platform/v1/warehouse-admin?page=1&size=20') + const warehousePage = context.apiSuccess(module, '查询平台仓库列表', warehouseListResponse) + context.assert(module, '仓库列表分页结构正确', warehouseListResponse, pageOk(warehousePage), `total=${warehousePage?.total ?? 'n/a'}`) + const warehousePayload = { + tenantId: 0, warehouseCode: `AW${suffix}`, warehouseName: `Admin验收仓-${suffix}`, + warehouseType: 'DOMESTIC', countryCode: 'CN', timezone: 'Asia/Shanghai', + contactName: '仓库验收员', contactPhone: '13800000001', contactEmail: `warehouse-${suffix}@example.com`, + status: 'ACTIVE', remark: context.marker, + address: { + addressType: 'WAREHOUSE', countryCode: 'CN', stateProvince: '广东省', city: '深圳市', + district: '南山区', postalCode: '518000', addressLine1: 'Admin API 验收仓地址', + addressLine2: null, latitude: null, longitude: null, + }, + capabilities: [{ capabilityCode: 'RECEIVING', capabilityName: '收货', enabled: true, cutoffTime: '16:00:00', description: context.marker }], + } + const createWarehouseResponse = await context.request('POST', '/api/platform/v1/warehouse-admin', warehousePayload) + const warehouseId = id(context.apiSuccess(module, '创建平台公共仓库', createWarehouseResponse)) + context.assert(module, '仓库创建返回字符串兼容 ID', createWarehouseResponse, Boolean(warehouseId), `warehouseId=${warehouseId || 'missing'}`) + if (!warehouseId) throw new Error('平台仓库创建失败,库位和托盘场景无法继续') + context.context.warehouseId = warehouseId + context.createdResources.warehouse = { id: warehouseId, code: warehousePayload.warehouseCode, finalStatus: 'INACTIVE' } + const warehousePath = `/api/platform/v1/warehouse-admin/${warehouseId}?tenantId=0` + const warehouseDetailResponse = await context.request('GET', warehousePath) + const warehouseDetail = context.apiSuccess(module, '查询平台仓库详情', warehouseDetailResponse) + context.assert(module, '仓库详情、地址和能力正确', warehouseDetailResponse, + id(warehouseDetail?.warehouse?.id) === warehouseId && warehouseDetail?.addresses?.length === 1 && warehouseDetail?.capabilities?.length === 1, + `addresses=${warehouseDetail?.addresses?.length ?? 'n/a'}, capabilities=${warehouseDetail?.capabilities?.length ?? 'n/a'}`) + const editedWarehouse = { ...warehousePayload, warehouseName: `${warehousePayload.warehouseName}-已编辑`, remark: `${context.marker}-EDITED` } + const updateWarehouseResponse = await context.request('PUT', warehousePath, editedWarehouse) + context.apiSuccess(module, '编辑平台仓库', updateWarehouseResponse) + const warehouseAfterEditResponse = await context.request('GET', warehousePath) + const warehouseAfterEdit = context.apiSuccess(module, '回查编辑后的平台仓库', warehouseAfterEditResponse) + context.assert(module, '仓库编辑已持久化', warehouseAfterEditResponse, + warehouseAfterEdit?.warehouse?.warehouseName === editedWarehouse.warehouseName && warehouseAfterEdit?.warehouse?.remark === editedWarehouse.remark, + `warehouseId=${warehouseId}`) + + const locationPayload = { + warehouseId, zoneCode: `Z${suffix.slice(-5)}`, zoneName: 'Admin验收区', + locationCode: `L${suffix}`, locationName: 'Admin验收库位', locationType: 'SHELF', + maxWeightKg: 1000, status: 'AVAILABLE', remark: context.marker, + } + const createLocationResponse = await context.request('POST', '/api/platform/v1/locations?tenantId=0', locationPayload) + const locationId = id(context.apiSuccess(module, '创建仓库库位', createLocationResponse)) + if (!locationId) throw new Error('库位创建失败') + context.createdResources.location = { id: locationId, warehouseId, deleted: false } + const locationPath = `/api/platform/v1/locations/${locationId}?tenantId=0&warehouseId=${warehouseId}` + const locationDetailResponse = await context.request('GET', locationPath) + const locationDetail = context.apiSuccess(module, '查询库位详情', locationDetailResponse) + context.assert(module, '库位详情关联正确仓库', locationDetailResponse, + id(locationDetail?.location?.id) === locationId && id(locationDetail?.location?.warehouseId) === warehouseId, + `locationId=${locationId}`) + const locationVersion = Number(locationDetail?.location?.version) + const updateLocationResponse = await context.request('PUT', locationPath, { ...locationPayload, locationName: 'Admin验收库位-已编辑', maxWeightKg: 1200, version: locationVersion }) + context.apiSuccess(module, '编辑库位', updateLocationResponse) + const locationAfterEditResponse = await context.request('GET', locationPath) + const locationAfterEdit = context.apiSuccess(module, '回查编辑后的库位', locationAfterEditResponse) + context.assert(module, '库位编辑与版本递增正确', locationAfterEditResponse, + locationAfterEdit?.location?.locationName === 'Admin验收库位-已编辑' && Number(locationAfterEdit?.location?.version) === locationVersion + 1, + `version=${locationAfterEdit?.location?.version ?? 'missing'}`) + const disabledLocationVersion = Number(locationAfterEdit?.location?.version) + const disableLocationResponse = await context.request('PATCH', `/api/platform/v1/locations/${locationId}/status?tenantId=0&warehouseId=${warehouseId}`, { status: 'DISABLED', version: disabledLocationVersion }) + context.apiSuccess(module, '停用库位', disableLocationResponse) + const deleteLocationResponse = await context.request('DELETE', `/api/platform/v1/locations/${locationId}?tenantId=0&warehouseId=${warehouseId}&version=${disabledLocationVersion + 1}`) + const deletedLocation = context.apiSuccess(module, '删除未占用测试库位', deleteLocationResponse) + if (deletedLocation === null && String(deleteLocationResponse.body?.code) === '200') context.createdResources.location.deleted = true + + const palletPayload = { warehouseId, palletType: 'STANDARD', capacityCbm: 1.5, weightKg: 25, color: 'BLUE', remark: context.marker } + const createPalletResponse = await context.request('POST', '/api/platform/v1/pallets?tenantId=0', palletPayload) + const palletId = id(context.apiSuccess(module, '创建仓库托盘', createPalletResponse)) + if (!palletId) throw new Error('托盘创建失败') + context.createdResources.pallet = { id: palletId, warehouseId, deleted: false } + const palletPath = `/api/platform/v1/pallets/${palletId}?tenantId=0&warehouseId=${warehouseId}` + const palletDetailResponse = await context.request('GET', palletPath) + const pallet = context.apiSuccess(module, '查询托盘详情', palletDetailResponse) + context.assert(module, '托盘详情关联正确仓库', palletDetailResponse, + id(pallet?.id) === palletId && id(pallet?.warehouseId) === warehouseId, `palletId=${palletId}`) + const updatePalletResponse = await context.request('PUT', palletPath, { ...palletPayload, capacityCbm: 1.75, weightKg: 26, remark: `${context.marker}-EDITED` }) + context.apiSuccess(module, '编辑托盘', updatePalletResponse) + const palletAfterEditResponse = await context.request('GET', palletPath) + const palletAfterEdit = context.apiSuccess(module, '回查编辑后的托盘', palletAfterEditResponse) + context.assert(module, '托盘编辑已持久化', palletAfterEditResponse, + Number(palletAfterEdit?.capacityCbm) === 1.75 && palletAfterEdit?.remark === `${context.marker}-EDITED`, `palletId=${palletId}`) + const deletePalletResponse = await context.request('DELETE', palletPath) + context.apiSuccess(module, '删除未使用测试托盘', deletePalletResponse) + if (String(deletePalletResponse.body?.code) === '200') context.createdResources.pallet.deleted = true + + const expressPayload = { + companyCode: `EX${suffix}`, companyName: `Admin验收快递-${suffix}`, servicePhone: '4000000000', + website: 'https://example.com', trackingUrlTemplate: 'https://example.com/{trackingNo}', status: 'ACTIVE', remark: context.marker, + } + const createExpressResponse = await context.request('POST', '/api/platform/v1/express-companies?tenantId=0', expressPayload) + const expressId = id(context.apiSuccess(module, '创建快递公司', createExpressResponse)) + if (!expressId) throw new Error('快递公司创建失败') + context.createdResources.expressCompany = { id: expressId, code: expressPayload.companyCode, finalStatus: 'INACTIVE' } + const expressPath = `/api/platform/v1/express-companies/${expressId}?tenantId=0` + const expressDetailResponse = await context.request('GET', expressPath) + const express = context.apiSuccess(module, '查询快递公司详情', expressDetailResponse) + context.assert(module, '快递公司详情正确', expressDetailResponse, id(express?.id) === expressId && express?.companyCode === expressPayload.companyCode, `expressId=${expressId}`) + const updateExpressResponse = await context.request('PUT', expressPath, { ...expressPayload, companyName: `${expressPayload.companyName}-已编辑`, remark: `${context.marker}-EDITED` }) + context.apiSuccess(module, '编辑快递公司', updateExpressResponse) + const disableExpressResponse = await context.request('PATCH', `/api/platform/v1/express-companies/${expressId}/status?tenantId=0`, { status: 'INACTIVE' }) + context.apiSuccess(module, '停用快递公司', disableExpressResponse) + const expressListResponse = await context.request('GET', `/api/platform/v1/express-companies?page=1&size=20&keyword=${expressPayload.companyCode}`) + const expressPage = context.apiSuccess(module, '筛选快递公司列表', expressListResponse) + context.assert(module, '快递公司列表回显停用状态', expressListResponse, + expressPage?.records?.some((item) => id(item.id) === expressId && item.status === 'INACTIVE'), `records=${expressPage?.records?.length ?? 'n/a'}`) + + const partnerPayload = { + partnerCode: `PT${suffix}`, partnerName: `Admin验收往来单位-${suffix}`, partnerType: 'SUPPLIER', types: ['SUPPLIER'], + contactName: '往来单位验收员', contactPhone: '13800000002', contactEmail: `partner-${suffix}@example.com`, + countryCode: 'CN', province: '广东省', city: '深圳市', district: '南山区', addressLine: 'Admin API 往来单位地址', + postalCode: '518000', status: 'ACTIVE', remark: context.marker, + } + const createPartnerResponse = await context.request('POST', '/api/platform/v1/partners?tenantId=0', partnerPayload) + const partnerId = id(context.apiSuccess(module, '创建往来单位', createPartnerResponse)) + if (!partnerId) throw new Error('往来单位创建失败') + context.createdResources.partner = { id: partnerId, code: partnerPayload.partnerCode, finalStatus: 'INACTIVE' } + const partnerPath = `/api/platform/v1/partners/${partnerId}?tenantId=0` + const partnerDetailResponse = await context.request('GET', partnerPath) + const partner = context.apiSuccess(module, '查询往来单位详情', partnerDetailResponse) + context.assert(module, '往来单位详情正确', partnerDetailResponse, + id(partner?.id) === partnerId && partner?.types?.includes('SUPPLIER'), `partnerId=${partnerId}`) + const updatePartnerResponse = await context.request('PUT', partnerPath, { ...partnerPayload, partnerName: `${partnerPayload.partnerName}-已编辑`, types: ['SUPPLIER', 'CARRIER'], remark: `${context.marker}-EDITED` }) + context.apiSuccess(module, '编辑往来单位', updatePartnerResponse) + const disablePartnerResponse = await context.request('PATCH', `/api/platform/v1/partners/${partnerId}/status?tenantId=0`, { status: 'INACTIVE' }) + context.apiSuccess(module, '停用往来单位', disablePartnerResponse) + const partnerListResponse = await context.request('GET', `/api/platform/v1/partners?page=1&size=20&keyword=${partnerPayload.partnerCode}`) + const partnerPage = context.apiSuccess(module, '筛选往来单位列表', partnerListResponse) + context.assert(module, '往来单位列表回显编辑与停用状态', partnerListResponse, + partnerPage?.records?.some((item) => id(item.id) === partnerId && item.status === 'INACTIVE' && item.types?.includes('CARRIER')), + `records=${partnerPage?.records?.length ?? 'n/a'}`) + + const templates = [ + ['仓库', '/api/platform/v1/warehouse-admin/import-template'], + ['快递公司', '/api/platform/v1/express-companies/import-template'], + ['往来单位', '/api/platform/v1/partners/import-template'], + ] + for (const [name, path] of templates) { + const response = await context.requestBinary('GET', path) + context.addStep(module, `下载${name}导入模板`, response, xlsxOk(response), + `bytes=${response.bytes?.length ?? 0}, contentType=${response.contentType || 'missing'}`) + } + + const disableWarehouseResponse = await context.request('PATCH', `/api/platform/v1/warehouse-admin/${warehouseId}/status?tenantId=0&status=INACTIVE`) + context.apiSuccess(module, '停用测试仓库', disableWarehouseResponse) +} diff --git a/scripts/admin-test-env-modules/orders.mjs b/scripts/admin-test-env-modules/orders.mjs new file mode 100644 index 000000000..d1faa2a1f --- /dev/null +++ b/scripts/admin-test-env-modules/orders.mjs @@ -0,0 +1,391 @@ +const MODULE = 'orders' +const CONTRACT_OPTIONS = { scenario: 'isolated-order-chain', deploymentBlocker: true } +const MERCHANT_USERNAME = process.env.MERCHANT_TEST_USERNAME || 'merchant_admin' +const MERCHANT_PASSWORD = process.env.MERCHANT_TEST_PASSWORD || 'ChangeMe123!' +const BOXES = [ + { boxType: 'SMALL', lengthCm: 30, widthCm: 20, heightCm: 20 }, + { boxType: 'MEDIUM', lengthCm: 40, widthCm: 30, heightCm: 30 }, + { boxType: 'LARGE', lengthCm: 50, widthCm: 40, heightCm: 40 }, + { boxType: 'EXTRA_LARGE', lengthCm: 60, widthCm: 50, heightCm: 50 }, +] +const MEASURABLE_STATUSES = new Set(['WAIT_MEASURE', 'MEASURING', 'MEASURE_REJECTED']) + +function id(value) { return value == null ? '' : String(value) } +function records(value) { return Array.isArray(value?.records) ? value.records : [] } +function pageOk(value) { return Array.isArray(value?.records) && Number.isFinite(Number(value?.total)) } +function success(response) { return response.http === 200 && String(response.body?.code) === '200' } +function sleep(milliseconds) { return new Promise((resolve) => setTimeout(resolve, milliseconds)) } +function key(context, operation) { return `${context.marker}-${operation}`.slice(0, 128) } +function tomorrow(days = 30) { + const date = new Date(); date.setUTCDate(date.getUTCDate() + days) + return date.toISOString().slice(0, 10) +} + +async function request(context, method, path, body, token, extraHeaders = {}) { + const headers = { Accept: 'application/json', Authorization: `Bearer ${token}`, ...extraHeaders } + let payload = body + if (body !== undefined && !(body instanceof FormData)) { + headers['Content-Type'] = 'application/json; charset=utf-8' + payload = JSON.stringify(body) + } + try { + const response = await fetch(`${context.options.gateway}${path}`, { + method, headers, body: payload, signal: AbortSignal.timeout(30_000), + }) + const content = await response.text() + let parsed = null + try { parsed = content ? JSON.parse(content) : null } catch { /* Recorded as a bounded raw response. */ } + return { + method, path, http: response.status, body: parsed, + raw: parsed === null ? content.slice(0, 500) : null, + requestId: parsed?.requestId || response.headers.get('x-request-id'), + traceId: parsed?.traceId || response.headers.get('x-trace-id'), + } + } catch (error) { + return { method, path, http: 0, body: null, raw: String(error), requestId: null, traceId: null } + } +} + +async function uploadProductImage(context, merchantToken) { + const form = new FormData() + const png = Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=', 'base64') + form.append('file', new Blob([png], { type: 'image/png' }), `product-${context.marker}.png`) + const response = await request(context, 'POST', '/api/merchant/v1/files/product-images', form, merchantToken) + const data = context.apiSuccess(MODULE, 'Client 上传产品图片', response, 'contentType=image/png', CONTRACT_OPTIONS) + context.assert(MODULE, '产品图片上传返回字符串文件 ID', response, + Boolean(data?.fileId) && typeof data.fileId === 'string' && data.contentType === 'image/png', + `fileIdType=${typeof data?.fileId}, contentType=${data?.contentType ?? 'missing'}`, CONTRACT_OPTIONS) + return id(data?.fileId) +} + +async function assertProductImageDownload(context, merchantToken, fileId) { + const path = `/api/merchant/v1/files/product-images/${encodeURIComponent(fileId)}` + try { + const response = await fetch(`${context.options.gateway}${path}`, { + headers: { Accept: 'image/*', Authorization: `Bearer ${merchantToken}` }, + signal: AbortSignal.timeout(30_000), + }) + const bytes = await response.arrayBuffer() + const evidence = { method: 'GET', path, http: response.status, body: null, raw: null, + requestId: response.headers.get('x-request-id'), traceId: response.headers.get('x-trace-id') } + context.assert(MODULE, 'Client 可下载本轮产品图片', evidence, + response.status === 200 && bytes.byteLength > 0 && (response.headers.get('content-type') || '').startsWith('image/'), + `bytes=${bytes.byteLength}, contentType=${response.headers.get('content-type') || 'missing'}`, CONTRACT_OPTIONS) + } catch (error) { + context.assert(MODULE, 'Client 可下载本轮产品图片', null, false, String(error), CONTRACT_OPTIONS) + } +} + +async function loadMasterData(context, merchantToken) { + const domesticResponse = await request(context, 'GET', + '/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC', undefined, merchantToken) + const domesticPage = context.apiSuccess(MODULE, 'Client 查询国内收货仓', domesticResponse) + context.assert(MODULE, '存在可用国内收货仓', domesticResponse, records(domesticPage).length > 0, + `count=${records(domesticPage).length}`) + + const fbaResponse = await request(context, 'GET', + '/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=FBA', undefined, merchantToken) + const fbaPage = context.apiSuccess(MODULE, 'Client 查询 FBA 目的仓', fbaResponse) + context.assert(MODULE, '存在可用 FBA 目的仓', fbaResponse, records(fbaPage).length > 0, + `count=${records(fbaPage).length}`) + const receiving = records(domesticPage)[0]; const destination = records(fbaPage)[0] + if (!receiving || !destination) throw new Error('缺少创建测试订单所需的收货仓或目的仓') + + const channelResponse = await request(context, 'GET', + `/api/merchant/v1/first-leg/pricing/channels?originWarehouseId=${encodeURIComponent(receiving.id)}`, + undefined, merchantToken) + const channels = context.apiSuccess(MODULE, 'Client 查询可用计费渠道', channelResponse) + const channel = Array.isArray(channels) + ? channels.find((item) => Array.isArray(item.pricingTaxModes) && item.pricingTaxModes.length > 0) + : null + context.assert(MODULE, '存在带计价税制的可用渠道', channelResponse, Boolean(channel), + `count=${Array.isArray(channels) ? channels.length : 'n/a'}`) + if (!channel) throw new Error('缺少创建测试订单所需的可用渠道') + + const partnerResponse = await request(context, 'GET', + '/api/merchant/v1/partners/candidates?type=SHIPPER', undefined, merchantToken) + const partners = context.apiSuccess(MODULE, 'Client 查询发货客户候选', partnerResponse) + const partner = Array.isArray(partners) + ? partners.find((item) => item.status === 'ACTIVE' && item.types?.includes?.('SHIPPER')) + : null + return { receiving, destination, channel, partner } +} + +function buildPayload(context, profile, master, productImageFileId) { + const shipmentId = `SHIP-${context.marker}`.slice(0, 64) + const referenceId = `REF-${context.marker}`.slice(0, 64) + const companyName = profile.tenantName || `订单验收客户-${context.marker}` + return { + customerId: master.partner?.id ?? null, + customerName: master.partner?.partnerName ?? companyName, + transportMode: 'SEA', tradeTerm: 'FOB', + destinationCountryCode: master.destination.countryCode || 'US', + destinationWarehouseId: master.destination.id, + destinationWarehouseName: master.destination.warehouseName, + expectedShipDate: tomorrow(), customerRemark: `${context.marker} Client 创建隔离订单`, + pickupMethod: 'PICKUP', receivingWarehouseId: master.receiving.id, + receivingWarehouseName: master.receiving.warehouseName, + channelCode: master.channel.channelCode, channelName: master.channel.channelName, + carrierId: null, carrierName: null, taxMode: 'BUY_DECLARATION', + pricingTaxMode: master.channel.pricingTaxModes[0], containerMode: 'LCL', + customsInspection: false, destinationType: 'FBA', + amazonWarehouseCode: master.destination.warehouseCode, + shipmentId, referenceId, + sender: { + companyName, contactName: '订单验收联系人', phone: '13800138000', + email: 'order-acceptance@example.com', countryCode: 'CN', province: '广东省', + city: '深圳市', district: '南山区', addressLine: `${context.marker} 测试地址`, postalCode: '518000', + }, + receiver: null, + cargoes: BOXES.map((box, index) => { + const volumeCbm = box.lengthCm * box.widthCm * box.heightCm / 1_000_000 + const unitsPerPackage = 10 + index + return { + skuNo: `SKU-${box.boxType}-${context.marker}`.slice(0, 64), + cargoName: `${box.boxType} 测试产品`, cargoNameEn: `${box.boxType} test product`, + hsCode: '8518210000', customsHsCode: '8518210000', packageType: 'CARTON', + lengthCm: box.lengthCm, widthCm: box.widthCm, heightCm: box.heightCm, + unitsPerPackage, packageCount: 1, grossWeightKg: 10 + index, + volumeCbm, totalQuantity: unitsPerPackage, netWeightKg: 9 + index, + unitDeclaredValue: 8.5, declaredValue: unitsPerPackage * 8.5, currency: 'USD', + material: '塑料 / Plastic', usage: '接口验收 / API acceptance', + model: `MODEL-${box.boxType}`, brand: 'TEST-NO-LOGO', + productLengthCm: 12 + index, productWidthCm: 8 + index, productHeightCm: 6 + index, + shipmentId, referenceId, upcNo: `${Date.now()}${index}`.slice(-12), + productImageFileId, dangerousGoods: false, + cargoRemark: `${context.marker} boxType=${box.boxType}`, + } + }), + } +} + +function assertCargoContract(context, response, cargoes, payload) { + const complete = Array.isArray(cargoes) && cargoes.length === BOXES.length + && BOXES.every((box, index) => { + const actual = cargoes[index]; const expected = payload.cargoes[index] + return Number(actual?.lengthCm) === box.lengthCm && Number(actual?.widthCm) === box.widthCm + && Number(actual?.heightCm) === box.heightCm && id(actual?.productImageFileId) === id(expected.productImageFileId) + && actual?.skuNo === expected.skuNo && actual?.cargoName === expected.cargoName + && actual?.cargoNameEn === expected.cargoNameEn && actual?.customsHsCode === expected.customsHsCode + && Number(actual?.unitsPerPackage) === expected.unitsPerPackage + && Number(actual?.packageCount) === 1 && Number(actual?.totalQuantity) === expected.totalQuantity + && Number(actual?.netWeightKg) === expected.netWeightKg + && Number(actual?.unitDeclaredValue) === expected.unitDeclaredValue + && actual?.material === expected.material && actual?.productUsage === expected.usage + && actual?.model === expected.model && actual?.brand === expected.brand + && Number(actual?.productLengthCm) === expected.productLengthCm + && Number(actual?.productWidthCm) === expected.productWidthCm + && Number(actual?.productHeightCm) === expected.productHeightCm + && actual?.shipmentId === expected.shipmentId && actual?.referenceId === expected.referenceId + && actual?.upcNo === expected.upcNo && actual?.cargoRemark.includes(context.marker) + }) + context.assert(MODULE, '四箱型产品字段及图片契约完整回显', response, complete, + `cargoes=${Array.isArray(cargoes) ? cargoes.length : 'n/a'}, imageFileId=${payload.cargoes[0].productImageFileId}`, + CONTRACT_OPTIONS) +} + +async function assertDimensionConfig(context, tenantId) { + const path = `/api/platform/v1/first-leg/customer-dimension-config?tenantId=${encodeURIComponent(tenantId)}` + const response = await context.request('GET', path) + const data = context.apiSuccess(MODULE, 'Admin 查询客户固定箱型', response, `tenantId=${tenantId}`, CONTRACT_OPTIONS) + const rules = Array.isArray(data?.rules) ? data.rules : [] + const exact = BOXES.every((box, index) => { + const rule = rules[index] + return rule?.boxType === box.boxType && Number(rule.innerLengthCm) === box.lengthCm + && Number(rule.innerWidthCm) === box.widthCm && Number(rule.innerHeightCm) === box.heightCm + && Number(rule.edgeAdditionCm) === 2 + }) + context.assert(MODULE, '固定四箱型顺序、内径及每边加2cm正确', response, + rules.length === BOXES.length && exact, + `types=${rules.map((rule) => rule.boxType).join(',') || 'missing'}`, CONTRACT_OPTIONS) +} + +async function waitForInbound(context, tenantId, orderId) { + const path = `/api/platform/v1/orders/${encodeURIComponent(orderId)}?tenantId=${encodeURIComponent(tenantId)}` + let response = null; let detail = null + for (let attempt = 1; attempt <= 20; attempt += 1) { + response = await context.request('GET', path) + if (success(response) && response.body?.data?.summary?.inboundId) { + detail = response.body.data + break + } + if (attempt < 20) await sleep(1_000) + } + context.addStep(MODULE, '审核后生成隔离入库单', response, Boolean(detail), + detail ? `inboundId=${detail.summary.inboundId}` : '20秒内未返回 inboundId', CONTRACT_OPTIONS) + return { response, detail } +} + +export async function run(context) { + const loginResponse = await context.request('POST', '/api/auth/login', { + username: MERCHANT_USERNAME, password: MERCHANT_PASSWORD, + }, '') + const login = context.apiSuccess(MODULE, 'Client 测试账号登录', loginResponse, + `username=${MERCHANT_USERNAME}`) + const merchantToken = login?.accessToken + if (!merchantToken) throw new Error('Client 登录未返回 accessToken') + + const profileResponse = await request(context, 'GET', '/api/merchant/v1/iam/tenant/profile', + undefined, merchantToken) + const profile = context.apiSuccess(MODULE, 'Client 查询当前企业资料', profileResponse) + const tenantId = id(profile?.id) + context.assert(MODULE, 'Client 测试企业已审核且客户 ID 有效', profileResponse, + Boolean(tenantId) && profile?.status === 'ACTIVE', `tenantId=${tenantId || 'missing'}, status=${profile?.status ?? 'missing'}`) + if (!tenantId) throw new Error('Client 企业资料未返回客户 ID') + + await assertDimensionConfig(context, tenantId) + const master = await loadMasterData(context, merchantToken) + const productImageFileId = await uploadProductImage(context, merchantToken) + if (!productImageFileId) throw new Error('产品图片新契约未部署,无法创建带图片的隔离订单') + await assertProductImageDownload(context, merchantToken, productImageFileId) + + const payload = buildPayload(context, profile, master, productImageFileId) + const createPath = '/api/merchant/v1/orders/first-leg' + const createResponse = await request(context, 'POST', createPath, payload, merchantToken, + { 'Idempotency-Key': key(context, 'client-create') }) + const orderId = id(context.apiSuccess(MODULE, 'Client 创建四箱型隔离订单', createResponse, + `marker=${context.marker}`, CONTRACT_OPTIONS)) + if (!orderId) throw new Error('Client 订单创建失败,后续 Admin 链路停止') + context.createdResources.orders = { + marker: context.marker, tenantId, orderId, productImageFileId, + boxTypes: BOXES.map((box) => box.boxType), inboundId: null, + } + + const replayResponse = await request(context, 'POST', createPath, payload, merchantToken, + { 'Idempotency-Key': key(context, 'client-create') }) + const replayedId = id(context.apiSuccess(MODULE, 'Client 创建订单幂等重放', replayResponse)) + context.assert(MODULE, 'Client 创建幂等结果一致', replayResponse, replayedId === orderId, + `orderId=${orderId}, replayedId=${replayedId}`) + + const clientDetailPath = `/api/merchant/v1/orders/first-leg/${encodeURIComponent(orderId)}` + const draftResponse = await request(context, 'GET', clientDetailPath, undefined, merchantToken) + const draft = context.apiSuccess(MODULE, 'Client 查询隔离订单草稿', draftResponse) + const orderNo = id(draft?.order?.orderNo) + context.assert(MODULE, 'Client 草稿身份、marker 和状态正确', draftResponse, + id(draft?.order?.id) === orderId && draft?.order?.status === 'DRAFT' + && String(draft?.order?.customerRemark || '').includes(context.marker), + `orderNo=${orderNo || 'missing'}, status=${draft?.order?.status ?? 'missing'}`) + assertCargoContract(context, draftResponse, draft?.cargoes, payload) + context.createdResources.orders.orderNo = orderNo + + const submitResponse = await request(context, 'POST', `${clientDetailPath}/submit`, undefined, + merchantToken, { 'Idempotency-Key': key(context, 'client-submit') }) + context.apiSuccess(MODULE, 'Client 提交隔离订单', submitResponse, `orderId=${orderId}`) + const submittedResponse = await request(context, 'GET', clientDetailPath, undefined, merchantToken) + const submitted = context.apiSuccess(MODULE, 'Client 回查已提交订单', submittedResponse) + context.assert(MODULE, 'Client 订单已进入待审核状态', submittedResponse, + submitted?.order?.status === 'SUBMITTED', `status=${submitted?.order?.status ?? 'missing'}`) + + const unifiedListResponse = await context.request('GET', + `/api/platform/v1/orders?page=1&size=100&tenantId=${encodeURIComponent(tenantId)}&orderNo=${encodeURIComponent(orderNo)}`) + const unifiedPage = context.apiSuccess(MODULE, 'Admin 查询统一订单列表', unifiedListResponse) + const unifiedRow = records(unifiedPage).find((row) => id(row.orderId) === orderId) + context.assert(MODULE, 'Admin 统一订单列表只核对本轮订单', unifiedListResponse, + pageOk(unifiedPage) && Boolean(unifiedRow), `orderId=${orderId}, found=${Boolean(unifiedRow)}`) + + const unifiedDetailPath = `/api/platform/v1/orders/${encodeURIComponent(orderId)}?tenantId=${encodeURIComponent(tenantId)}` + const unifiedDetailResponse = await context.request('GET', unifiedDetailPath) + const unifiedDetail = context.apiSuccess(MODULE, 'Admin 查询统一订单详情', unifiedDetailResponse) + context.assert(MODULE, 'Admin 统一订单详情身份与待审核状态正确', unifiedDetailResponse, + id(unifiedDetail?.summary?.orderId) === orderId && unifiedDetail?.summary?.mainStatus === 'PENDING_REVIEW' + && Array.isArray(unifiedDetail?.timeline), + `mainStatus=${unifiedDetail?.summary?.mainStatus ?? 'missing'}, timeline=${unifiedDetail?.timeline?.length ?? 'n/a'}`) + + const firstLegListResponse = await context.request('GET', + `/api/platform/v1/orders/first-leg?tenantId=${encodeURIComponent(tenantId)}&keyword=${encodeURIComponent(orderNo)}&page=1&size=100`) + const firstLegPage = context.apiSuccess(MODULE, 'Admin 查询头程订单列表', firstLegListResponse) + const firstLegRow = records(firstLegPage).find((row) => id(row.id) === orderId) + context.assert(MODULE, 'Admin 头程订单列表只核对本轮订单', firstLegListResponse, + pageOk(firstLegPage) && Boolean(firstLegRow), `orderId=${orderId}, found=${Boolean(firstLegRow)}`) + + const firstLegDetailPath = `/api/platform/v1/orders/first-leg/${encodeURIComponent(orderId)}?tenantId=${encodeURIComponent(tenantId)}` + const firstLegDetailResponse = await context.request('GET', firstLegDetailPath) + const firstLegDetail = context.apiSuccess(MODULE, 'Admin 查询头程订单详情', firstLegDetailResponse) + context.assert(MODULE, 'Admin 头程订单详情聚合结构完整', firstLegDetailResponse, + id(firstLegDetail?.order?.id) === orderId && Array.isArray(firstLegDetail?.cargoes) + && Array.isArray(firstLegDetail?.parties) && Array.isArray(firstLegDetail?.internalNotes) + && Array.isArray(firstLegDetail?.statusHistory), + `cargoes=${firstLegDetail?.cargoes?.length ?? 'n/a'}, history=${firstLegDetail?.statusHistory?.length ?? 'n/a'}`) + assertCargoContract(context, firstLegDetailResponse, firstLegDetail?.cargoes, payload) + + const noteResponse = await context.request('POST', + `/api/platform/v1/orders/first-leg/${encodeURIComponent(orderId)}/internal-notes?tenantId=${encodeURIComponent(tenantId)}`, + { content: `${context.marker} Admin 订单链路验收` }) + context.apiSuccess(MODULE, 'Admin 为本轮订单添加内部备注', noteResponse) + + const approveResponse = await context.request('POST', + `/api/platform/v1/orders/first-leg/${encodeURIComponent(orderId)}/approve?tenantId=${encodeURIComponent(tenantId)}`) + context.apiSuccess(MODULE, 'Admin 审核通过本轮订单', approveResponse, `orderId=${orderId}`) + + const inboundResult = await waitForInbound(context, tenantId, orderId) + const inboundId = id(inboundResult.detail?.summary?.inboundId) + if (!inboundId) throw new Error('订单审核后的入库单契约未部署,无法向 OCR/墨家模块交接') + + const inboundPath = `/api/platform/inbounds/${encodeURIComponent(inboundId)}?tenantId=${encodeURIComponent(tenantId)}` + const inboundResponse = await context.request('GET', inboundPath) + const inbound = context.apiSuccess(MODULE, 'Admin 查询本轮入库单详情', inboundResponse, + `inboundId=${inboundId}`, CONTRACT_OPTIONS) + const markerValues = [ + inbound?.publicRemark, inbound?.summary?.orderNo, inbound?.summary?.inboundCode, + ...(Array.isArray(inbound?.internalNotes) ? inbound.internalNotes.map((note) => note.content) : []), + ] + const markerFound = markerValues.some((value) => String(value || '').includes(context.marker)) + const measurable = MEASURABLE_STATUSES.has(inbound?.summary?.processStatus) + context.assert(MODULE, '隔离入库单 marker 来源与可测量状态正确', inboundResponse, + id(inbound?.summary?.id) === inboundId && id(inbound?.summary?.tenantId) === tenantId + && markerFound && measurable, + `markerFound=${markerFound}, status=${inbound?.summary?.processStatus ?? 'missing'}`, CONTRACT_OPTIONS) + context.assert(MODULE, '入库单详情包含托盘库位、文件、备注和状态历史', inboundResponse, + Array.isArray(inbound?.palletLocations) && Array.isArray(inbound?.files) + && Array.isArray(inbound?.internalNotes) && Array.isArray(inbound?.statusHistory), + `inboundId=${inboundId}, history=${inbound?.statusHistory?.length ?? 'n/a'}`) + + const inboundListResponse = await context.request('GET', + `/api/platform/inbounds?tenantId=${encodeURIComponent(tenantId)}&inboundCode=${encodeURIComponent(inbound.summary.inboundCode)}&page=1&size=100`) + const inboundPage = context.apiSuccess(MODULE, 'Admin 查询入库单列表', inboundListResponse) + context.assert(MODULE, 'Admin 入库单列表只核对本轮入库单', inboundListResponse, + pageOk(inboundPage) && records(inboundPage).some((row) => id(row.id) === inboundId), + `inboundId=${inboundId}, total=${inboundPage?.total ?? 'n/a'}`) + + context.createdResources.orders.inboundId = inboundId + context.createdResources.orders.inboundCode = inbound.summary.inboundCode + context.createdResources.orders.processStatus = inbound.summary.processStatus + context.createdResources.ocrInbound = { tenantId, inboundId, marker: context.marker } + context.createdResources.testInbound = { tenantId, inboundId, marker: context.marker } + context.context.inboundWeightOcr = { tenantId, inboundId, marker: context.marker } + context.context.ocrInbound = context.context.inboundWeightOcr + context.context.testInbound = context.context.inboundWeightOcr + context.context.createdInbound = context.context.inboundWeightOcr + + const taskResponse = await context.request('GET', + `/api/platform/v1/first-leg/tasks/by-order/${encodeURIComponent(orderId)}?tenantId=${encodeURIComponent(tenantId)}`) + const task = context.apiSuccess(MODULE, 'Admin 查询本轮订单履约任务', taskResponse, + '新订单应生成可查询的履约任务', CONTRACT_OPTIONS) + context.assert(MODULE, '履约任务与本轮订单和客户一致', taskResponse, + id(task?.orderId) === orderId && id(task?.tenantId) === tenantId, + `taskId=${id(task?.id) || 'missing'}, status=${task?.status ?? 'missing'}`, CONTRACT_OPTIONS) + if (task?.id) { + context.createdResources.orders.taskId = id(task.id) + const historyResponse = await context.request('GET', + `/api/platform/v1/first-leg/tasks/${encodeURIComponent(task.id)}/assignment-history?tenantId=${encodeURIComponent(tenantId)}&page=1&size=20`) + const history = context.apiSuccess(MODULE, 'Admin 查询本轮履约任务分配历史', historyResponse) + context.assert(MODULE, '履约分配历史分页结构正确', historyResponse, pageOk(history), + `taskId=${task.id}, total=${history?.total ?? 'n/a'}`) + } + + const acceptResponse = await context.request('POST', + `/api/platform/v1/orders/first-leg/${encodeURIComponent(orderId)}/accept?tenantId=${encodeURIComponent(tenantId)}`) + context.apiSuccess(MODULE, 'Admin 受理本轮订单', acceptResponse) + const startResponse = await context.request('POST', + `/api/platform/v1/orders/first-leg/${encodeURIComponent(orderId)}/start?tenantId=${encodeURIComponent(tenantId)}`) + context.apiSuccess(MODULE, 'Admin 启动本轮订单履约', startResponse) + + const finalDetailResponse = await context.request('GET', firstLegDetailPath) + const finalDetail = context.apiSuccess(MODULE, 'Admin 回查本轮订单履约状态', finalDetailResponse) + context.assert(MODULE, '本轮订单已进入处理中且保留状态历史', finalDetailResponse, + finalDetail?.order?.status === 'PROCESSING' + && finalDetail?.statusHistory?.some?.((item) => item.toStatus === 'APPROVED') + && finalDetail?.statusHistory?.some?.((item) => item.toStatus === 'ACCEPTED') + && finalDetail?.statusHistory?.some?.((item) => item.toStatus === 'PROCESSING'), + `status=${finalDetail?.order?.status ?? 'missing'}, history=${finalDetail?.statusHistory?.length ?? 'n/a'}`) +} diff --git a/scripts/admin-test-env-modules/pricing.mjs b/scripts/admin-test-env-modules/pricing.mjs new file mode 100644 index 000000000..1853dbf82 --- /dev/null +++ b/scripts/admin-test-env-modules/pricing.mjs @@ -0,0 +1,314 @@ +import { createHash } from 'node:crypto' +import { readFile } from 'node:fs/promises' +import { basename } from 'node:path' + +const PRICE_BOOK_PATH = '/api/platform/v1/fba-pricing/carrier-rates/price-books' +const DOMESTIC_WAREHOUSE_PATH = '/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC' +const OVERSEAS_WAREHOUSE_PATH = '/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE&warehouseType=OVERSEAS' +const DEFAULT_PRICE_BOOK_FILE = 'C:\\Users\\BY-OY\\Documents\\WXWork\\1688854456873012\\Cache\\File\\2026-08\\2026.08.03柏悦价格表 船期2026.08.12.xlsx' +const EXPECTED_CHANNEL_CODES = [ + 'MATSON_CLX_TRUCK', 'MATSON_MAX_TRUCK', 'EXX_TRUCK', 'HEDE_TRUCK', 'EXX_RAIL_NY', + 'OA_LA_TRUCK', 'OA_LA_FULL_TRUCK', 'OA_CHICAGO_RAIL', 'OA_HOUSTON_TRUCK', + 'OA_NEW_YORK_TRUCK', 'OA_SAVANNAH_TRUCK', 'MATSON_CLX_PARCEL', + 'MATSON_MAX_PARCEL', 'HEDE_PARCEL', 'OA_PARCEL', +] +const MAPPING_ISSUE_CODES = new Set([ + 'ORIGIN_MAPPING_REQUIRED', + 'ORIGIN_WAREHOUSE_INVALID', + 'OVERSEAS_MAPPING_REQUIRED', + 'OVERSEAS_WAREHOUSE_INVALID', + 'WAREHOUSE_VALIDATION_FAILED', + 'DUPLICATE_ORIGIN_MAPPING', + 'DUPLICATE_OVERSEAS_MAPPING', + 'UNUSED_ORIGIN_MAPPING', + 'UNUSED_OVERSEAS_MAPPING', + 'DUPLICATE_WAREHOUSE_MAPPING', + 'DUPLICATE_RATE', +]) + +function sha256(bytes) { + return createHash('sha256').update(bytes).digest('hex') +} + +function normalize(value) { + return String(value || '').trim().toUpperCase() +} + +function validId(value) { + return typeof value === 'string' && /^[1-9][0-9]*$/.test(value) +} + +function finishScenario(context, module, scenario, start) { + const steps = context.steps.slice(start) + context.scenarios.push({ + name: scenario, + module, + success: steps.every((step) => step.passed), + deploymentBlocked: steps.some((step) => step.deploymentBlocker), + passed: steps.filter((step) => step.passed).length, + failed: steps.filter((step) => !step.passed).length, + }) +} + +async function uploadWorkbook(context, bytes, fileName) { + const form = new FormData() + form.append('file', new Blob([bytes], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }), fileName) + try { + const response = await fetch(`${context.options.gateway}${PRICE_BOOK_PATH}`, { + method: 'POST', + headers: { Accept: 'application/json', Authorization: `Bearer ${context.token}` }, + body: form, + signal: AbortSignal.timeout(120_000), + }) + const content = await response.text() + let payload = null + try { payload = content ? JSON.parse(content) : null } catch { /* Raw response is diagnostic evidence. */ } + return { + method: 'POST', path: PRICE_BOOK_PATH, http: response.status, body: payload, + raw: payload === null ? content.slice(0, 500) : null, + requestId: payload?.requestId || response.headers.get('x-request-id'), + traceId: payload?.traceId || response.headers.get('x-trace-id'), + } + } catch (error) { + return { + method: 'POST', path: PRICE_BOOK_PATH, http: 0, body: null, + raw: error instanceof Error ? error.message : String(error), + requestId: null, traceId: null, + } + } +} + +function buildMappings(detail, warehouses) { + const domestic = warehouses.filter((warehouse) => warehouse.status === 'ACTIVE' && warehouse.warehouseType === 'DOMESTIC') + const overseas = warehouses.filter((warehouse) => warehouse.status === 'ACTIVE' && warehouse.warehouseType === 'OVERSEAS') + const originSources = new Map() + const overseasSources = new Map() + + for (const rate of detail.rates || []) { + const originCode = String(rate.originWarehouseCode || '').trim() + if (originCode && !originSources.has(normalize(originCode))) originSources.set(normalize(originCode), originCode) + if (rate.destinationType === 'OVERSEAS' && String(rate.destinationName || '').trim()) { + const sourceName = String(rate.destinationName).trim() + const key = normalize(sourceName) + if (!overseasSources.has(key)) overseasSources.set(key, { + sourceName, + destinationCode: String(rate.destinationCode || '').trim(), + }) + } + } + + const originMappings = [] + const missingOrigins = [] + for (const sourceCode of originSources.values()) { + const matches = domestic.filter((warehouse) => normalize(warehouse.warehouseCode) === normalize(sourceCode)) + if (matches.length === 1) originMappings.push({ originWarehouseCode: sourceCode, warehouseId: String(matches[0].id) }) + else missingOrigins.push(`${sourceCode}:${matches.length}`) + } + + const overseasMappings = [] + const missingOverseas = [] + for (const source of overseasSources.values()) { + const matches = overseas.filter((warehouse) => ( + source.destinationCode + ? normalize(warehouse.warehouseCode) === normalize(source.destinationCode) + : normalize(warehouse.warehouseName) === normalize(source.sourceName) + )) + if (matches.length === 1) overseasMappings.push({ sourceDestinationName: source.sourceName, warehouseId: String(matches[0].id) }) + else missingOverseas.push(`${source.sourceName}/${source.destinationCode || '-'}:${matches.length}`) + } + return { originMappings, overseasMappings, missingOrigins, missingOverseas, originSources, overseasSources } +} + +export async function run(context) { + const module = 'pricing' + const scenario = 'price-book-lifecycle' + const start = context.steps.length + const blocker = { scenario, deploymentBlocker: true } + + const listBeforeResponse = await context.request('GET', PRICE_BOOK_PATH) + const versionsBefore = context.apiSuccess(module, '查询发布前船期价格版本', listBeforeResponse, '', blocker) + const activeBefore = Array.isArray(versionsBefore) ? versionsBefore.filter((version) => version.status === 'ACTIVE') : [] + context.assert(module, '发布前最多一份生效版本', listBeforeResponse, + Array.isArray(versionsBefore) && activeBefore.length <= 1, + `versions=${Array.isArray(versionsBefore) ? versionsBefore.length : 'n/a'}, active=${activeBefore.length}`, blocker) + + const sourcePath = process.env.ADMIN_TEST_PRICE_BOOK_FILE || DEFAULT_PRICE_BOOK_FILE + let sourceBytes + try { + sourceBytes = await readFile(sourcePath) + } catch (error) { + context.addStep(module, '读取船期价格测试文件', null, false, + `path=${sourcePath}, error=${error instanceof Error ? error.message : String(error)}`, blocker) + finishScenario(context, module, scenario, start) + return + } + const sourceHash = sha256(sourceBytes) + const uploadName = `${context.marker}-${basename(sourcePath)}` + context.addStep(module, '船期价格测试文件已隔离', null, + sourceBytes.length > 0 && uploadName.includes(context.marker) && uploadName.toLowerCase().endsWith('.xlsx'), + `fileName=${uploadName}, bytes=${sourceBytes.length}, sha256=${sourceHash}`, blocker) + + const uploadResponse = await uploadWorkbook(context, sourceBytes, uploadName) + const uploaded = context.apiSuccess(module, '上传并解析船期价格表', uploadResponse, + `fileName=${uploadName}, bytes=${sourceBytes.length}, sha256=${sourceHash}`, blocker) + if (!uploaded?.version) { + finishScenario(context, module, scenario, start) + return + } + + const versionId = String(uploaded.version.id || '') + context.createdResources.priceBookVersion = { versionId, marker: context.marker, sourceSha256: sourceHash } + context.assert(module, '上传返回隔离的待确认版本', uploadResponse, + validId(versionId) + && uploaded.version.status === 'PENDING_CONFIRMATION' + && uploaded.version.originalFileName === uploadName + && uploaded.version.sourceSha256 === sourceHash, + `versionId=${versionId}, status=${uploaded.version.status}, fileName=${uploaded.version.originalFileName}, shaMatched=${uploaded.version.sourceSha256 === sourceHash}`, blocker) + + const channels = Array.isArray(uploaded.channels) ? uploaded.channels : [] + const rates = Array.isArray(uploaded.rates) ? uploaded.rates : [] + const issues = Array.isArray(uploaded.issues) ? uploaded.issues : [] + const channelCodes = channels.map((channel) => String(channel.channelCode)) + const channelSet = new Set(channelCodes) + const expectedChannels = EXPECTED_CHANNEL_CODES.every((code) => channelSet.has(code)) + context.assert(module, '解析出15个固定渠道且编码唯一', uploadResponse, + channels.length === EXPECTED_CHANNEL_CODES.length && channelSet.size === channels.length && expectedChannels + && Number(uploaded.version.channelCount) === channels.length, + `channelCount=${channels.length}, unique=${channelSet.size}, missing=${EXPECTED_CHANNEL_CODES.filter((code) => !channelSet.has(code)).join(',') || 'none'}`, blocker) + const ratesValid = rates.length > 0 && rates.every((rate) => ( + channelSet.has(String(rate.channelCode)) + && ['FBA_WAREHOUSE_RATE', 'REGION_WEIGHT_TIER'].includes(String(rate.priceModel)) + && String(rate.originWarehouseCode || '').trim() + && ['KG', 'CBM'].includes(String(rate.chargeUnit)) + && Number(rate.unitPrice) > 0 + && /^[A-Z]{3}$/.test(String(rate.currency || '')) + && String(rate.sourceSheetName || '').trim() + && Number(rate.sourceRowNumber) >= 1 + )) + context.assert(module, '解析价格行完整且可追溯到 Excel', uploadResponse, + ratesValid && Number(uploaded.version.rateCount) === rates.length, + `rateCount=${rates.length}, declared=${uploaded.version.rateCount}, valid=${ratesValid}`, blocker) + + const blockingIssues = issues.filter((issue) => issue.severity === 'BLOCKING') + const unexpectedBlocking = blockingIssues.filter((issue) => !MAPPING_ISSUE_CODES.has(issue.issueCode)) + const infrastructureIssue = issues.find((issue) => issue.issueCode === 'UPLOAD_OR_PARSE_FAILED' + || /SQLSyntaxError|bad SQL grammar|Service Unavailable/i.test(String(issue.message || ''))) + context.assert(module, '解析阻断仅包含可确认的仓库映射问题', uploadResponse, + !infrastructureIssue && unexpectedBlocking.length === 0 + && Number(uploaded.version.blockingErrorCount) === blockingIssues.length, + `blocking=${blockingIssues.length}, unexpected=${[...new Set(unexpectedBlocking.map((issue) => issue.issueCode))].join(',') || 'none'}, infrastructure=${infrastructureIssue?.issueCode || 'none'}`, blocker) + + const listPendingResponse = await context.request('GET', PRICE_BOOK_PATH) + const versionsPending = context.apiSuccess(module, '上传后回查价格版本列表', listPendingResponse, '', blocker) + const pendingEntry = versionsPending?.find?.((version) => String(version.id) === versionId) + const activeAfterUpload = versionsPending?.filter?.((version) => version.status === 'ACTIVE') || [] + context.assert(module, '上传只生成待确认版本且不替换当前生效版本', listPendingResponse, + pendingEntry?.status === 'PENDING_CONFIRMATION' + && activeAfterUpload.length === activeBefore.length + && activeBefore.every((before) => activeAfterUpload.some((after) => String(after.id) === String(before.id))), + `pending=${pendingEntry?.status || 'missing'}, activeBefore=${activeBefore.map((item) => item.id).join(',') || 'none'}, activeAfterUpload=${activeAfterUpload.map((item) => item.id).join(',') || 'none'}`, blocker) + + const detailResponse = await context.request('GET', `${PRICE_BOOK_PATH}/${encodeURIComponent(versionId)}`) + const detail = context.apiSuccess(module, '查询待确认版本渠道和价格预览', detailResponse, '', blocker) + context.assert(module, '详情与上传解析结果一致', detailResponse, + String(detail?.version?.id) === versionId + && detail?.version?.status === 'PENDING_CONFIRMATION' + && detail?.channels?.length === channels.length + && detail?.rates?.length === rates.length + && detail?.issues?.length === issues.length, + `versionId=${detail?.version?.id || 'missing'}, channels=${detail?.channels?.length ?? 'n/a'}, rates=${detail?.rates?.length ?? 'n/a'}, issues=${detail?.issues?.length ?? 'n/a'}`, blocker) + + const sourceResponse = await context.requestBinary('GET', `${PRICE_BOOK_PATH}/${encodeURIComponent(versionId)}/source`) + const downloadedHash = sourceResponse.bytes?.length ? sha256(sourceResponse.bytes) : '' + const zipMagic = sourceResponse.bytes?.[0] === 0x50 && sourceResponse.bytes?.[1] === 0x4b + context.addStep(module, '下载原始 XLSX 且内容散列一致', sourceResponse, + sourceResponse.http === 200 && sourceResponse.bytes?.length === sourceBytes.length + && zipMagic && downloadedHash === sourceHash + && !sourceResponse.contentType.toLowerCase().includes('json'), + `bytes=${sourceResponse.bytes?.length ?? 0}, contentType=${sourceResponse.contentType || 'missing'}, zipMagic=${zipMagic}, sha256=${downloadedHash}`, blocker) + + if (!detail || unexpectedBlocking.length > 0 || infrastructureIssue) { + finishScenario(context, module, scenario, start) + return + } + + const domesticResponse = await context.request('GET', DOMESTIC_WAREHOUSE_PATH) + const domesticPage = context.apiSuccess(module, '查询启用的平台公共国内仓', domesticResponse, '', blocker) + const overseasResponse = await context.request('GET', OVERSEAS_WAREHOUSE_PATH) + const overseasPage = context.apiSuccess(module, '查询启用的平台公共海外仓', overseasResponse, '', blocker) + const warehouses = [ + ...(Array.isArray(domesticPage?.records) ? domesticPage.records : []), + ...(Array.isArray(overseasPage?.records) ? overseasPage.records : []), + ] + const mappings = buildMappings(detail, warehouses) + const mappingsComplete = mappings.originSources.size > 0 + && mappings.originMappings.length === mappings.originSources.size + && mappings.overseasMappings.length === mappings.overseasSources.size + && mappings.missingOrigins.length === 0 + && mappings.missingOverseas.length === 0 + context.assert(module, '国内起运仓和目的海外仓均精确映射', overseasResponse, + mappingsComplete, + `origins=${mappings.originMappings.map((item) => `${item.originWarehouseCode}->${item.warehouseId}`).join(',') || 'none'}, overseas=${mappings.overseasMappings.map((item) => `${item.sourceDestinationName}->${item.warehouseId}`).join(',') || 'none'}, missing=${[...mappings.missingOrigins, ...mappings.missingOverseas].join(',') || 'none'}`, blocker) + if (!mappingsComplete) { + finishScenario(context, module, scenario, start) + return + } + + const publishResponse = await context.request('POST', `${PRICE_BOOK_PATH}/${encodeURIComponent(versionId)}/publish`, { + originMappings: mappings.originMappings, + overseasMappings: mappings.overseasMappings, + }) + const published = context.apiSuccess(module, '确认仓库映射并立即生效', publishResponse, + `versionId=${versionId}, originMappings=${mappings.originMappings.length}, overseasMappings=${mappings.overseasMappings.length}`, blocker) + context.assert(module, '发布后价格版本为 ACTIVE 且无阻断', publishResponse, + published?.version?.status === 'ACTIVE' + && Number(published?.version?.blockingErrorCount) === 0 + && Boolean(published?.version?.publishedAt) + && published?.channels?.length === channels.length + && published?.rates?.length === rates.length + && !(published?.issues || []).some((issue) => issue.severity === 'BLOCKING'), + `status=${published?.version?.status || 'missing'}, blocking=${published?.version?.blockingErrorCount ?? 'n/a'}, publishedAt=${published?.version?.publishedAt || 'missing'}, channels=${published?.channels?.length ?? 'n/a'}, rates=${published?.rates?.length ?? 'n/a'}`, blocker) + + const listAfterResponse = await context.request('GET', PRICE_BOOK_PATH) + const versionsAfter = context.apiSuccess(module, '发布后回查当前生效和历史版本', listAfterResponse, '', blocker) + const activeAfter = versionsAfter?.filter?.((version) => version.status === 'ACTIVE') || [] + const oldStatusesCorrect = activeBefore.every((before) => { + if (String(before.id) === versionId) return true + const after = versionsAfter?.find?.((candidate) => String(candidate.id) === String(before.id)) + return after?.status === 'SUPERSEDED' && Boolean(after.supersededAt) + }) + context.assert(module, '始终只有一份当前生效版本', listAfterResponse, + activeAfter.length === 1 && String(activeAfter[0]?.id) === versionId, + `active=${activeAfter.map((item) => item.id).join(',') || 'none'}`, blocker) + context.assert(module, '上一生效版本已保留为历史版本', listAfterResponse, + oldStatusesCorrect, + `previous=${activeBefore.map((item) => item.id).join(',') || 'none'}, superseded=${oldStatusesCorrect}`, blocker) + + const activeDetailResponse = await context.request('GET', `${PRICE_BOOK_PATH}/${encodeURIComponent(versionId)}`) + const activeDetail = context.apiSuccess(module, '查询当前生效价格版本详情', activeDetailResponse, '', blocker) + context.assert(module, '当前生效版本预览数据完整', activeDetailResponse, + activeDetail?.version?.status === 'ACTIVE' + && activeDetail?.channels?.length === channels.length + && activeDetail?.rates?.length === rates.length, + `status=${activeDetail?.version?.status || 'missing'}, channels=${activeDetail?.channels?.length ?? 'n/a'}, rates=${activeDetail?.rates?.length ?? 'n/a'}`, blocker) + + const repeatedPublishResponse = await context.request('POST', `${PRICE_BOOK_PATH}/${encodeURIComponent(versionId)}/publish`, { + originMappings: mappings.originMappings, + overseasMappings: mappings.overseasMappings, + }) + const repeatRejected = repeatedPublishResponse.http === 200 + && String(repeatedPublishResponse.body?.code) !== '200' + context.addStep(module, '已生效版本禁止重复发布', repeatedPublishResponse, repeatRejected, + `HTTP=${repeatedPublishResponse.http}, code=${repeatedPublishResponse.body?.code ?? 'missing'}`, blocker) + + const finalListResponse = await context.request('GET', PRICE_BOOK_PATH) + const finalVersions = context.apiSuccess(module, '重复发布被拒绝后回查版本状态', finalListResponse, '', blocker) + const finalActive = finalVersions?.filter?.((version) => version.status === 'ACTIVE') || [] + context.assert(module, '重复发布未改变唯一生效版本', finalListResponse, + finalActive.length === 1 && String(finalActive[0]?.id) === versionId, + `active=${finalActive.map((item) => item.id).join(',') || 'none'}`, blocker) + + finishScenario(context, module, scenario, start) +} diff --git a/scripts/admin-test-env-modules/system.mjs b/scripts/admin-test-env-modules/system.mjs new file mode 100644 index 000000000..7c7449af2 --- /dev/null +++ b/scripts/admin-test-env-modules/system.mjs @@ -0,0 +1,148 @@ +function id(value) { return value == null ? '' : String(value) } + +export async function run(context) { + const module = 'system' + const suffix = context.marker.replace(/\D/g, '').slice(-12) + + const permissionsResponse = await context.request('GET', '/api/platform/v1/iam/permissions') + const permissions = context.apiSuccess(module, '查询菜单权限资源', permissionsResponse) + context.assert(module, '权限资源返回数组', permissionsResponse, Array.isArray(permissions), + `count=${Array.isArray(permissions) ? permissions.length : 'n/a'}`) + + const permissionPayload = { + type: 'BUTTON', + code: `platform:acceptance:${suffix}`, + name: `Admin验收权限-${suffix}`, + parentId: null, + routePath: null, + httpMethod: null, + sortNo: 9999, + } + const createPermissionResponse = await context.request('POST', '/api/platform/v1/iam/permissions', permissionPayload) + const permission = context.apiSuccess(module, '创建自定义权限资源', createPermissionResponse) + const permissionId = id(permission?.id) + context.assert(module, '权限创建字段正确', createPermissionResponse, + permissionId && permission?.permissionCode === permissionPayload.code && permission?.builtIn === false, + `permissionId=${permissionId || 'missing'}`) + if (!permissionId) throw new Error('权限资源创建失败,系统模块无法继续') + context.createdResources.systemPermission = { id: permissionId, code: permissionPayload.code } + + const updatePermissionResponse = await context.request('PUT', `/api/platform/v1/iam/permissions/${permissionId}`, { + name: `${permissionPayload.name}-已编辑`, parentId: null, routePath: null, httpMethod: null, sortNo: 9998, + }) + const updatedPermission = context.apiSuccess(module, '编辑自定义权限资源', updatePermissionResponse) + context.assert(module, '权限编辑正确回显', updatePermissionResponse, + updatedPermission?.permissionName === `${permissionPayload.name}-已编辑` && Number(updatedPermission?.sortNo) === 9998, + `permissionId=${permissionId}`) + for (const status of ['DISABLED', 'ACTIVE']) { + const response = await context.request('PUT', `/api/platform/v1/iam/permissions/${permissionId}/status`, { status }) + const changed = context.apiSuccess(module, `${status === 'ACTIVE' ? '启用' : '停用'}自定义权限`, response) + context.assert(module, `权限状态回显 ${status}`, response, changed?.status === status, `status=${changed?.status ?? 'missing'}`) + } + + const rolePayload = { roleCode: `ADMIN_ACCEPT_${suffix}`, roleName: `Admin验收角色-${suffix}`, description: context.marker } + const createRoleResponse = await context.request('POST', '/api/platform/v1/iam/roles', rolePayload) + const role = context.apiSuccess(module, '创建平台自定义角色', createRoleResponse) + const roleId = id(role?.id) + context.assert(module, '角色创建字段正确', createRoleResponse, + roleId && role?.roleCode === rolePayload.roleCode && role?.roleType === 'CUSTOM', `roleId=${roleId || 'missing'}`) + if (!roleId) throw new Error('角色创建失败,系统模块无法继续') + context.createdResources.systemRole = { id: roleId, code: rolePayload.roleCode, finalStatus: 'DISABLED', retainedBecauseAssigned: true } + + const editRoleResponse = await context.request('PUT', `/api/platform/v1/iam/roles/${roleId}`, { + roleName: `${rolePayload.roleName}-已编辑`, description: `${context.marker}-EDITED`, + }) + const editedRole = context.apiSuccess(module, '编辑平台自定义角色', editRoleResponse) + context.assert(module, '角色编辑正确回显', editRoleResponse, + editedRole?.roleName === `${rolePayload.roleName}-已编辑`, `roleId=${roleId}`) + const grantResponse = await context.request('PUT', '/api/platform/v1/iam/roles/permissions', { roleId, permissionIds: [permissionId] }) + context.apiSuccess(module, '角色全量保存权限', grantResponse) + const rolesResponse = await context.request('GET', '/api/platform/v1/iam/roles') + const roles = context.apiSuccess(module, '回查平台角色列表', rolesResponse) + const listedRole = roles?.find?.((item) => id(item.id) === roleId) + context.assert(module, '角色权限 ID 正确回显', rolesResponse, + listedRole && listedRole.permissionIds?.map(id).includes(permissionId), + `permissionIds=${listedRole?.permissionIds?.map(id).join(',') || 'missing'}`) + for (const status of ['DISABLED', 'ACTIVE']) { + const response = await context.request('PUT', `/api/platform/v1/iam/roles/${roleId}/status`, { status }) + const changed = context.apiSuccess(module, `${status === 'ACTIVE' ? '启用' : '停用'}自定义角色`, response) + context.assert(module, `角色状态回显 ${status}`, response, changed?.status === status, `status=${changed?.status ?? 'missing'}`) + } + + const optionsResponse = await context.request('GET', '/api/platform/v1/iam/users/options') + const options = context.apiSuccess(module, '查询内部用户可选平台角色', optionsResponse) + context.assert(module, '用户选项包含平台与测试角色', optionsResponse, + options?.tenants?.some((item) => id(item.id) === '0') && options?.roles?.some((item) => id(item.id) === roleId), + `tenants=${options?.tenants?.length ?? 'n/a'}, roles=${options?.roles?.length ?? 'n/a'}`) + + const phone = await context.findAvailablePhone(module) + const username = `admin_accept_${suffix}` + const initialPassword = `Accept${suffix}A1` + const resetPassword = `Reset${suffix}B2` + const userPayload = { + username, displayName: `Admin验收用户-${suffix}`, phone, + email: `${username}@example.com`, tenantId: '0', roleIds: [roleId], + password: initialPassword, status: 'ACTIVE', + } + const createUserResponse = await context.request('POST', '/api/platform/v1/iam/users', userPayload) + const user = context.apiSuccess(module, '创建平台内部用户', createUserResponse) + const membershipId = id(user?.membershipId) + context.assert(module, '内部用户账号、平台范围和角色正确', createUserResponse, + membershipId && user?.username === username && id(user?.tenantId) === '0' && user?.roleIds?.map(id).includes(roleId), + `membershipId=${membershipId || 'missing'}`) + if (!membershipId) throw new Error('平台内部用户创建失败,系统模块无法继续') + context.createdResources.systemUser = { membershipId, username, finalStatus: 'DISABLED' } + + const pageResponse = await context.request('GET', `/api/platform/v1/iam/users?page=1&size=20&keyword=${username}`) + const page = context.apiSuccess(module, '按账号查询平台内部用户', pageResponse) + const listedUser = page?.records?.find((item) => id(item.membershipId) === membershipId) + const missingUserFields = listedUser ? requiredUserFields().filter((field) => !Object.hasOwn(listedUser, field)) : requiredUserFields() + context.assert(module, '用户列表包含新账号且字段完整', pageResponse, + listedUser && missingUserFields.length === 0 + && (!Object.hasOwn(listedUser, 'lastLoginAt') || typeof listedUser.lastLoginAt === 'string'), + `records=${page?.records?.length ?? 'n/a'}, missing=${missingUserFields.join(',') || 'none'}, lastLoginAt=${listedUser?.lastLoginAt ?? 'omitted'}`) + + const updateUserPayload = { + displayName: `${userPayload.displayName}-已编辑`, phone, + email: `edited-${userPayload.email}`, tenantId: '0', roleIds: [roleId], + } + const updateUserResponse = await context.request('PUT', `/api/platform/v1/iam/users/${membershipId}`, updateUserPayload) + const updatedUser = context.apiSuccess(module, '编辑平台内部用户', updateUserResponse) + context.assert(module, '用户编辑正确回显', updateUserResponse, + updatedUser?.displayName === updateUserPayload.displayName && updatedUser?.email === updateUserPayload.email, + `membershipId=${membershipId}`) + + const loginResponse = await context.request('POST', '/api/auth/login', { username, password: initialPassword }, '') + const loginPassed = loginResponse.http === 200 && String(loginResponse.body?.code) === '200' && Boolean(loginResponse.body?.data?.accessToken) + context.addStep(module, '新建内部用户可使用初始密码登录', loginResponse, loginPassed, `username=${username}`) + + const resetResponse = await context.request('PUT', `/api/platform/v1/iam/users/${membershipId}/password`, { newPassword: resetPassword }) + context.apiSuccess(module, '重置平台内部用户密码', resetResponse) + const resetLoginResponse = await context.request('POST', '/api/auth/login', { username, password: resetPassword }, '') + const resetLoginPassed = resetLoginResponse.http === 200 && String(resetLoginResponse.body?.code) === '200' && Boolean(resetLoginResponse.body?.data?.accessToken) + context.addStep(module, '内部用户使用重置密码登录', resetLoginResponse, resetLoginPassed, `username=${username}`) + + const disableUserResponse = await context.request('PUT', `/api/platform/v1/iam/users/${membershipId}/status`, { status: 'DISABLED' }) + const disabledUser = context.apiSuccess(module, '停用平台内部用户', disableUserResponse) + context.assert(module, '内部用户停用状态正确', disableUserResponse, disabledUser?.status === 'DISABLED', `status=${disabledUser?.status ?? 'missing'}`) + const disabledLoginResponse = await context.request('POST', '/api/auth/login', { username, password: resetPassword }, '') + context.addStep(module, '停用用户禁止登录', disabledLoginResponse, + disabledLoginResponse.http === 200 && String(disabledLoginResponse.body?.code) !== '200', + `HTTP=${disabledLoginResponse.http}, code=${disabledLoginResponse.body?.code ?? 'missing'}`) + + const clearPermissionResponse = await context.request('PUT', '/api/platform/v1/iam/roles/permissions', { roleId, permissionIds: [] }) + context.apiSuccess(module, '清空测试角色权限', clearPermissionResponse) + const deleteRoleResponse = await context.request('DELETE', `/api/platform/v1/iam/roles/${roleId}`) + context.expectConflict(module, '已分配成员的角色禁止删除', deleteRoleResponse, 'system-role-protection') + const finalDisableRoleResponse = await context.request('PUT', `/api/platform/v1/iam/roles/${roleId}/status`, { status: 'DISABLED' }) + const finalRole = context.apiSuccess(module, '清理时停用测试角色', finalDisableRoleResponse) + context.assert(module, '保留测试角色处于停用状态', finalDisableRoleResponse, finalRole?.status === 'DISABLED', + `status=${finalRole?.status ?? 'missing'}`) + const deletePermissionResponse = await context.request('DELETE', `/api/platform/v1/iam/permissions/${permissionId}`) + context.apiSuccess(module, '删除临时权限资源', deletePermissionResponse) +} + +function requiredUserFields() { + return ['membershipId', 'userId', 'authUserId', 'username', 'displayName', 'phone', 'email', + 'tenantId', 'tenantName', 'memberType', 'status', 'roleIds', 'roleNames', 'protectedAccount'] +} diff --git a/scripts/client-test-env-acceptance.mjs b/scripts/client-test-env-acceptance.mjs new file mode 100644 index 000000000..fd272ee34 --- /dev/null +++ b/scripts/client-test-env-acceptance.mjs @@ -0,0 +1,1748 @@ +#!/usr/bin/env node + +/** + * Client test-environment acceptance flow. + * + * Run directly and enter the platform/client test credentials when prompted. + * Optional environment variables for CI: + * CLIENT_TEST_GATEWAY, PLATFORM_USERNAME, EXISTING_CLIENT_USERNAME, + * PLATFORM_PASSWORD, EXISTING_CLIENT_PASSWORD, CLIENT_TEST_REPORT_DIR + * + * Example: + * node scripts/client-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_TEST_GATEWAY ?? 'http://8.163.30.128:9000') +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 existingClientUsername = args['existing-client-username'] ?? process.env.EXISTING_CLIENT_USERNAME + ?? await promptText('跨客户隔离测试账号', 'merchant_admin') +const existingClientPassword = args['existing-client-password'] ?? process.env.EXISTING_CLIENT_PASSWORD + ?? await promptSecret('跨客户隔离测试密码') +const reportDir = resolve(args['report-dir'] ?? process.env.CLIENT_TEST_REPORT_DIR ?? 'reports') +const timeoutMs = Number(args['timeout-ms'] ?? process.env.CLIENT_TEST_TIMEOUT_MS ?? 30_000) + +if (!platformPassword) { + console.error('Platform password is 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 username = `client_${compactTimestamp(now)}_${randomUUID().slice(0, 6)}`.slice(0, 64) +const clientPassword = `Client${randomUUID().replaceAll('-', '').slice(0, 14)}9!` +const phoneSuffix = `${Date.now()}`.slice(-8) +const legalPhone = `139${phoneSuffix}` +const companyName = `客户端全链路测试企业-${marker}`.slice(0, 128) +const creditCode = `91${compactTimestamp(now)}${randomUUID().replaceAll('-', '').slice(0, 2).toUpperCase()}`.slice(0, 18) +const reportPath = resolve(reportDir, `client-test-env-${marker}.json`) + +const report = { + marker, + gateway, + generatedAt: now.toISOString(), + completedAt: null, + success: false, + fatal: null, + testAccount: { username, companyName, legalPhone }, + resources: { + tenantId: null, + membershipId: null, + reviewId: null, + productImageFileId: null, + enterpriseAddressId: null, + receivingWarehouseId: null, + destinationWarehouseId: null, + channelCode: null, + roleId: null, + testMembershipId: null, + orderIds: [], + }, + steps: [], + futureModules: ['measurement', 'ocr', 'mojia', 'billing'], +} + +let merchantToken +let merchantRefreshToken +let platformToken +let existingClientToken +let ownerPasswordNeedsRestore = false +let temporaryOwnerPassword + +try { + await registrationModule() + await merchantBeforeApprovalModule() + await qualificationAndReviewModule() + await merchantAfterApprovalModule() + await profileManagementModule() + await rbacAndMemberModule() + await orderLifecycleModule() + await isolationModule() + await accountSecurityModule() + report.success = report.steps.every((step) => step.passed) +} catch (error) { + report.fatal = sanitizeError(error) + report.success = false +} finally { + if (ownerPasswordNeedsRestore) await recoverOwnerPassword() + 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 registrationModule() { + const registrationBody = { + username, + password: clientPassword, + displayName: `测试管理员-${marker}`.slice(0, 64), + companyName, + legalPerson: '测试法人', + legalPhone, + contactEmail: `${username}@example.com`, + countryCode: 'CN', + address: '广东省深圳市南山区测试路 1 号', + } + + const registration = await apiStep('registration', 'enterprise self-registration', { + method: 'POST', path: '/api/auth/register', body: registrationBody, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.tenantStatus, 'PROFILE_REQUIRED', 'tenantStatus') + assertEqual(json.data?.nextStep, 'LOGIN_AND_COMPLETE_QUALIFICATIONS', 'nextStep') + assertPresent(json.data?.tenantId, 'tenantId') + assertPresent(json.data?.membershipId, 'membershipId') + }, ({ json }) => ({ + tenantId: json.data.tenantId, + membershipId: json.data.membershipId, + tenantStatus: json.data.tenantStatus, + nextStep: json.data.nextStep, + })) + report.resources.tenantId = registration.json.data.tenantId + report.resources.membershipId = registration.json.data.membershipId + + await apiStep('registration', 'duplicate username is rejected', { + method: 'POST', path: '/api/auth/register', body: registrationBody, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }) + + const login = await apiStep('registration', 'login before approval', { + method: 'POST', path: '/api/auth/login', body: { username, password: clientPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'accessToken') + }, () => ({ username })) + merchantToken = login.json.data.accessToken + merchantRefreshToken = login.json.data.refreshToken + + await apiStep('registration', 'profile is incomplete before qualifications', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/profile', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.id), String(report.resources.tenantId), 'profile tenant id') + assertEqual(json.data?.status, 'PROFILE_REQUIRED', 'profile status') + }, ({ json }) => ({ id: json.data.id, status: json.data.status, tenantName: json.data.tenantName })) +} + +async function merchantBeforeApprovalModule() { + const masterData = await loadOrderMasterData(merchantToken, 'pre-approval-master-data') + const productImageFileId = await uploadProductImage(merchantToken, 'pre-approval-product-image') + report.resources.productImageFileId = productImageFileId + const payload = buildOrderPayload(masterData, productImageFileId, 'PRE', 'draft before enterprise approval') + + const invalid = structuredClone(payload) + delete invalid.pricingTaxMode + await apiStep('order-validation', 'missing pricingTaxMode is rejected', { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': newIdempotencyKey('invalid-create') }, body: invalid, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0422', 'business code') + }) + + const createKey = newIdempotencyKey('pre-approval-create') + const create = await apiStep('order-before-approval', 'create draft before approval', { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': createKey }, body: payload, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data, 'order id') + }, ({ json }) => ({ orderId: json.data, status: 'DRAFT' })) + const orderId = create.json.data + report.resources.orderIds.push(orderId) + + await apiStep('order-before-approval', 'create draft idempotent replay', { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': createKey }, body: payload, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data), String(orderId), 'replayed order id') + }, ({ json }) => ({ orderId: json.data, replayed: true })) + + await apiStep('order-before-approval', 'submit is blocked before approval', { + method: 'POST', path: `/api/merchant/v1/orders/first-leg/${orderId}/submit`, token: merchantToken, + headers: { 'Idempotency-Key': newIdempotencyKey('pre-approval-submit') }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0403', 'business code') + }, ({ json }) => ({ orderId, rejectionCode: json.code })) +} + +async function qualificationAndReviewModule() { + const png = testPng() + const form = new FormData() + form.append('businessLicense', new Blob([png], { type: 'image/png' }), `business-license-${marker}.png`) + form.append('legalPersonId', new Blob([png], { type: 'image/png' }), `legal-person-id-${marker}.png`) + + await apiStep('qualification-review', 'upload required qualification package', { + method: 'POST', + path: `/api/merchant/v1/files/qualifications/required-package?unifiedSocialCreditCode=${encodeURIComponent(creditCode)}`, + token: merchantToken, + body: form, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.businessLicenseQualificationId, 'business license qualification id') + assertPresent(json.data?.legalPersonIdQualificationId, 'legal person qualification id') + assertEqual(json.data?.tenantStatus, 'PROFILE_REQUIRED', 'tenant status after upload') + }, ({ json }) => ({ + businessLicenseQualificationId: json.data.businessLicenseQualificationId, + legalPersonIdQualificationId: json.data.legalPersonIdQualificationId, + tenantStatus: json.data.tenantStatus, + })) + + for (const qualificationType of ['FREIGHT_FORWARDER_CERTIFICATE', 'BANK_ACCOUNT_LICENSE']) { + const optionalForm = new FormData() + optionalForm.append('file', new Blob([png], { type: 'image/png' }), `${qualificationType.toLowerCase()}-${marker}.png`) + await apiStep('qualification-review', `upload optional qualification ${qualificationType}`, { + method: 'POST', + path: `/api/merchant/v1/files/qualifications?qualificationType=${qualificationType}&replace=false`, + token: merchantToken, + body: optionalForm, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.qualificationId, `${qualificationType} qualification id`) + assertEqual(json.data?.tenantStatus, 'PROFILE_REQUIRED', 'tenant status after optional upload') + }, ({ json }) => ({ qualificationType, qualificationId: json.data.qualificationId, tenantStatus: json.data.tenantStatus })) + } + + const duplicateOptionalForm = new FormData() + duplicateOptionalForm.append('file', new Blob([png], { type: 'image/png' }), `duplicate-freight-${marker}.png`) + await softApiStep('qualification-review', 'duplicate optional qualification requires explicit replacement', { + method: 'POST', + path: '/api/merchant/v1/files/qualifications?qualificationType=FREIGHT_FORWARDER_CERTIFICATE&replace=false', + token: merchantToken, + body: duplicateOptionalForm, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }, ({ json }) => ({ qualificationType: 'FREIGHT_FORWARDER_CERTIFICATE', rejectionCode: json?.code })) + + const replacementOptionalForm = new FormData() + replacementOptionalForm.append('file', new Blob([png], { type: 'image/png' }), `replacement-freight-${marker}.png`) + await apiStep('qualification-review', 'replace optional qualification explicitly', { + method: 'POST', + path: '/api/merchant/v1/files/qualifications?qualificationType=FREIGHT_FORWARDER_CERTIFICATE&replace=true', + token: merchantToken, + body: replacementOptionalForm, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.qualificationId, 'replacement qualification id') + }, ({ json }) => ({ qualificationType: 'FREIGHT_FORWARDER_CERTIFICATE', qualificationId: json.data.qualificationId, replaced: true })) + + await apiStep('qualification-review', 'required qualifications are pending', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/qualifications', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertQualificationStatuses(json.data, ['BUSINESS_LICENSE', 'LEGAL_PERSON_ID'], 'PENDING') + assertQualificationStatuses(json.data, ['FREIGHT_FORWARDER_CERTIFICATE', 'BANK_ACCOUNT_LICENSE'], 'PENDING') + }, ({ json }) => ({ qualifications: qualificationEvidence(json.data) })) + + await apiStep('qualification-review', 'submit enterprise review', { + method: 'POST', path: '/api/merchant/v1/iam/tenant/qualifications/submit-review', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'PENDING', 'tenant status') + }, ({ json }) => ({ tenantId: json.data.id, status: json.data.status })) + + const platformLogin = await apiStep('qualification-review', 'platform reviewer 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 + + const reviews = await apiStep('qualification-review', 'platform finds pending review', { + method: 'GET', path: '/api/platform/v1/iam/reviews', token: platformToken, + }, ({ json }) => { + requireSuccess(json) + const review = arrayData(json.data).find((item) => String(item.tenantId) === String(report.resources.tenantId)) + assertPresent(review?.id, 'pending review id') + }, ({ json }) => { + const review = arrayData(json.data).find((item) => String(item.tenantId) === String(report.resources.tenantId)) + return { reviewId: review?.id, tenantId: review?.tenantId, status: review?.status } + }) + const review = arrayData(reviews.json.data).find((item) => String(item.tenantId) === String(report.resources.tenantId)) + report.resources.reviewId = review.id + + await apiStep('qualification-review', 'platform sees required qualifications', { + method: 'GET', path: `/api/platform/v1/iam/tenants/${report.resources.tenantId}/qualifications`, token: platformToken, + }, ({ json }) => { + requireSuccess(json) + assertQualificationStatuses(json.data, ['BUSINESS_LICENSE', 'LEGAL_PERSON_ID'], 'PENDING') + }, ({ json }) => ({ qualifications: qualificationEvidence(json.data) })) + + const approval = await apiStep('qualification-review', 'platform approves enterprise', { + method: 'POST', path: `/api/platform/v1/iam/reviews/${review.id}/approve`, token: platformToken, + body: { comment: `客户端全链路自动审核通过 ${marker}` }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.tenantId), String(report.resources.tenantId), 'approved tenant id') + assertEqual(json.data?.administratorCreated, false, 'administratorCreated') + assertTrue(json.data?.administratorUsername == null, 'administratorUsername must not be returned') + assertTrue(json.data?.temporaryPassword == null, 'temporaryPassword must not be returned') + }, ({ json }) => ({ + tenantId: json.data.tenantId, + administratorCreated: json.data.administratorCreated, + generatedCredentialsReturned: Boolean(json.data.administratorUsername || json.data.temporaryPassword), + })) + + await apiStep('qualification-review', 'registered account remains enterprise owner', { + method: 'GET', path: `/api/platform/v1/iam/tenants/${report.resources.tenantId}/members`, token: platformToken, + }, ({ json }) => { + requireSuccess(json) + const owner = arrayData(json.data).find((item) => item.memberType === 'OWNER') + assertPresent(owner, 'OWNER member') + assertEqual(String(owner.membershipId), String(report.resources.membershipId), 'owner membership id') + assertEqual(owner.username, username, 'owner username') + assertEqual(owner.status, 'ACTIVE', 'owner status') + }, ({ json }) => { + const owner = arrayData(json.data).find((item) => item.memberType === 'OWNER') + return { membershipId: owner?.membershipId, username: owner?.username, memberType: owner?.memberType, status: owner?.status } + }) +} + +async function merchantAfterApprovalModule() { + const login = await apiStep('merchant-session', 'client re-login after approval', { + method: 'POST', path: '/api/auth/login', body: { username, password: clientPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'accessToken') + }, () => ({ username })) + merchantToken = login.json.data.accessToken + merchantRefreshToken = login.json.data.refreshToken + + await apiStep('merchant-session', 'profile is active after approval', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/profile', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'ACTIVE', 'profile status') + assertEqual(json.data?.unifiedSocialCreditCode, creditCode, 'unified social credit code') + }, ({ json }) => ({ id: json.data.id, status: json.data.status, tenantName: json.data.tenantName })) + + const approvedQualifications = await apiStep('merchant-session', 'required qualifications are approved', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/qualifications', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertQualificationStatuses(json.data, ['BUSINESS_LICENSE', 'LEGAL_PERSON_ID'], 'APPROVED') + assertQualificationStatuses(json.data, ['FREIGHT_FORWARDER_CERTIFICATE', 'BANK_ACCOUNT_LICENSE'], 'APPROVED') + }, ({ json }) => ({ qualifications: qualificationEvidence(json.data) })) + + const businessLicense = arrayData(approvedQualifications.json.data) + .find((item) => item.qualificationType === 'BUSINESS_LICENSE') + assertPresent(businessLicense?.documentUrl, 'business license documentUrl') + await apiStep('merchant-session', 'preview approved qualification file', { + method: 'GET', path: apiPath(businessLicense.documentUrl), token: merchantToken, responseType: 'bytes', + }, ({ status, bytes, headers }) => { + assertEqual(status, 200, 'HTTP status') + assertTrue(bytes?.length > 0, 'qualification preview must not be empty') + assertTrue((headers.get('content-type') ?? '').startsWith('image/'), 'qualification preview must return an image') + }, ({ bytes, headers }) => ({ sizeBytes: bytes.length, contentType: headers.get('content-type') })) +} + +async function profileManagementModule() { + const tenantProfile = await apiStep('profile-management', 'load enterprise profile for editing', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/profile', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.id), String(report.resources.tenantId), 'enterprise id') + }, ({ json }) => ({ id: json.data.id, tenantName: json.data.tenantName, status: json.data.status })) + + const editedTenantName = `${companyName}-已编辑`.slice(0, 128) + const tenantUpdate = { + tenantName: editedTenantName, + legalName: tenantProfile.json.data.legalName || companyName, + legalRepresentative: tenantProfile.json.data.legalRepresentative || '测试法人', + contactName: `企业联系人-${marker}`.slice(0, 64), + contactPhone: legalPhone, + contactEmail: `company_${marker.replaceAll('-', '')}@example.com`, + } + await apiStep('profile-management', 'edit enterprise profile', { + method: 'PUT', path: '/api/merchant/v1/iam/tenant/profile', token: merchantToken, body: tenantUpdate, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.tenantName, tenantUpdate.tenantName, 'tenantName') + assertEqual(json.data?.contactName, tenantUpdate.contactName, 'contactName') + assertEqual(json.data?.contactEmail, tenantUpdate.contactEmail, 'contactEmail') + assertEqual(json.data?.status, 'ACTIVE', 'enterprise status') + }, ({ json }) => ({ id: json.data.id, tenantName: json.data.tenantName, contactName: json.data.contactName, status: json.data.status })) + + await apiStep('profile-management', 'enterprise profile edit is persisted', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/profile', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.tenantName, tenantUpdate.tenantName, 'tenantName') + assertEqual(json.data?.contactEmail, tenantUpdate.contactEmail, 'contactEmail') + }, ({ json }) => ({ id: json.data.id, tenantName: json.data.tenantName, contactEmail: json.data.contactEmail })) + + await softApiStep('profile-validation', 'invalid enterprise contact email is rejected', { + method: 'PUT', path: '/api/merchant/v1/iam/tenant/profile', token: merchantToken, + body: { ...tenantUpdate, contactEmail: 'invalid-email' }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0422', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code })) + + await softApiStep('profile-validation', 'blank enterprise address detail is rejected', { + method: 'POST', path: '/api/merchant/v1/iam/tenant/addresses', token: merchantToken, + body: { addressType: 'OPERATING', countryCode: 'CN', detail: ' ', isDefault: true }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0422', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code })) + + const addressBody = { + addressType: 'OPERATING', + countryCode: 'CN', + province: '广东省', + city: '深圳市', + district: '南山区', + detail: `客户端验收地址 ${marker}`, + postalCode: '518000', + isDefault: true, + } + const createdAddress = await apiStep('profile-management', 'add enterprise operating address', { + method: 'POST', path: '/api/merchant/v1/iam/tenant/addresses', token: merchantToken, body: addressBody, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.id, 'enterprise address id') + assertEqual(json.data?.addressType, addressBody.addressType, 'addressType') + assertEqual(json.data?.detail, addressBody.detail, 'address detail') + assertEqual(json.data?.isDefault, true, 'address isDefault') + }, ({ json }) => ({ id: json.data.id, addressType: json.data.addressType, city: json.data.city, isDefault: json.data.isDefault })) + report.resources.enterpriseAddressId = createdAddress.json.data.id + + await apiStep('profile-management', 'enterprise address list contains created address', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/addresses', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + const address = arrayData(json.data).find((item) => String(item.id) === String(report.resources.enterpriseAddressId)) + assertPresent(address, 'created enterprise address') + assertEqual(address.detail, addressBody.detail, 'address detail') + assertEqual(address.postalCode, addressBody.postalCode, 'address postalCode') + }, ({ json }) => ({ addressCount: arrayData(json.data).length, addressId: report.resources.enterpriseAddressId })) + + await apiStep('profile-management', 'platform can read created enterprise address', { + method: 'GET', path: `/api/platform/v1/iam/tenants/${report.resources.tenantId}/addresses`, token: platformToken, + }, ({ json }) => { + requireSuccess(json) + const address = arrayData(json.data).find((item) => String(item.id) === String(report.resources.enterpriseAddressId)) + assertPresent(address, 'platform enterprise address') + assertEqual(address.detail, addressBody.detail, 'platform address detail') + }, ({ json }) => ({ addressCount: arrayData(json.data).length, addressId: report.resources.enterpriseAddressId })) + + const personal = await apiStep('profile-management', 'load personal profile', { + method: 'GET', path: '/api/merchant/v1/iam/profile', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.username, username, 'personal username') + }, ({ json }) => ({ userId: json.data.userId, username: json.data.username, displayName: json.data.displayName })) + const personalUpdate = { + displayName: `测试企业管理员-${marker}`.slice(0, 64), + phone: legalPhone, + email: `owner_${marker.replaceAll('-', '')}@example.com`, + } + await softApiStep('profile-validation', 'invalid personal email is rejected', { + method: 'PUT', path: '/api/merchant/v1/iam/profile', token: merchantToken, + body: { ...personalUpdate, email: 'invalid-email' }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0422', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code })) + await apiStep('profile-management', 'edit personal profile', { + method: 'PUT', path: '/api/merchant/v1/iam/profile', token: merchantToken, body: personalUpdate, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.userId), String(personal.json.data.userId), 'personal user id') + assertEqual(json.data?.displayName, personalUpdate.displayName, 'displayName') + assertEqual(json.data?.email, personalUpdate.email, 'email') + }, ({ json }) => ({ userId: json.data.userId, username: json.data.username, displayName: json.data.displayName })) + + const relogin = await apiStep('profile-management', 're-login after personal profile token revocation', { + method: 'POST', path: '/api/auth/login', body: { username, password: clientPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'accessToken') + }, () => ({ username })) + merchantToken = relogin.json.data.accessToken + merchantRefreshToken = relogin.json.data.refreshToken + + await apiStep('profile-management', 'personal profile edit is persisted', { + method: 'GET', path: '/api/merchant/v1/iam/profile', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.displayName, personalUpdate.displayName, 'displayName') + assertEqual(json.data?.email, personalUpdate.email, 'email') + }, ({ json }) => ({ userId: json.data.userId, username: json.data.username, displayName: json.data.displayName })) +} + +async function rbacAndMemberModule() { + const permissions = await apiStep('rbac-member', 'load merchant permission resources', { + method: 'GET', path: '/api/merchant/v1/iam/permissions', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertTrue(arrayData(json.data).length > 0, 'permission resources must not be empty') + }, ({ json }) => ({ permissionCount: arrayData(json.data).length })) + const desiredCodes = ['merchant:order:list', 'merchant:order:view'] + const grantedPermissions = arrayData(permissions.json.data) + .filter((item) => item.status === 'ACTIVE' && desiredCodes.includes(item.permissionCode)) + assertEqual(grantedPermissions.length, desiredCodes.length, 'order permission count') + const permissionIds = grantedPermissions.map((item) => item.id) + + const ownerPermissions = await apiStep('menu-permissions', 'load owner effective permissions', { + method: 'GET', path: '/api/merchant/v1/iam/authorization/permissions', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + const values = arrayData(json.data) + for (const code of requiredOwnerBackendPermissions()) { + assertTrue(values.includes(code), `owner permission is missing: ${code}`) + } + }, ({ json }) => ({ + backendPermissionCount: arrayData(json.data).length, + visibleClientMenus: visibleClientMenus(arrayData(json.data)), + })) + assertSetEqual( + visibleClientMenus(arrayData(ownerPermissions.json.data)), + ['account:profile:view', 'company:member:list', 'company:permission:list', 'company:profile:view', + 'company:role:list', 'dashboard:view', 'order:first-leg:list'], + 'owner visible Client menus', + ) + + await apiStep('rbac-member', 'load initial merchant roles', { + method: 'GET', path: '/api/merchant/v1/iam/roles', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertTrue(Array.isArray(json.data), 'role list must be an array') + }, ({ json }) => ({ roleCount: arrayData(json.data).length })) + + const roleCode = `E2E_${marker.replaceAll('-', '_')}`.slice(0, 64) + const createdRole = await apiStep('rbac-member', 'create custom role', { + method: 'POST', path: '/api/merchant/v1/iam/roles', token: merchantToken, + body: { roleCode, roleName: `订单只读-${marker}`.slice(0, 64), description: `Client E2E ${marker}` }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.id, 'role id') + assertEqual(json.data?.roleCode, roleCode, 'roleCode') + assertEqual(json.data?.roleType, 'CUSTOM', 'roleType') + }, ({ json }) => ({ roleId: json.data.id, roleCode: json.data.roleCode, roleType: json.data.roleType, status: json.data.status })) + const roleId = createdRole.json.data.id + report.resources.roleId = roleId + + await apiStep('rbac-member', 'grant permissions to custom role', { + method: 'PUT', path: '/api/merchant/v1/iam/roles/permissions', token: merchantToken, + body: { roleId, permissionIds }, + }, ({ json }) => requireSuccess(json), () => ({ roleId, permissionIds, permissionCodes: desiredCodes })) + + await apiStep('rbac-member', 'custom role permission detail is persisted', { + method: 'GET', path: `/api/merchant/v1/iam/roles/${roleId}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertSetEqual(arrayData(json.data?.permissionIds).map(String), permissionIds.map(String), 'role permissionIds') + }, ({ json }) => ({ roleId: json.data.id, roleName: json.data.roleName, permissionIds: json.data.permissionIds })) + + await apiStep('rbac-member', 'edit custom role', { + method: 'PUT', path: `/api/merchant/v1/iam/roles/${roleId}`, token: merchantToken, + body: { roleName: `订单查询员-${marker}`.slice(0, 64), description: `edited ${marker}` }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.description, `edited ${marker}`, 'role description') + }, ({ json }) => ({ roleId: json.data.id, roleName: json.data.roleName, description: json.data.description })) + + await apiStep('rbac-member', 'disable custom role', { + method: 'PUT', path: `/api/merchant/v1/iam/roles/${roleId}/status`, token: merchantToken, body: { status: 'DISABLED' }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'DISABLED', 'role status') + }, ({ json }) => ({ roleId: json.data.id, status: json.data.status })) + await apiStep('rbac-member', 'enable custom role', { + method: 'PUT', path: `/api/merchant/v1/iam/roles/${roleId}/status`, token: merchantToken, body: { status: 'ACTIVE' }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'ACTIVE', 'role status') + }, ({ json }) => ({ roleId: json.data.id, status: json.data.status })) + + const memberUsername = `member_${compactTimestamp(new Date())}_${randomUUID().slice(0, 5)}`.slice(0, 64) + const memberPassword = `Member${randomUUID().replaceAll('-', '').slice(0, 14)}8!` + const resetMemberPassword = `Reset${randomUUID().replaceAll('-', '').slice(0, 15)}7!` + const memberBody = { + username: memberUsername, + password: memberPassword, + displayName: `测试订单成员-${marker}`.slice(0, 64), + phone: `137${`${Date.now() + 1}`.slice(-8)}`, + email: `${memberUsername}@example.com`, + memberType: 'EMPLOYEE', + memberNo: `EMP-${marker}`.slice(0, 64), + roleIds: [roleId], + } + await softApiStep('member-validation', 'member with weak password and invalid email is rejected', { + method: 'POST', path: '/api/merchant/v1/iam/members', token: merchantToken, + body: { ...memberBody, username: `bad_${randomUUID().slice(0, 8)}`, password: 'password', email: 'invalid-email' }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0422', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code })) + const createdMember = await apiStep('rbac-member', 'create enterprise member with role', { + method: 'POST', path: '/api/merchant/v1/iam/members', token: merchantToken, body: memberBody, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.membershipId, 'membership id') + assertEqual(json.data?.memberType, 'EMPLOYEE', 'memberType') + assertSetEqual(arrayData(json.data?.roleIds).map(String), [String(roleId)], 'member roleIds') + }, ({ json }) => ({ membershipId: json.data.membershipId, memberType: json.data.memberType, status: json.data.status, roleIds: json.data.roleIds })) + const membershipId = createdMember.json.data.membershipId + report.resources.testMembershipId = membershipId + + await apiStep('rbac-member', 'enterprise member list contains created member and roles', { + method: 'GET', path: '/api/merchant/v1/iam/members', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + const member = arrayData(json.data).find((item) => String(item.membershipId) === String(membershipId)) + assertPresent(member, 'created member list row') + assertEqual(member.displayName, memberBody.displayName, 'member displayName') + assertEqual(member.status, 'ACTIVE', 'member status') + assertSetEqual(arrayData(member.roleIds).map(String), [String(roleId)], 'member list roleIds') + }, ({ json }) => ({ memberCount: arrayData(json.data).length, membershipId })) + + await apiStep('rbac-member', 'enterprise member detail matches created fields and roles', { + method: 'GET', path: `/api/merchant/v1/iam/members/${membershipId}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.membershipId), String(membershipId), 'membership id') + assertEqual(json.data?.displayName, memberBody.displayName, 'member displayName') + assertEqual(json.data?.phone, memberBody.phone, 'member phone') + assertEqual(json.data?.email, memberBody.email, 'member email') + assertEqual(json.data?.memberNo, memberBody.memberNo, 'memberNo') + assertSetEqual(arrayData(json.data?.roleIds).map(String), [String(roleId)], 'member detail roleIds') + }, ({ json }) => ({ membershipId: json.data.membershipId, status: json.data.status, roleIds: json.data.roleIds })) + + await apiStep('rbac-member', 'duplicate member username is rejected', { + method: 'POST', path: '/api/merchant/v1/iam/members', token: merchantToken, body: memberBody, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }, ({ json }) => ({ username: memberUsername, rejectionCode: json.code })) + await apiStep('rbac-member', 'assigned custom role cannot be deleted', { + method: 'DELETE', path: `/api/merchant/v1/iam/roles/${roleId}`, token: merchantToken, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }, ({ json }) => ({ roleId, rejectionCode: json.code })) + await apiStep('rbac-member', 'enterprise owner cannot be disabled', { + method: 'PUT', path: `/api/merchant/v1/iam/members/${report.resources.membershipId}/status`, token: merchantToken, + body: { status: 'DISABLED' }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0403', 'business code') + }, ({ json }) => ({ membershipId: report.resources.membershipId, rejectionCode: json.code })) + await apiStep('rbac-member', 'enterprise owner cannot be edited through member API', { + method: 'PUT', path: `/api/merchant/v1/iam/members/${report.resources.membershipId}`, token: merchantToken, + body: { + displayName: '非法修改企业所有者', phone: legalPhone, email: `${username}@example.com`, + memberType: 'OWNER', memberNo: 'OWNER', roleIds: [], + }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0403', 'business code') + }, ({ json }) => ({ membershipId: report.resources.membershipId, rejectionCode: json.code })) + + const memberLogin = await apiStep('rbac-member', 'new enterprise member can login', { + method: 'POST', path: '/api/auth/login', body: { username: memberUsername, password: memberPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'member accessToken') + }, () => ({ username: memberUsername })) + let memberToken = memberLogin.json.data.accessToken + + await apiStep('rbac-member', 'member can use granted order list permission', { + method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=20', token: memberToken, + }, ({ json }) => requireSuccess(json), ({ json }) => ({ total: json.data?.total })) + await apiStep('rbac-member', 'member can view order with granted permission', { + method: 'GET', path: `/api/merchant/v1/orders/first-leg/${report.resources.orderIds[0]}`, token: memberToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.order?.id), String(report.resources.orderIds[0]), 'order id') + }, ({ json }) => ({ orderId: json.data.order.id, status: json.data.order.status })) + + await apiStep('menu-permissions', 'read-only member effective permissions match role', { + method: 'GET', path: '/api/merchant/v1/iam/authorization/permissions', token: memberToken, + }, ({ json }) => { + requireSuccess(json) + assertSetEqual(arrayData(json.data), desiredCodes, 'member backend permissions') + assertSetEqual( + visibleClientMenus(arrayData(json.data)), + ['account:profile:view', 'dashboard:view', 'order:first-leg:list'], + 'member visible Client menus', + ) + }, ({ json }) => ({ backendPermissions: json.data, visibleClientMenus: visibleClientMenus(arrayData(json.data)) })) + + await apiStep('menu-permissions', 'disable assigned role', { + method: 'PUT', path: `/api/merchant/v1/iam/roles/${roleId}/status`, token: merchantToken, body: { status: 'DISABLED' }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'DISABLED', 'role status') + }, ({ json }) => ({ roleId: json.data.id, status: json.data.status })) + await softApiStep('menu-permissions', 'disabled role is reflected by live 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)) })) + 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 }) => { + assertTrue([200, 401, 403].includes(status), `unexpected HTTP status ${status}`) + assertTrue(['A0401', 'A0403'].includes(String(json?.code)), `expected A0401/A0403, actual=${json?.code}`) + }, ({ json }) => ({ rejectionCode: json?.code, message: json?.message })) + + const disabledRoleLogin = await apiStep('menu-permissions', 'member login succeeds while role is disabled', { + method: 'POST', path: '/api/auth/login', body: { username: memberUsername, password: memberPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'member accessToken') + }, () => ({ username: memberUsername })) + memberToken = disabledRoleLogin.json.data.accessToken + await apiStep('menu-permissions', 'disabled role removes member menus and permissions', { + method: 'GET', path: '/api/merchant/v1/iam/authorization/permissions', token: memberToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(arrayData(json.data).length, 0, 'effective backend permission count') + assertSetEqual(visibleClientMenus(arrayData(json.data)), ['account:profile:view', 'dashboard:view'], 'visible Client menus') + }, ({ json }) => ({ backendPermissions: json.data, visibleClientMenus: visibleClientMenus(arrayData(json.data)) })) + await softApiStep('menu-permissions', 'disabled role blocks member order list', { + method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=20', token: memberToken, + }, ({ json, status }) => { + assertTrue([200, 403].includes(status), `unexpected HTTP status ${status}`) + assertEqual(String(json?.code), 'A0403', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code })) + + await apiStep('menu-permissions', 're-enable assigned role', { + method: 'PUT', path: `/api/merchant/v1/iam/roles/${roleId}/status`, token: merchantToken, body: { status: 'ACTIVE' }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'ACTIVE', 'role status') + }, ({ json }) => ({ roleId: json.data.id, status: json.data.status })) + const enabledRoleLogin = await apiStep('menu-permissions', 'member re-login after role is enabled', { + method: 'POST', path: '/api/auth/login', body: { username: memberUsername, password: memberPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'member accessToken') + }, () => ({ username: memberUsername })) + memberToken = enabledRoleLogin.json.data.accessToken + await apiStep('menu-permissions', 're-enabled role restores member menus', { + method: 'GET', path: '/api/merchant/v1/iam/authorization/permissions', token: memberToken, + }, ({ json }) => { + requireSuccess(json) + assertSetEqual(arrayData(json.data), desiredCodes, 'member backend permissions') + assertSetEqual(visibleClientMenus(arrayData(json.data)), ['account:profile:view', 'dashboard:view', 'order:first-leg:list'], 'visible Client menus') + }, ({ json }) => ({ backendPermissions: json.data, visibleClientMenus: visibleClientMenus(arrayData(json.data)) })) + + const editedMemberBody = { + displayName: `已编辑订单成员-${marker}`.slice(0, 64), + phone: memberBody.phone, + email: `edited_${memberUsername}@example.com`, + memberType: 'EMPLOYEE', memberNo: memberBody.memberNo, roleIds: [roleId], + } + await apiStep('rbac-member', 'edit enterprise member', { + method: 'PUT', path: `/api/merchant/v1/iam/members/${membershipId}`, token: merchantToken, body: editedMemberBody, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.displayName, editedMemberBody.displayName, 'member displayName') + assertEqual(json.data?.email, editedMemberBody.email, 'member email') + }, ({ json }) => ({ membershipId: json.data.membershipId, displayName: json.data.displayName, status: json.data.status })) + + await apiStep('rbac-member', 'reset enterprise member password', { + method: 'PUT', path: `/api/merchant/v1/iam/members/${membershipId}/password`, token: merchantToken, + body: { newPassword: resetMemberPassword }, + }, ({ json }) => requireSuccess(json), () => ({ membershipId })) + await apiStep('rbac-member', 'member old password is rejected after reset', { + method: 'POST', path: '/api/auth/login', body: { username: memberUsername, password: memberPassword }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0401', 'business code') + }, ({ json }) => ({ username: memberUsername, rejectionCode: json.code })) + const resetLogin = await apiStep('rbac-member', 'member can login with reset password', { + method: 'POST', path: '/api/auth/login', body: { username: memberUsername, password: resetMemberPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'member accessToken') + }, () => ({ username: memberUsername })) + memberToken = resetLogin.json.data.accessToken + + await apiStep('rbac-member', 'disable enterprise member', { + method: 'PUT', path: `/api/merchant/v1/iam/members/${membershipId}/status`, token: merchantToken, body: { status: 'DISABLED' }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'DISABLED', 'member status') + }, ({ json }) => ({ membershipId: json.data.membershipId, status: json.data.status })) + await apiStep('rbac-member', 'disabled member login is rejected', { + method: 'POST', path: '/api/auth/login', body: { username: memberUsername, password: resetMemberPassword }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertTrue(['A0401', 'A0403'].includes(String(json?.code)), `expected A0401/A0403, actual=${json?.code}`) + }, ({ json }) => ({ username: memberUsername, rejectionCode: json.code })) + await apiStep('rbac-member', 'enable enterprise member', { + method: 'PUT', path: `/api/merchant/v1/iam/members/${membershipId}/status`, token: merchantToken, body: { status: 'ACTIVE' }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'ACTIVE', 'member status') + }, ({ json }) => ({ membershipId: json.data.membershipId, status: json.data.status })) + + await apiStep('rbac-member', 'clear enterprise member roles', { + method: 'PUT', path: '/api/merchant/v1/iam/members/roles', token: merchantToken, + body: { membershipId, roleIds: [] }, + }, ({ json }) => requireSuccess(json), () => ({ membershipId, roleIds: [] })) + await apiStep('rbac-member', 'member role clearing is persisted', { + method: 'GET', path: `/api/merchant/v1/iam/members/${membershipId}/roles`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.membershipId), String(membershipId), 'membership id') + assertEqual(arrayData(json.data?.roleIds).length, 0, 'member role count') + }, ({ json }) => ({ membershipId: json.data.membershipId, roleIds: json.data.roleIds })) + await apiStep('rbac-member', 'role clearing revokes stale member token', { + method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=20', token: memberToken, + }, ({ json, status }) => { + assertEqual(status, 401, 'HTTP status') + assertEqual(String(json?.code), 'A0401', 'business code') + }, ({ json }) => ({ rejectionCode: json.code })) + const noRoleLogin = await apiStep('rbac-member', 'member re-login after role clearing', { + method: 'POST', path: '/api/auth/login', body: { username: memberUsername, password: resetMemberPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'member accessToken') + }, () => ({ username: memberUsername })) + memberToken = noRoleLogin.json.data.accessToken + await apiStep('rbac-member', 'member without roles cannot list orders', { + method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=20', token: memberToken, + }, ({ json, status }) => { + assertTrue([200, 403].includes(status), `unexpected HTTP status ${status}`) + assertEqual(String(json?.code), 'A0403', 'business code') + }, ({ json }) => ({ rejectionCode: json.code })) + + await apiStep('rbac-member', 'disable test member after verification', { + method: 'PUT', path: `/api/merchant/v1/iam/members/${membershipId}/status`, token: merchantToken, body: { status: 'DISABLED' }, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.status, 'DISABLED', 'member status') + }, ({ json }) => ({ membershipId: json.data.membershipId, status: json.data.status })) + await apiStep('rbac-member', 'delete unassigned custom role', { + method: 'DELETE', path: `/api/merchant/v1/iam/roles/${roleId}`, token: merchantToken, + }, ({ json }) => requireSuccess(json), () => ({ roleId })) + report.resources.roleId = null +} + +async function orderLifecycleModule() { + const masterData = await loadOrderMasterData(merchantToken, 'order-master-data') + await estimateAvailablePrice(masterData) + const productImageFileId = await uploadProductImage(merchantToken, 'order-product-image') + report.resources.productImageFileId = productImageFileId + + const invalidImageForm = new FormData() + invalidImageForm.append('file', new Blob(['not-an-image'], { type: 'text/plain' }), `invalid-product-${marker}.txt`) + await softApiStep('order-product-image', 'invalid product image MIME type is rejected', { + method: 'POST', path: '/api/merchant/v1/files/product-images', token: merchantToken, body: invalidImageForm, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0400', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code, message: json?.message })) + + await apiStep('order-lifecycle', 'download own product image', { + method: 'GET', path: `/api/merchant/v1/files/product-images/${productImageFileId}`, token: merchantToken, + 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 must return an image') + }, ({ bytes, headers }) => ({ sizeBytes: bytes.length, contentType: headers.get('content-type') })) + + const payload = buildOrderPayload(masterData, productImageFileId, 'ACTIVE', 'fresh draft after approval') + const invalidOrderCases = [ + { + name: 'FBA order missing Amazon identifiers is rejected', + mutate(value) { + value.amazonWarehouseCode = null + value.shipmentId = null + value.referenceId = null + }, + }, + { + name: 'FBA cargo missing SKU UPC shipment and reference is rejected', + mutate(value) { + value.cargoes[0].skuNo = null + value.cargoes[0].upcNo = null + value.cargoes[0].shipmentId = null + value.cargoes[0].referenceId = null + }, + }, + { + name: 'PICKUP order without sender is rejected', + mutate(value) { value.sender = null }, + }, + { + name: 'PRIVATE destination without receiver is rejected', + mutate(value) { + value.destinationType = 'PRIVATE' + value.receiver = null + }, + }, + { + name: 'invalid product image file ID is rejected', + mutate(value) { value.cargoes[0].productImageFileId = -1 }, + }, + ] + for (const testCase of invalidOrderCases) { + const invalidPayload = structuredClone(payload) + testCase.mutate(invalidPayload) + await softApiStep('order-validation', testCase.name, { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': newIdempotencyKey('invalid-order') }, body: invalidPayload, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0422', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code, message: json?.message })) + } + const createKey = newIdempotencyKey('approved-create') + const created = await apiStep('order-lifecycle', 'create valid draft after approval', { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': createKey }, body: payload, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data, 'order id') + }, ({ json }) => ({ orderId: json.data })) + const orderId = created.json.data + report.resources.orderIds.push(orderId) + + await apiStep('order-lifecycle', 'create order idempotent replay', { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': createKey }, body: payload, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data), String(orderId), 'replayed order id') + }, ({ json }) => ({ orderId: json.data, replayed: true })) + + const conflictingPayload = structuredClone(payload) + conflictingPayload.customerRemark = `idempotency-conflict-${marker}` + await softApiStep('order-boundary', 'same idempotency key with different payload is rejected', { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': createKey }, body: conflictingPayload, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }, ({ json }) => ({ orderId, rejectionCode: json.code })) + + const editedPayload = structuredClone(payload) + editedPayload.customerRemark = `edited-${marker}` + editedPayload.cargoes[0].cargoRemark = `edited-cargo-${marker}` + editedPayload.cargoes[0].model = `MODEL-EDIT-${marker}`.slice(0, 64) + await apiStep('order-lifecycle', 'edit draft', { + method: 'PUT', path: `/api/merchant/v1/orders/first-leg/${orderId}`, token: merchantToken, body: editedPayload, + }, ({ json }) => requireSuccess(json), () => ({ orderId, customerRemark: editedPayload.customerRemark })) + + const detail = await apiStep('order-lifecycle', 'order detail preserves complete product fields', { + method: 'GET', path: `/api/merchant/v1/orders/first-leg/${orderId}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.order?.id), String(orderId), 'order id') + assertEqual(json.data?.order?.status, 'DRAFT', 'order status') + assertEqual(json.data?.order?.customerRemark, editedPayload.customerRemark, 'customer remark') + const cargo = arrayData(json.data?.cargoes)[0] + assertCargo(cargo, editedPayload.cargoes[0]) + }, ({ json }) => ({ + orderId: json.data.order.id, + orderNo: json.data.order.orderNo, + status: json.data.order.status, + cargo: cargoEvidence(json.data.cargoes[0]), + })) + const orderNo = detail.json.data.order.orderNo + + await apiStep('order-lifecycle', 'order list contains edited draft', { + method: 'GET', path: `/api/merchant/v1/orders/first-leg?page=1&size=50&orderNo=${encodeURIComponent(orderNo)}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + const row = pageRecords(json.data).find((item) => String(item.orderId) === String(orderId)) + assertPresent(row, 'order list row') + assertEqual(row.status, 'DRAFT', 'list order status') + assertEqual(row.referenceId, editedPayload.referenceId, 'list referenceId') + assertEqual(row.remark, editedPayload.customerRemark, 'list remark') + }, ({ json }) => { + const row = pageRecords(json.data).find((item) => String(item.orderId) === String(orderId)) + return { total: json.data?.total, orderId: row?.orderId, orderNo: row?.orderNo, status: row?.status } + }) + + await apiStep('order-filters', 'order keyword filter finds draft by order number', { + method: 'GET', path: `/api/merchant/v1/orders/first-leg?page=1&size=50&keyword=${encodeURIComponent(orderNo)}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertPresent(pageRecords(json.data).find((item) => String(item.orderId) === String(orderId)), 'keyword-filtered order') + }, ({ json }) => ({ total: json.data?.total, orderId })) + + await apiStep('order-filters', 'DRAFT status filter contains draft', { + method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=50&status=DRAFT', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertPresent(pageRecords(json.data).find((item) => String(item.orderId) === String(orderId)), 'draft status-filtered order') + }, ({ json }) => ({ total: json.data?.total, orderId, status: 'DRAFT' })) + + const submitKey = newIdempotencyKey('approved-submit') + await apiStep('order-lifecycle', 'submit order', { + method: 'POST', path: `/api/merchant/v1/orders/first-leg/${orderId}/submit`, token: merchantToken, + headers: { 'Idempotency-Key': submitKey }, + }, ({ json }) => requireSuccess(json), () => ({ orderId })) + + await apiStep('order-lifecycle', 'submit order idempotent replay', { + method: 'POST', path: `/api/merchant/v1/orders/first-leg/${orderId}/submit`, token: merchantToken, + headers: { 'Idempotency-Key': submitKey }, + }, ({ json }) => requireSuccess(json), () => ({ orderId, replayed: true })) + + await apiStep('order-lifecycle', 'submitted status is persisted', { + method: 'GET', path: `/api/merchant/v1/orders/first-leg/${orderId}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.order?.status, 'SUBMITTED', 'order status') + }, ({ json }) => ({ orderId, orderNo: json.data.order.orderNo, status: json.data.order.status })) + + await apiStep('order-filters', 'SUBMITTED status filter contains submitted order', { + method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=50&status=SUBMITTED', token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertPresent(pageRecords(json.data).find((item) => String(item.orderId) === String(orderId)), 'submitted status-filtered order') + }, ({ json }) => ({ total: json.data?.total, orderId, status: 'SUBMITTED' })) + + await softApiStep('order-boundary', 'submitted order cannot be edited by client', { + method: 'PUT', path: `/api/merchant/v1/orders/first-leg/${orderId}`, token: merchantToken, body: editedPayload, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }, ({ json }) => ({ orderId, rejectionCode: json.code, message: json.message })) + + await softApiStep('unified-orders', 'unified order list contains submitted order', { + method: 'GET', path: `/api/merchant/v1/orders?page=1&size=50&orderNo=${encodeURIComponent(orderNo)}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + const row = pageRecords(json.data).find((item) => String(item.orderId) === String(orderId)) + assertPresent(row, 'unified order row') + assertEqual(row.mainStatus, 'PENDING_REVIEW', 'unified mainStatus') + }, ({ json }) => { + const row = pageRecords(json.data).find((item) => String(item.orderId) === String(orderId)) + return { total: json.data?.total, orderId: row?.orderId, mainStatus: row?.mainStatus, internalOrderStatus: row?.internalOrderStatus } + }) + await softApiStep('unified-orders', 'unified order detail returns timeline', { + method: 'GET', path: `/api/merchant/v1/orders/${orderId}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.summary?.orderId), String(orderId), 'unified order id') + assertTrue(Array.isArray(json.data?.timeline), 'unified timeline must be an array') + }, ({ json }) => ({ orderId: json.data?.summary?.orderId, mainStatus: json.data?.summary?.mainStatus, timelineCount: arrayData(json.data?.timeline).length })) + + const cancelPayload = buildOrderPayload(masterData, productImageFileId, 'CANCEL', 'draft created for cancellation') + const cancelDraft = await apiStep('order-lifecycle', 'create second draft for cancellation', { + method: 'POST', path: '/api/merchant/v1/orders/first-leg', token: merchantToken, + headers: { 'Idempotency-Key': newIdempotencyKey('cancel-create') }, body: cancelPayload, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data, 'order id') + }, ({ json }) => ({ orderId: json.data })) + const cancelOrderId = cancelDraft.json.data + report.resources.orderIds.push(cancelOrderId) + + await apiStep('order-lifecycle', 'cancel second draft', { + method: 'POST', path: `/api/merchant/v1/orders/first-leg/${cancelOrderId}/cancel`, token: merchantToken, + body: { reason: `客户端自动化取消 ${marker}` }, + }, ({ json }) => requireSuccess(json), () => ({ orderId: cancelOrderId })) + + await apiStep('order-lifecycle', 'cancelled status is persisted', { + method: 'GET', path: `/api/merchant/v1/orders/first-leg/${cancelOrderId}`, token: merchantToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.order?.status, 'CANCELLED', 'order status') + }, ({ json }) => ({ orderId: cancelOrderId, status: json.data.order.status })) + + await softApiStep('order-boundary', 'cancelled order cannot be cancelled again', { + method: 'POST', path: `/api/merchant/v1/orders/first-leg/${cancelOrderId}/cancel`, token: merchantToken, + body: { reason: `重复取消 ${marker}` }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }, ({ json }) => ({ orderId: cancelOrderId, rejectionCode: json.code, message: json.message })) + await softApiStep('order-boundary', 'cancelled order cannot be submitted', { + method: 'POST', path: `/api/merchant/v1/orders/first-leg/${cancelOrderId}/submit`, token: merchantToken, + headers: { 'Idempotency-Key': newIdempotencyKey('cancelled-submit') }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0409', 'business code') + }, ({ json }) => ({ orderId: cancelOrderId, rejectionCode: json.code, message: json.message })) + await softApiStep('order-boundary', 'invalid order page size is rejected', { + method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=201', token: merchantToken, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0422', 'business code') + }, ({ json }) => ({ rejectionCode: json.code })) +} + +async function isolationModule() { + if (!existingClientUsername || !existingClientPassword) { + recordSkipped('isolation', 'cross-client order access is rejected', + 'Set EXISTING_CLIENT_USERNAME and EXISTING_CLIENT_PASSWORD to enable this check') + return + } + const login = await apiStep('isolation', 'existing client login', { + method: 'POST', path: '/api/auth/login', body: { username: existingClientUsername, password: existingClientPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'accessToken') + }, () => ({ username: existingClientUsername })) + existingClientToken = login.json.data.accessToken + const orderId = report.resources.orderIds[1] + await apiStep('isolation', 'cross-client order access is rejected', { + method: 'GET', path: `/api/merchant/v1/orders/first-leg/${orderId}`, token: existingClientToken, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertTrue(['A0403', 'A0404'].includes(String(json?.code)), `expected A0403/A0404, actual=${json?.code}`) + }, ({ json }) => ({ orderId, rejectionCode: json.code })) + await softApiStep('isolation', 'cross-client product image access is rejected', { + method: 'GET', path: `/api/merchant/v1/files/product-images/${report.resources.productImageFileId}`, + token: existingClientToken, + }, ({ json, status }) => { + assertTrue([200, 403, 404].includes(status), `unexpected HTTP status ${status}`) + assertTrue(['A0403', 'A0404'].includes(String(json?.code)), `expected A0403/A0404, actual=${json?.code}`) + }, ({ json }) => ({ fileId: report.resources.productImageFileId, rejectionCode: json?.code })) +} + +async function accountSecurityModule() { + const rotated = await apiStep('account-security', 'rotate refresh token', { + method: 'POST', path: '/api/auth/refresh', body: { refreshToken: merchantRefreshToken }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'rotated accessToken') + assertPresent(json.data?.refreshToken, 'rotated refreshToken') + }, () => ({ rotated: true })) + merchantToken = rotated.json.data.accessToken + merchantRefreshToken = rotated.json.data.refreshToken + + temporaryOwnerPassword = `Temporary${randomUUID().replaceAll('-', '').slice(0, 14)}6!` + await apiStep('account-security', 'change owner password to temporary value', { + method: 'PUT', path: '/api/auth/password', token: merchantToken, + body: { oldPassword: clientPassword, newPassword: temporaryOwnerPassword }, + }, ({ json }) => requireSuccess(json), () => ({ username, passwordChanged: true })) + ownerPasswordNeedsRestore = true + + await apiStep('account-security', 'original password is rejected after change', { + method: 'POST', path: '/api/auth/login', body: { username, password: clientPassword }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0401', 'business code') + }, ({ json }) => ({ username, rejectionCode: json.code })) + + const temporaryLogin = await apiStep('account-security', 'temporary password login succeeds', { + method: 'POST', path: '/api/auth/login', body: { username, password: temporaryOwnerPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'accessToken') + }, () => ({ username })) + merchantToken = temporaryLogin.json.data.accessToken + + await apiStep('account-security', 'restore owner password', { + method: 'PUT', path: '/api/auth/password', token: merchantToken, + body: { oldPassword: temporaryOwnerPassword, newPassword: clientPassword }, + }, ({ json }) => requireSuccess(json), () => ({ username, passwordRestored: true })) + ownerPasswordNeedsRestore = false + temporaryOwnerPassword = undefined + + const restoredLogin = await apiStep('account-security', 'restored owner password login succeeds', { + method: 'POST', path: '/api/auth/login', body: { username, password: clientPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'accessToken') + assertPresent(json.data?.refreshToken, 'refreshToken') + }, () => ({ username, passwordRestored: true })) + merchantToken = restoredLogin.json.data.accessToken + merchantRefreshToken = restoredLogin.json.data.refreshToken + + const loggedOutRefreshToken = merchantRefreshToken + await apiStep('account-security', 'logout current client session', { + method: 'POST', path: '/api/auth/logout', token: merchantToken, body: { refreshToken: loggedOutRefreshToken }, + }, ({ json }) => requireSuccess(json), () => ({ username })) + await apiStep('account-security', 'logged-out refresh token is rejected', { + method: 'POST', path: '/api/auth/refresh', body: { refreshToken: loggedOutRefreshToken }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0401', 'business code') + }, ({ json }) => ({ rejectionCode: json.code })) +} + +async function recoverOwnerPassword() { + try { + const login = await apiStep('account-security-recovery', 'login with temporary owner password for recovery', { + method: 'POST', path: '/api/auth/login', body: { username, password: temporaryOwnerPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'recovery accessToken') + }, () => ({ username })) + await apiStep('account-security-recovery', 'restore owner password after interrupted test', { + method: 'PUT', path: '/api/auth/password', token: login.json.data.accessToken, + body: { oldPassword: temporaryOwnerPassword, newPassword: clientPassword }, + }, ({ json }) => requireSuccess(json), () => ({ username, passwordRestored: true })) + ownerPasswordNeedsRestore = false + temporaryOwnerPassword = undefined + } catch (error) { + report.fatal ??= sanitizeError(error) + report.passwordRecovery = { success: false, error: sanitizeError(error) } + } +} + +async function loadOrderMasterData(token, module) { + const receivingWarehouses = await apiStep(module, 'load active domestic receiving warehouses', { + method: 'GET', path: '/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC', token, + }, ({ json }) => { + requireSuccess(json) + assertTrue(pageRecords(json.data).length > 0, 'at least one active DOMESTIC warehouse is required') + }, ({ json }) => ({ total: json.data?.total, warehouseCount: pageRecords(json.data).length })) + const receiving = pageRecords(receivingWarehouses.json.data)[0] + + const destinationWarehouses = await apiStep(module, 'load active FBA destination warehouses', { + method: 'GET', path: '/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=FBA', token, + }, ({ json }) => { + requireSuccess(json) + assertTrue(pageRecords(json.data).length > 0, 'at least one active FBA warehouse is required') + }, ({ json }) => ({ total: json.data?.total, warehouseCount: pageRecords(json.data).length })) + const destination = pageRecords(destinationWarehouses.json.data)[0] + report.resources.receivingWarehouseId = receiving.id + report.resources.destinationWarehouseId = destination.id + + await apiStep(module, 'load receiving warehouse detail', { + method: 'GET', path: `/api/merchant/v1/warehouses/${receiving.id}`, token, + }, ({ json }) => { + requireSuccess(json) + assertEqual(json.data?.warehouse?.warehouseType, 'DOMESTIC', 'receiving warehouse type') + assertTrue(arrayData(json.data?.addresses).length > 0, 'receiving warehouse address is required') + }, ({ json }) => ({ id: json.data.warehouse.id, name: json.data.warehouse.warehouseName })) + + const channels = await apiStep(module, 'load active pricing channels', { + method: 'GET', path: `/api/merchant/v1/first-leg/pricing/channels?originWarehouseId=${receiving.id}`, token, + }, ({ json }) => { + requireSuccess(json) + assertTrue(arrayData(json.data).length > 0, 'at least one active pricing channel is required') + }, ({ json }) => ({ channels: arrayData(json.data).map((item) => ({ channelCode: item.channelCode, priceModel: item.priceModel, pricingTaxModes: item.pricingTaxModes })) })) + const channel = arrayData(channels.json.data).find((item) => arrayData(item.pricingTaxModes).length > 0) + assertPresent(channel, 'pricing channel with pricingTaxModes') + report.resources.channelCode = channel.channelCode + + const partners = await apiStep(module, 'load public shipper candidates', { + method: 'GET', path: '/api/merchant/v1/partners/candidates?type=SHIPPER', token, + }, ({ json }) => { + requireSuccess(json) + }, ({ json }) => ({ candidateCount: arrayData(json.data).length })) + const partner = arrayData(partners.json.data).find((item) => item.status === 'ACTIVE' && arrayData(item.types).includes('SHIPPER')) + + return { + receiving, + destination, + destinationCandidates: pageRecords(destinationWarehouses.json.data), + channel, + channelCandidates: arrayData(channels.json.data).filter((item) => arrayData(item.pricingTaxModes).length > 0), + partner, + } +} + +async function estimateAvailablePrice(masterData) { + const destinations = masterData.destinationCandidates.slice(0, 30) + const channels = masterData.channelCandidates + let attempt = 0 + for (const channel of channels) { + for (const destination of destinations) { + attempt += 1 + const pricingTaxMode = channel.pricingTaxModes[0] + const estimate = await apiStep('pricing-estimate', `probe configured price ${attempt}`, { + method: 'POST', path: '/api/merchant/v1/first-leg/pricing/estimate', token: merchantToken, + body: { + originWarehouseId: masterData.receiving.id, + channelCode: channel.channelCode, + destinationCode: destination.warehouseCode, + destinationType: 'FBA', + destinationWarehouseId: destination.id, + destinationName: destination.warehouseName, + destinationRegion: null, + pricingTaxMode, + actualWeightKg: 20.5, + actualVolumeCbm: 0.024, + }, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertTrue(['200', 'A0404'].includes(String(json?.code)), `unexpected business code ${json?.code}`) + if (String(json?.code) === '200') { + assertEqual(json.data?.channelCode, channel.channelCode, 'estimate channelCode') + assertEqual(json.data?.pricingTaxMode, pricingTaxMode, 'estimate pricingTaxMode') + assertTrue(Number(json.data?.chargeableQuantity) > 0, 'chargeableQuantity must be positive') + assertTrue(Number(json.data?.unitPrice) >= 0, 'unitPrice must not be negative') + assertTrue(Number(json.data?.estimatedAmount) >= 0, 'estimatedAmount must not be negative') + } + }, ({ json }) => String(json?.code) === '200' ? { + matched: true, + destinationWarehouseId: destination.id, + destinationCode: destination.warehouseCode, + priceBookVersionId: json.data.priceBookVersionId, + channelCode: json.data.channelCode, + priceModel: json.data.priceModel, + pricingTaxMode: json.data.pricingTaxMode, + chargeableQuantity: json.data.chargeableQuantity, + chargeUnit: json.data.chargeUnit, + unitPrice: json.data.unitPrice, + estimatedAmount: json.data.estimatedAmount, + currency: json.data.currency, + } : { + matched: false, + destinationWarehouseId: destination.id, + destinationCode: destination.warehouseCode, + channelCode: channel.channelCode, + code: json?.code, + message: json?.message, + }) + if (String(estimate.json?.code) === '200') return estimate.json.data + } + } + throw new Error(`No configured price matched ${attempt} visible channel/destination combinations`) +} + +async function uploadProductImage(token, module) { + const form = new FormData() + form.append('file', new Blob([testPng()], { type: 'image/png' }), `product-${marker}.png`) + const upload = await apiStep(module, 'upload product image', { + method: 'POST', path: '/api/merchant/v1/files/product-images', token, body: form, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.fileId, 'product image fileId') + assertEqual(json.data?.contentType, 'image/png', 'product image contentType') + }, ({ json }) => ({ fileId: json.data.fileId, fileName: json.data.fileName, contentType: json.data.contentType, sizeBytes: json.data.sizeBytes })) + return upload.json.data.fileId +} + +function buildOrderPayload(masterData, productImageFileId, suffix, remark) { + const cargoShipmentId = `SHIP-${suffix}-${marker}`.slice(0, 64) + const cargoReferenceId = `REF-${suffix}-${marker}`.slice(0, 64) + const unitsPerPackage = 12 + const packageCount = 2 + const totalQuantity = unitsPerPackage * packageCount + const unitDeclaredValue = 8.5 + return { + customerId: masterData.partner?.id ?? null, + customerName: masterData.partner?.partnerName ?? companyName, + transportMode: 'SEA', + tradeTerm: 'FOB', + destinationCountryCode: masterData.destination.countryCode, + destinationWarehouseId: masterData.destination.id, + destinationWarehouseName: masterData.destination.warehouseName, + expectedShipDate: addDays(new Date(), 30), + customerRemark: `${remark} ${marker}`, + pickupMethod: 'PICKUP', + receivingWarehouseId: masterData.receiving.id, + receivingWarehouseName: masterData.receiving.warehouseName, + channelCode: masterData.channel.channelCode, + channelName: masterData.channel.channelName, + carrierId: null, + carrierName: null, + taxMode: 'BUY_DECLARATION', + pricingTaxMode: masterData.channel.pricingTaxModes[0], + containerMode: 'LCL', + customsInspection: false, + destinationType: 'FBA', + amazonWarehouseCode: masterData.destination.warehouseCode, + shipmentId: cargoShipmentId, + referenceId: cargoReferenceId, + sender: { + companyName, contactName: '测试发货人', phone: legalPhone, email: `${username}@example.com`, + countryCode: 'CN', province: '广东省', city: '深圳市', district: '南山区', + addressLine: '测试路 1 号', postalCode: '518000', + }, + receiver: null, + cargoes: [{ + skuNo: `SKU-${suffix}-${marker}`.slice(0, 64), + cargoName: '蓝牙音箱', + cargoNameEn: 'Bluetooth Speaker', + hsCode: '8518210000', + customsHsCode: '8518210000', + packageType: 'CARTON', + lengthCm: 30, + widthCm: 20, + heightCm: 20, + unitsPerPackage, + packageCount, + grossWeightKg: 20.5, + volumeCbm: 0.024, + totalQuantity, + netWeightKg: 18, + unitDeclaredValue, + declaredValue: unitDeclaredValue * totalQuantity, + currency: 'USD', + material: '塑料 / Plastic', + usage: '音频播放 / Audio playback', + model: `MODEL-${suffix}`, + brand: 'TEST-NO-LOGO', + productLengthCm: 12, + productWidthCm: 8, + productHeightCm: 6, + shipmentId: cargoShipmentId, + referenceId: cargoReferenceId, + upcNo: `123456${`${Date.now()}`.slice(-6)}`.slice(0, 12), + productImageFileId, + dangerousGoods: false, + cargoRemark: `cargo-${remark} ${marker}`, + }], + } +} + +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) + const step = makeStep(module, name, true, startedAt, started, response, evidenceBuilder(response)) + report.steps.push(step) + 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 httpRequest({ method = 'GET', path, token, headers = {}, body, responseType = 'json' }) { + const requestHeaders = { Accept: 'application/json', 'X-Request-Id': `client-e2e-${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 assertCargo(actual, expected) { + assertPresent(actual, 'cargo detail') + const exactFields = [ + 'skuNo', 'cargoName', 'cargoNameEn', 'hsCode', 'customsHsCode', 'packageType', 'unitsPerPackage', + 'packageCount', 'totalQuantity', 'currency', 'material', 'model', 'brand', 'shipmentId', + 'referenceId', 'upcNo', 'cargoRemark', + ] + for (const field of exactFields) assertEqual(String(actual[field]), String(expected[field]), `cargo.${field}`) + assertEqual(String(actual.productUsage), String(expected.usage), 'cargo.productUsage') + const decimalFields = [ + 'lengthCm', 'widthCm', 'heightCm', 'grossWeightKg', 'volumeCbm', 'netWeightKg', + 'unitDeclaredValue', 'declaredValue', 'productLengthCm', 'productWidthCm', 'productHeightCm', + ] + for (const field of decimalFields) assertEqual(Number(actual[field]), Number(expected[field]), `cargo.${field}`) + assertEqual(String(actual.productImageFileId), String(expected.productImageFileId), 'cargo.productImageFileId') +} + +function assertQualificationStatuses(values, requiredTypes, expectedStatus) { + const rows = arrayData(values) + for (const type of requiredTypes) { + const item = rows.find((row) => row.qualificationType === type && row.status === expectedStatus) + assertPresent(item, `${type} qualification`) + } +} + +function qualificationEvidence(values) { + return arrayData(values).map((item) => ({ + qualificationId: item.id ?? item.qualificationId, + qualificationType: item.qualificationType, + status: item.status, + })) +} + +function cargoEvidence(cargo) { + if (!cargo) return null + return { + id: cargo.id, + skuNo: cargo.skuNo, + cargoName: cargo.cargoName, + cargoNameEn: cargo.cargoNameEn, + packageCount: cargo.packageCount, + totalQuantity: cargo.totalQuantity, + grossWeightKg: cargo.grossWeightKg, + volumeCbm: cargo.volumeCbm, + shipmentId: cargo.shipmentId, + referenceId: cargo.referenceId, + productImageFileId: cargo.productImageFileId, + } +} + +function defaultEvidence({ json }) { + if (!json || json.data == null) return null + if (typeof json.data !== 'object') return { data: json.data } + return null +} + +function headerOrBody(response, headerName, bodyName) { + return response?.headers?.get(headerName) + ?? response?.json?.[bodyName] + ?? response?.json?.data?.[bodyName] + ?? 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 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 assertSetEqual(actual, expected, label) { + const actualValues = [...new Set(actual)].sort() + const expectedValues = [...new Set(expected)].sort() + assertEqual(JSON.stringify(actualValues), JSON.stringify(expectedValues), label) +} + +function requiredOwnerBackendPermissions() { + return [ + 'merchant:order:list', 'merchant:order:view', 'merchant:order:create', 'merchant:order:edit', + 'merchant:order:submit', 'merchant:order:cancel', 'merchant:profile:view', 'merchant:profile:edit', + 'merchant:qualification:upload', 'merchant:member:list', 'merchant:member:create', + 'merchant:member:edit', 'merchant:member:grant-role', 'merchant:member:status', + 'merchant:member:reset-password', 'merchant:role:list', 'merchant:role:create', + 'merchant:role:edit', 'merchant:role:status', 'merchant:role:delete', 'merchant:role:grant', + ] +} + +function visibleClientMenus(backendPermissions) { + const permissions = new Set(backendPermissions) + const menus = ['dashboard:view', 'account:profile:view'] + if (permissions.has('merchant:order:list') || permissions.has('merchant:order:view')) menus.push('order:first-leg:list') + if (permissions.has('merchant:profile:view')) menus.push('company:profile:view') + if (permissions.has('merchant:member:list')) menus.push('company:member:list') + if (permissions.has('merchant:role:list')) menus.push('company:role:list', 'company:permission:list') + return menus.sort() +} + +function newIdempotencyKey(operation) { + return `client-e2e-${operation}-${marker}-${randomUUID()}`.slice(0, 128) +} + +function testPng() { + return Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=', 'base64') +} + +function addDays(value, days) { + const date = new Date(value) + date.setUTCDate(date.getUTCDate() + days) + return date.toISOString().slice(0, 10) +} + +function compactTimestamp(value) { + return value.toISOString().replace(/[-:TZ.]/g, '').slice(0, 14) +} + +function trimSlash(value) { + return String(value).replace(/\/+$/, '') +} + +function apiPath(value) { + const url = new URL(String(value), `${gateway}/`) + return `${url.pathname}${url.search}` +} + +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 + const previousRawMode = input.isRaw + let value = '' + output.write(`${label}: `) + input.setEncoding('utf8') + input.setRawMode(true) + input.resume() + return new Promise((resolveSecret, rejectSecret) => { + const finish = (error) => { + input.off('data', onData) + input.setRawMode(Boolean(previousRawMode)) + input.pause() + output.write('\n') + if (error) rejectSecret(error) + else resolveSecret(value) + } + const onData = (chunk) => { + for (const character of chunk) { + if (character === '\u0003') return finish(new Error('Credential input cancelled')) + if (character === '\r' || character === '\n') return finish() + if (character === '\u007f' || character === '\b') { + if (value.length > 0) { + value = value.slice(0, -1) + output.write('\b \b') + } + continue + } + if (character >= ' ' && character !== '\u007f') { + value += character + output.write('*') + } + } + } + input.on('data', onData) + }) +} + +function parseArgs(values) { + const parsed = {} + for (let index = 0; index < values.length; index += 1) { + const item = values[index] + if (!item.startsWith('--')) throw new Error(`Unknown argument: ${item}`) + const separator = item.indexOf('=') + if (separator > 2) { + parsed[item.slice(2, separator)] = item.slice(separator + 1) + continue + } + const key = item.slice(2) + const next = values[index + 1] + if (next == null || next.startsWith('--')) throw new Error(`Missing value for --${key}`) + parsed[key] = next + index += 1 + } + return parsed +} + +function printSummary() { + const passed = report.steps.filter((step) => step.passed && !step.skipped).length + const failed = report.steps.filter((step) => !step.passed).length + const skipped = report.steps.filter((step) => step.skipped).length + console.log(JSON.stringify({ success: report.success, marker, passed, failed, skipped, reportPath }, null, 2)) +} diff --git a/scripts/mojia-measurement-scenario.mjs b/scripts/mojia-measurement-scenario.mjs new file mode 100644 index 000000000..65f09b8d9 --- /dev/null +++ b/scripts/mojia-measurement-scenario.mjs @@ -0,0 +1,197 @@ +import { readFile } from 'node:fs/promises' +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const SCENARIO = 'mojia-measurement' +const DEFAULT_IMAGE = resolve( + dirname(fileURLToPath(import.meta.url)), '..', '..', 'apps', 'pda-uniapp', 'static', 'c7.png') + +function success(response) { + return response?.http === 200 && String(response?.body?.code) === '200' +} + +function data(response) { + return response?.body?.data ?? null +} + +function record(run, name, response, passed, evidence = '') { + return run.addStep(SCENARIO, name, response, passed, evidence) +} + +function responseOf(http, body, raw = null) { + return { + method: 'POST', + path: null, + http, + body, + raw, + requestId: body?.requestId ?? null, + traceId: body?.traceId ?? null, + } +} + +async function multipartRequest(run, path, fields, imagePath) { + const form = new FormData() + form.set('data', JSON.stringify(fields)) + form.set('image', new Blob([await readFile(imagePath)], { type: 'image/png' }), 'mojia-e2e.png') + try { + const response = await fetch(`${run.options.gateway}${path}`, { + method: 'POST', + headers: { Accept: 'application/json', Authorization: `Bearer ${run.token}` }, + body: form, + signal: AbortSignal.timeout(30_000), + }) + const text = await response.text() + let body = null + try { body = text ? JSON.parse(text) : null } catch { /* Keep raw response for the report. */ } + return { + method: 'POST', path, http: response.status, body, + raw: body === null ? text.slice(0, 500) : null, + requestId: body?.requestId ?? response.headers.get('x-request-id'), + traceId: body?.traceId ?? response.headers.get('x-trace-id'), + } + } catch (error) { + return responseOf(0, null, error instanceof Error ? error.message : String(error)) + } +} + +function requireData(run, name, response, evidence = '') { + record(run, name, response, success(response) && data(response) !== null, evidence) + if (!success(response) || data(response) === null) { + throw new Error(`${name} failed: code=${response?.body?.code}, message=${response?.body?.message}`) + } + return data(response) +} + +/** + * Run the internal platform simulation for the MoJia carton measurement flow. + * The final external MoJia key/signature contract is intentionally not defined here. + * + * @param {object} run Existing AcceptanceRun instance from admin-test-env-acceptance.mjs. + * @param {object} [options] + * @param {string|number} [options.tenantId] Customer scope for selecting the test inbound. + * @param {string|number} [options.inboundId] Explicit WAIT_MEASURE inbound, preferred for CI. + * @param {string} [options.imagePath] PNG/JPG evidence image path. + */ +export async function runMojiaMeasurementScenario(run, options = {}) { + const tenantId = options.tenantId ?? process.env.MOJIA_TEST_TENANT_ID + const imagePath = options.imagePath ?? process.env.MOJIA_TEST_IMAGE ?? DEFAULT_IMAGE + let inboundId = options.inboundId ?? process.env.MOJIA_TEST_INBOUND_ID + + if (!tenantId && !inboundId) { + const response = responseOf(0, { code: 'DEPLOYMENT_BLOCKED', message: '缺少墨家测试 tenantId 或 inboundId' }) + record(run, '墨家测量测试数据配置', response, false, '请传入 MOJIA_TEST_TENANT_ID 或 MOJIA_TEST_INBOUND_ID') + return false + } + + try { + if (!inboundId) { + const response = await run.request( + 'GET', '/api/platform/inbounds?processStatus=WAIT_MEASURE&page=1&size=200') + const rows = requireData(run, '查找墨家 WAIT_MEASURE 入库单', response) + const candidate = rows.records?.find((row) => String(row.tenantId) === String(tenantId) + && row.totalPackageCount == null) + if (!candidate) { + record(run, '墨家测量测试数据配置', response, false, + `tenantId=${tenantId} 下没有未冻结总箱数的 WAIT_MEASURE 入库单`) + return false + } + inboundId = String(candidate.id) + } + + const detailPath = `/api/platform/inbounds/${inboundId}?tenantId=${tenantId}` + const detailResponse = await run.request('GET', detailPath) + const detail = requireData(run, '查询墨家测试入库单', detailResponse, `inboundId=${inboundId}`) + const summary = detail.summary + if (summary.processStatus !== 'WAIT_MEASURE' || summary.totalPackageCount != null) { + record(run, '墨家测试入库单状态校验', detailResponse, false, + `processStatus=${summary.processStatus}, totalPackageCount=${summary.totalPackageCount}`) + return false + } + const resolvedTenantId = String(summary.tenantId ?? tenantId) + + const printPath = `/api/platform/inbounds/${inboundId}/carton-label-pdf?tenantId=${resolvedTenantId}` + const printResponse = await run.requestBinary('POST', printPath) + record(run, '墨家测试生成稳定箱唛 PDF', printResponse, + printResponse.http === 200 && printResponse.bytes?.length > 0 + && printResponse.contentType?.toLowerCase().includes('application/pdf'), + `inboundId=${inboundId}, bytes=${printResponse.bytes?.length ?? 0}`) + + const afterPrintResponse = await run.request('GET', detailPath) + const afterPrint = requireData(run, '回查墨家稳定箱号总数', afterPrintResponse) + const printedTotal = Number(afterPrint.summary.totalPackageCount) + if (!Number.isInteger(printedTotal) || printedTotal < 1) { + throw new Error('打印后没有冻结原始总箱数') + } + const boxCode = `${afterPrint.summary.inboundCode}#${printedTotal}-1` + const scanPath = `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/carton-scans?tenantId=${resolvedTenantId}` + const firstFields = { + boxCode, length: 60.1, width: 40.2, height: 30.3, weight: 12.5, + machineNo: 'MJ-ADMIN-E2E-01', measuredAt: '2026-08-08T10:00:00', + } + const firstResponse = await multipartRequest(run, scanPath, firstFields, imagePath) + const first = requireData(run, '墨家单箱首次测量上传', firstResponse, `boxCode=${boxCode}`) + const firstPassed = first.created === true && first.confirmedPackageCount === 1 + && String(first.boxCode) === boxCode + record(run, '墨家单箱首次记录语义', firstResponse, firstPassed, + `itemId=${first.itemId}, measurementId=${first.measurementId}`) + if (!firstPassed) throw new Error('首次扫描没有创建单箱记录或默认箱数不是 1') + + const countPath = `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/items/${first.itemId}/confirmed-package-count?tenantId=${resolvedTenantId}` + const countResponse = await run.request('PUT', countPath, { + measurementVersion: first.measurementVersion, + confirmedPackageCount: printedTotal, + }) + const counted = requireData(run, '人工确认墨家单箱代表箱数', countResponse, + `confirmedPackageCount=${printedTotal}`) + if (counted.confirmedPackageCount !== printedTotal) { + throw new Error('人工确认箱数回显不一致') + } + + const rescanResponse = await multipartRequest(run, scanPath, { + boxCode, length: 61.1, width: 41.2, height: 31.3, weight: 13.5, + machineNo: 'MJ-ADMIN-E2E-02', measuredAt: '2026-08-08T10:01:00', + }, imagePath) + const rescan = requireData(run, '墨家同箱复测覆盖', rescanResponse) + const rescanPassed = rescan.created === false + && String(rescan.itemId) === String(first.itemId) + && rescan.confirmedPackageCount === printedTotal + && Number(rescan.lengthCm) === 61.1 + record(run, '墨家同箱复测保留人工箱数', rescanResponse, rescanPassed, + `itemId=${rescan.itemId}, confirmedPackageCount=${rescan.confirmedPackageCount}`) + if (!rescanPassed) throw new Error('同箱复测没有覆盖设备值或覆盖人工箱数') + + const submitPath = `/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/submit?tenantId=${resolvedTenantId}` + const submitResponse = await run.request('POST', submitPath, { + measurementId: rescan.measurementId, + version: rescan.measurementVersion, + }) + const submitted = requireData(run, '提交墨家测量审核', submitResponse) + const submittedPassed = submitted.processStatus === 'MEASURE_PENDING' + && submitted.measureReviewStatus === 'PENDING' + record(run, '墨家测量进入待审核', submitResponse, submittedPassed, + `processStatus=${submitted.processStatus}, reviewStatus=${submitted.measureReviewStatus}`) + if (!submittedPassed) throw new Error('墨家测量提交后状态不正确') + + const blockedResponse = await multipartRequest(run, scanPath, { + boxCode, length: 99.1, width: 99.2, height: 99.3, weight: 99.4, + machineNo: 'MJ-ADMIN-E2E-BLOCKED', measuredAt: '2026-08-08T10:02:00', + }, imagePath) + const blockedPassed = blockedResponse.body?.code === 'A0409' + && blockedResponse.body?.message?.includes('测量已提交') + record(run, '提交后拒绝墨家设备覆盖', blockedResponse, blockedPassed, + `code=${blockedResponse.body?.code}, message=${blockedResponse.body?.message ?? ''}`) + if (!blockedPassed) throw new Error('提交后没有拒绝墨家设备覆盖') + + run.context ??= {} + run.context.mojiaMeasurement = { + tenantId: resolvedTenantId, inboundId: String(inboundId), boxCode, + measurementId: String(rescan.measurementId), itemId: String(rescan.itemId), + } + return true + } catch (error) { + const response = responseOf(0, null, error instanceof Error ? error.message : String(error)) + record(run, '墨家测量场景执行', response, false, response.raw) + return false + } +}