diff --git a/iam/src/main/java/com/baiyue/iam/client/OverseasStorageFeeClient.java b/iam/src/main/java/com/baiyue/iam/client/OverseasStorageFeeClient.java index 6c5b4f9f7..c0355ebf4 100644 --- a/iam/src/main/java/com/baiyue/iam/client/OverseasStorageFeeClient.java +++ b/iam/src/main/java/com/baiyue/iam/client/OverseasStorageFeeClient.java @@ -21,7 +21,7 @@ public interface OverseasStorageFeeClient { ApiResponse compensate(@RequestHeader("X-Internal-Service-Token") String token, @RequestBody CompensationRequest request); - record InitializationRequest(long tenantId, long operatorId, String initializationKey) { } + record InitializationRequest(long tenantId, long operatorId, String initializationKey, String customerName) { } record InitializationResponse(Long configId, boolean createdByThisInitialization) { } record CompensationRequest(long tenantId, String initializationKey) { } } diff --git a/iam/src/main/java/com/baiyue/iam/service/MerchantOnboardingService.java b/iam/src/main/java/com/baiyue/iam/service/MerchantOnboardingService.java index 30c2c6117..db8c43964 100644 --- a/iam/src/main/java/com/baiyue/iam/service/MerchantOnboardingService.java +++ b/iam/src/main/java/com/baiyue/iam/service/MerchantOnboardingService.java @@ -121,7 +121,7 @@ public class MerchantOnboardingService { addressMapper.insert(address); } dimensionRuleInitialization.initialize(tenantId, request.authUserId()); - overseasStorageFeeInitialization.initialize(tenantId, request.authUserId()); + overseasStorageFeeInitialization.initialize(tenantId, request.authUserId(), tenant.getTenantName()); return new MerchantRegistrationResponse(tenantId, membershipId, tenant.getStatus()); } diff --git a/iam/src/main/java/com/baiyue/iam/service/OverseasStorageFeeInitializationService.java b/iam/src/main/java/com/baiyue/iam/service/OverseasStorageFeeInitializationService.java index f39b8b6df..8afbb82c1 100644 --- a/iam/src/main/java/com/baiyue/iam/service/OverseasStorageFeeInitializationService.java +++ b/iam/src/main/java/com/baiyue/iam/service/OverseasStorageFeeInitializationService.java @@ -22,13 +22,13 @@ public class OverseasStorageFeeInitializationService { @Resource private OverseasStorageFeeClient client; @Value("${baiyue.security.internal-service-token}") private String internalToken; - public InitializationResult initialize(long tenantId, long operatorId) { + public InitializationResult initialize(long tenantId, long operatorId, String customerName) { String key = initializationKey(tenantId); RuntimeException last = null; for (int attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { try { ApiResponse response = client.initialize( - internalToken, new OverseasStorageFeeClient.InitializationRequest(tenantId, operatorId, key)); + internalToken, new OverseasStorageFeeClient.InitializationRequest(tenantId, operatorId, key, customerName)); if (response != null && response.successful() && response.data() != null) { InitializationResult result = new InitializationResult( response.data().createdByThisInitialization(), key); diff --git a/iam/src/main/java/com/baiyue/iam/service/TenantService.java b/iam/src/main/java/com/baiyue/iam/service/TenantService.java index 4faf4319a..f42852107 100644 --- a/iam/src/main/java/com/baiyue/iam/service/TenantService.java +++ b/iam/src/main/java/com/baiyue/iam/service/TenantService.java @@ -182,7 +182,7 @@ public class TenantService { tenant.setUpdatedBy(operatorId); repository.insertTenant(tenant); dimensionRuleInitialization.initialize(tenant.getId(), operatorId); - overseasStorageFeeInitialization.initialize(tenant.getId(), operatorId); + overseasStorageFeeInitialization.initialize(tenant.getId(), operatorId, tenant.getTenantName()); var administrator = administratorProvisioning.provisionPlatformCreatedTenant(tenant, operatorId); return new CreationResponse(response(tenant), administrator.username(), administrator.temporaryPassword()); diff --git a/iam/src/test/java/com/baiyue/iam/service/MerchantOnboardingServiceTest.java b/iam/src/test/java/com/baiyue/iam/service/MerchantOnboardingServiceTest.java index 9d116d469..ade730ea0 100644 --- a/iam/src/test/java/com/baiyue/iam/service/MerchantOnboardingServiceTest.java +++ b/iam/src/test/java/com/baiyue/iam/service/MerchantOnboardingServiceTest.java @@ -66,7 +66,7 @@ class MerchantOnboardingServiceTest { verify(memberships).insert(membership.capture()); verify(membershipRoles).insert(roleGrant.capture()); verify(dimensionRuleInitialization).initialize(result.tenantId(), 9001L); - verify(overseasStorageFeeInitialization).initialize(result.tenantId(), 9001L); + verify(overseasStorageFeeInitialization).initialize(result.tenantId(), 9001L, "测试企业"); assertEquals("PROFILE_REQUIRED", result.tenantStatus()); assertEquals(result.tenantId(), tenant.getValue().getId()); diff --git a/iam/src/test/java/com/baiyue/iam/service/OverseasStorageFeeInitializationServiceTest.java b/iam/src/test/java/com/baiyue/iam/service/OverseasStorageFeeInitializationServiceTest.java index acf15019e..169056e8f 100644 --- a/iam/src/test/java/com/baiyue/iam/service/OverseasStorageFeeInitializationServiceTest.java +++ b/iam/src/test/java/com/baiyue/iam/service/OverseasStorageFeeInitializationServiceTest.java @@ -34,7 +34,7 @@ class OverseasStorageFeeInitializationServiceTest { @Test void retriesThreeTimesWithDeterministicKey() { when(client.initialize(anyString(), any())).thenThrow(new RuntimeException("timeout")); when(client.compensate(anyString(), any(OverseasStorageFeeClient.CompensationRequest.class))).thenReturn(ApiResponse.success(null)); - BizException error = assertThrows(BizException.class, () -> service.initialize(208L, 9L)); + BizException error = assertThrows(BizException.class, () -> service.initialize(208L, 9L, "客户")); assertEquals(ResultCode.SERVICE_UNAVAILABLE, error.getResultCode()); verify(client, times(3)).initialize(anyString(), any(OverseasStorageFeeClient.InitializationRequest.class)); verify(client).compensate("internal-token", new OverseasStorageFeeClient.CompensationRequest(208L, "iam-customer-create-overseas-fee:208")); diff --git a/reports/admin-test-env-acceptance-20260808065359.json b/reports/admin-test-env-acceptance-20260808065359.json new file mode 100644 index 000000000..08dc53b55 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808065359.json @@ -0,0 +1,435 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808065359934", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T06:54:01.938Z", + "startedAt": "2026-08-08T06:53:59.934Z", + "success": false, + "fatal": null, + "summary": { + "total": 19, + "passed": 15, + "failed": 4 + }, + "modules": [ + { + "name": "overseas-storage-fees", + "startedAt": "2026-08-08T06:54:00.315Z", + "finishedAt": "2026-08-08T06:54:01.938Z", + "success": false, + "passed": 14, + "failed": 4, + "fatal": null + } + ], + "scenarios": [ + { + "name": "customer-overseas-storage-fee-lifecycle", + "module": "overseas-storage-fees", + "success": false, + "deploymentBlocked": true, + "passed": 14, + "failed": 4 + } + ], + "deploymentBlockers": [ + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "修改后币种、价格、9档及版本整体回显", + "evidence": "currency=EUR, version=1, tiers=9", + "code": "200", + "requestId": "1b3e9007-3bce-4dc5-8bcd-e2f622f698c0, f704cd04-0a0d-40e9-b9d4-4b6e171e95ce", + "traceId": "8cc5f4c572564f12b7ed16575880a7e2" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "冲突未造成部分更新", + "evidence": "version=1, unchanged=true", + "code": "200", + "requestId": "87016da5-09ad-423b-882d-d9e6f9bc8302, e1382b9c-31e6-43f2-a5b4-d4c87ada450b", + "traceId": "149a8ab4baec44f88b5e0aa2d24d1ced" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复本轮客户费用原始配置", + "evidence": "restore=initial", + "code": "A0422", + "requestId": "e772de39-7242-48a8-9e4e-108c941e2281", + "traceId": "fe07e9fd7613495bb8ebaec4ce75d427" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复后9档、USD、免费档和无上限档一致", + "evidence": "currency=EUR, version=1, tiers=9", + "code": "200", + "requestId": "121fdf43-c905-413b-b903-93761c4fbfa3, cd45037f-90e6-4393-ad4b-a1b9efc5e45a", + "traceId": "0aac3349fdba4446b5aab9835d45df50" + } + ], + "createdResources": { + "overseasStorageFeeCustomer": { + "tenantId": "2085982841955012609", + "marker": "ADMIN-API-20260808065359934", + "ownedByModule": true + } + }, + "excluded": [ + { + "scope": "dashboard", + "reason": "首页为静态演示数据,不调用后端 API" + }, + { + "scope": "hidden-prototypes", + "reason": "隐藏原型页面尚无已确认后端契约" + } + ], + "securityNote": "报告不保存登录密码、Access Token、Refresh Token、图片二进制或 OCR 原文全文。", + "steps": [ + { + "module": "authentication", + "scenario": null, + "name": "平台管理员登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0db4a44a-dbc6-4f84-b553-fbfee8ed8b8e, a432e66f-c1c7-47b1-8d4b-97d1c285352c", + "traceId": "3728103aab034b85b273b95ed105b46c", + "evidence": "", + "checkedAt": "2026-08-08T06:54:00.313Z" + }, + { + "module": "overseas-storage-fees", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16172040315" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "13d24ff8-ba69-48e3-8e4e-117c1d899ff4, 89009cea-52a6-44b3-afac-b9bcc77f7779", + "traceId": "51ea477f6a6c4c7bab8a8e22b8e267e8", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T06:54:00.557Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "创建海外仓费用隔离客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa4ded48-6b11-429b-8033-ed16100666a6, 707817b8-9ba3-4889-9f79-7c1a05546564", + "traceId": "39044aa3bef440b486e2fc61899321c5", + "evidence": "", + "checkedAt": "2026-08-08T06:54:01.244Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "海外仓费用隔离客户创建并带 marker", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa4ded48-6b11-429b-8033-ed16100666a6, 707817b8-9ba3-4889-9f79-7c1a05546564", + "traceId": "39044aa3bef440b486e2fc61899321c5", + "evidence": "tenantId=2085982841955012609", + "checkedAt": "2026-08-08T06:54:01.245Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "查询客户海外仓费用配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f803e78c-053a-4f8e-b59f-23c41982b470, 4237c9d5-cf92-4a38-82b7-a630df8e3c55", + "traceId": "27f6c77621c144ebb033cd7815e506fa", + "evidence": "tenantId=2085982841955012609", + "checkedAt": "2026-08-08T06:54:01.303Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "客户费用配置身份、默认 USD 与9档结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f803e78c-053a-4f8e-b59f-23c41982b470, 4237c9d5-cf92-4a38-82b7-a630df8e3c55", + "traceId": "27f6c77621c144ebb033cd7815e506fa", + "evidence": "ruleId=2085982842560495618, customerId=2085982841955012609, currency=USD, tiers=9", + "checkedAt": "2026-08-08T06:54:01.303Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "请求体客户 ID 与路径不一致时安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "A0422", + "message": "customerName: must not be blank", + "requestId": "98f3e904-40ca-4e75-adcd-daac009061f4", + "traceId": "cec7ec0f388b41cca76da9d591bdedb2", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T06:54:01.439Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "整组修改客户海外仓费用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "276938b8-b96d-4de5-bea5-887f62f179d6, 24d76e17-16c5-4323-8c62-942a791d03d7", + "traceId": "db7b40c4abd149f5b1f0d7c47126d84f", + "evidence": "tenantId=2085982841955012609, tiers=9", + "checkedAt": "2026-08-08T06:54:01.554Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "回查整组修改后的客户费用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b3e9007-3bce-4dc5-8bcd-e2f622f698c0, f704cd04-0a0d-40e9-b9d4-4b6e171e95ce", + "traceId": "8cc5f4c572564f12b7ed16575880a7e2", + "evidence": "", + "checkedAt": "2026-08-08T06:54:01.601Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "修改后币种、价格、9档及版本整体回显", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b3e9007-3bce-4dc5-8bcd-e2f622f698c0, f704cd04-0a0d-40e9-b9d4-4b6e171e95ce", + "traceId": "8cc5f4c572564f12b7ed16575880a7e2", + "evidence": "currency=EUR, version=1, tiers=9", + "checkedAt": "2026-08-08T06:54:01.601Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "旧 version 整组保存返回并发冲突", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "A0409", + "message": "费用配置已被修改,请刷新后重试", + "requestId": "de8451f1-4154-4180-ab7c-bd8722a12ec3", + "traceId": "9959a565d9cf48ea8defb0a142ae1a20", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T06:54:01.657Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "冲突后回查费用配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "87016da5-09ad-423b-882d-d9e6f9bc8302, e1382b9c-31e6-43f2-a5b4-d4c87ada450b", + "traceId": "149a8ab4baec44f88b5e0aa2d24d1ced", + "evidence": "", + "checkedAt": "2026-08-08T06:54:01.693Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "冲突未造成部分更新", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "87016da5-09ad-423b-882d-d9e6f9bc8302, e1382b9c-31e6-43f2-a5b4-d4c87ada450b", + "traceId": "149a8ab4baec44f88b5e0aa2d24d1ced", + "evidence": "version=1, unchanged=true", + "checkedAt": "2026-08-08T06:54:01.694Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复本轮客户费用原始配置", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "A0422", + "message": "customerName: must not be blank", + "requestId": "e772de39-7242-48a8-9e4e-108c941e2281", + "traceId": "fe07e9fd7613495bb8ebaec4ce75d427", + "evidence": "restore=initial", + "checkedAt": "2026-08-08T06:54:01.735Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "回查恢复后的客户费用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "121fdf43-c905-413b-b903-93761c4fbfa3, cd45037f-90e6-4393-ad4b-a1b9efc5e45a", + "traceId": "0aac3349fdba4446b5aab9835d45df50", + "evidence": "", + "checkedAt": "2026-08-08T06:54:01.771Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复后9档、USD、免费档和无上限档一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "121fdf43-c905-413b-b903-93761c4fbfa3, cd45037f-90e6-4393-ad4b-a1b9efc5e45a", + "traceId": "0aac3349fdba4446b5aab9835d45df50", + "evidence": "currency=EUR, version=1, tiers=9", + "checkedAt": "2026-08-08T06:54:01.771Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "错误客户 ID 查询安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/999999999999999999/overseas-storage-fees" + }, + "http": 200, + "code": "A0404", + "message": "海外仓费用不存在", + "requestId": "453ac66a-a6c7-4d50-9077-1616fa5beba8", + "traceId": "12cc06d5762d4e1ca508b7d59236078a", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T06:54:01.812Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "清理费用隔离客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/archive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a6dffa51-b4df-451f-8bbf-7ed6c2d1c779, 77819f42-d164-4029-9ca6-fbb58408cfe4", + "traceId": "3523f77cb0394fe2b12974ef7222672a", + "evidence": "tenantId=2085982841955012609", + "checkedAt": "2026-08-08T06:54:01.938Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "费用隔离客户清理后停用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085982841955012609/archive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a6dffa51-b4df-451f-8bbf-7ed6c2d1c779, 77819f42-d164-4029-9ca6-fbb58408cfe4", + "traceId": "3523f77cb0394fe2b12974ef7222672a", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T06:54:01.938Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808065918.json b/reports/admin-test-env-acceptance-20260808065918.json new file mode 100644 index 000000000..170d14cd4 --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808065918.json @@ -0,0 +1,435 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808065918334", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T06:59:19.626Z", + "startedAt": "2026-08-08T06:59:18.334Z", + "success": false, + "fatal": null, + "summary": { + "total": 19, + "passed": 15, + "failed": 4 + }, + "modules": [ + { + "name": "overseas-storage-fees", + "startedAt": "2026-08-08T06:59:18.713Z", + "finishedAt": "2026-08-08T06:59:19.626Z", + "success": false, + "passed": 14, + "failed": 4, + "fatal": null + } + ], + "scenarios": [ + { + "name": "customer-overseas-storage-fee-lifecycle", + "module": "overseas-storage-fees", + "success": false, + "deploymentBlocked": true, + "passed": 14, + "failed": 4 + } + ], + "deploymentBlockers": [ + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "修改后币种、价格、9档及版本整体回显", + "evidence": "currency=EUR, version=1, tiers=9", + "code": "200", + "requestId": "98bd77a6-3aca-497c-ae3e-7c0d1813701a, a3bd16c8-2306-4c16-9b83-5307590f05f6", + "traceId": "a1ffdf71954f4d7c9e055a9f231763d6" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "冲突未造成部分更新", + "evidence": "version=1, unchanged=true", + "code": "200", + "requestId": "f1fc0661-7ff9-4909-a1ce-80f4cce23278, 02b01b87-38f7-4c4d-8ba1-171fd609ed94", + "traceId": "a54fcb6faf7f4ed1926239b7d8814e08" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复本轮客户费用原始配置", + "evidence": "restore=initial", + "code": "A0422", + "requestId": "a3b0f559-bb7b-41e0-8bc2-a912ed17887f", + "traceId": "77a0aadebbd74a1aa6f5b9c052508f14" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复后9档、USD、免费档和无上限档一致", + "evidence": "currency=EUR, version=1, tiers=9", + "code": "200", + "requestId": "6dd92676-a02c-4e34-a6ea-6b1552f980b9, c3197de5-acd8-46b4-8e3f-ebd904ba4e62", + "traceId": "4e603484f649499face24450f350fc4b" + } + ], + "createdResources": { + "overseasStorageFeeCustomer": { + "tenantId": "2085984176263778306", + "marker": "ADMIN-API-20260808065918334", + "ownedByModule": true + } + }, + "excluded": [ + { + "scope": "dashboard", + "reason": "首页为静态演示数据,不调用后端 API" + }, + { + "scope": "hidden-prototypes", + "reason": "隐藏原型页面尚无已确认后端契约" + } + ], + "securityNote": "报告不保存登录密码、Access Token、Refresh Token、图片二进制或 OCR 原文全文。", + "steps": [ + { + "module": "authentication", + "scenario": null, + "name": "平台管理员登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9052ad17-f00f-4295-822e-4bb685cbce7f, 874710e5-e85b-4583-81e7-5f71b89c5727", + "traceId": "85a2e60d23214e89bb6cd146cae95d10", + "evidence": "", + "checkedAt": "2026-08-08T06:59:18.712Z" + }, + { + "module": "overseas-storage-fees", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16172358714" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0ea7bda7-9523-4344-988a-d9f1bec47907, cfcfd3d6-73f1-4fec-b263-422c02e0f46d", + "traceId": "7a56265ac56b40118510d04b58809db5", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T06:59:18.764Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "创建海外仓费用隔离客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "380f8d9d-e0f4-4462-928a-bda83aba0c6a, 42e42bef-9565-4498-972c-e5f5ebd90a78", + "traceId": "18e6db0461074e1984374b4105fe4f8e", + "evidence": "", + "checkedAt": "2026-08-08T06:59:19.160Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "海外仓费用隔离客户创建并带 marker", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "380f8d9d-e0f4-4462-928a-bda83aba0c6a, 42e42bef-9565-4498-972c-e5f5ebd90a78", + "traceId": "18e6db0461074e1984374b4105fe4f8e", + "evidence": "tenantId=2085984176263778306", + "checkedAt": "2026-08-08T06:59:19.160Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "查询客户海外仓费用配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49f8654a-ed79-48f5-81db-e1cf6cf2437d, d4cb71c3-bda1-4e89-829f-4345a81d3eb5", + "traceId": "003b950720fd49ebb258f12be1190b74", + "evidence": "tenantId=2085984176263778306", + "checkedAt": "2026-08-08T06:59:19.196Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "客户费用配置身份、默认 USD 与9档结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49f8654a-ed79-48f5-81db-e1cf6cf2437d, d4cb71c3-bda1-4e89-829f-4345a81d3eb5", + "traceId": "003b950720fd49ebb258f12be1190b74", + "evidence": "ruleId=2085984176365944834, customerId=2085984176263778306, currency=USD, tiers=9", + "checkedAt": "2026-08-08T06:59:19.197Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "请求体客户 ID 与路径不一致时安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "A0422", + "message": "customerName: must not be blank", + "requestId": "92e8e381-052f-4460-aee3-e643aea91970", + "traceId": "0a9131c92a314625916c6dbb1fa8acf8", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T06:59:19.238Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "整组修改客户海外仓费用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c87bce9-30bf-4af0-9d68-8ab5931dc70e, 5fbf59bc-8751-4b1d-afc7-cf4ee697cb43", + "traceId": "043f08f2b36e4de1a2d003dab1217b27", + "evidence": "tenantId=2085984176263778306, tiers=9", + "checkedAt": "2026-08-08T06:59:19.304Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "回查整组修改后的客户费用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98bd77a6-3aca-497c-ae3e-7c0d1813701a, a3bd16c8-2306-4c16-9b83-5307590f05f6", + "traceId": "a1ffdf71954f4d7c9e055a9f231763d6", + "evidence": "", + "checkedAt": "2026-08-08T06:59:19.348Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "修改后币种、价格、9档及版本整体回显", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98bd77a6-3aca-497c-ae3e-7c0d1813701a, a3bd16c8-2306-4c16-9b83-5307590f05f6", + "traceId": "a1ffdf71954f4d7c9e055a9f231763d6", + "evidence": "currency=EUR, version=1, tiers=9", + "checkedAt": "2026-08-08T06:59:19.348Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "旧 version 整组保存返回并发冲突", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "A0409", + "message": "费用配置已被修改,请刷新后重试", + "requestId": "43c1ea00-38d1-4a12-933e-dfb32b51fa76", + "traceId": "234e50007d3446ddb5d6e67844c25bd5", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T06:59:19.387Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "冲突后回查费用配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f1fc0661-7ff9-4909-a1ce-80f4cce23278, 02b01b87-38f7-4c4d-8ba1-171fd609ed94", + "traceId": "a54fcb6faf7f4ed1926239b7d8814e08", + "evidence": "", + "checkedAt": "2026-08-08T06:59:19.427Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "冲突未造成部分更新", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f1fc0661-7ff9-4909-a1ce-80f4cce23278, 02b01b87-38f7-4c4d-8ba1-171fd609ed94", + "traceId": "a54fcb6faf7f4ed1926239b7d8814e08", + "evidence": "version=1, unchanged=true", + "checkedAt": "2026-08-08T06:59:19.427Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复本轮客户费用原始配置", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "A0422", + "message": "customerName: must not be blank", + "requestId": "a3b0f559-bb7b-41e0-8bc2-a912ed17887f", + "traceId": "77a0aadebbd74a1aa6f5b9c052508f14", + "evidence": "restore=initial", + "checkedAt": "2026-08-08T06:59:19.451Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "回查恢复后的客户费用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6dd92676-a02c-4e34-a6ea-6b1552f980b9, c3197de5-acd8-46b4-8e3f-ebd904ba4e62", + "traceId": "4e603484f649499face24450f350fc4b", + "evidence": "", + "checkedAt": "2026-08-08T06:59:19.480Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "恢复后9档、USD、免费档和无上限档一致", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/overseas-storage-fees" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6dd92676-a02c-4e34-a6ea-6b1552f980b9, c3197de5-acd8-46b4-8e3f-ebd904ba4e62", + "traceId": "4e603484f649499face24450f350fc4b", + "evidence": "currency=EUR, version=1, tiers=9", + "checkedAt": "2026-08-08T06:59:19.480Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "错误客户 ID 查询安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/999999999999999999/overseas-storage-fees" + }, + "http": 200, + "code": "A0404", + "message": "海外仓费用不存在", + "requestId": "e6878682-5ab5-4c4a-91d0-e78a01db654b", + "traceId": "c2bd85464f4e42018837b501c659ce9d", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T06:59:19.517Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "清理费用隔离客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/archive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a15fbf86-29c5-4f9a-ab16-becbd38399c7, 9a621749-af84-459e-9a58-f7fb230de02c", + "traceId": "e02b8542476d4764886907d01ef887f1", + "evidence": "tenantId=2085984176263778306", + "checkedAt": "2026-08-08T06:59:19.626Z" + }, + { + "module": "overseas-storage-fees", + "scenario": "customer-overseas-storage-fee-lifecycle", + "name": "费用隔离客户清理后停用", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085984176263778306/archive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a15fbf86-29c5-4f9a-ab16-becbd38399c7, 9a621749-af84-459e-9a58-f7fb230de02c", + "traceId": "e02b8542476d4764886907d01ef887f1", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T06:59:19.626Z" + } + ] +} diff --git a/reports/postdeploy-service-center-after-sql.json b/reports/postdeploy-service-center-after-sql.json new file mode 100644 index 000000000..9326155d7 --- /dev/null +++ b/reports/postdeploy-service-center-after-sql.json @@ -0,0 +1,1148 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808065140561", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T06:51:43.162Z", + "startedAt": "2026-08-08T06:51:40.561Z", + "success": false, + "fatal": null, + "summary": { + "total": 60, + "passed": 59, + "failed": 1 + }, + "modules": [ + { + "name": "ocean-bookings", + "startedAt": "2026-08-08T06:51:40.941Z", + "finishedAt": "2026-08-08T06:51:42.248Z", + "success": true, + "passed": 23, + "failed": 0, + "fatal": null + }, + { + "name": "truck-appointments", + "startedAt": "2026-08-08T06:51:42.248Z", + "finishedAt": "2026-08-08T06:51:43.162Z", + "success": false, + "passed": 35, + "failed": 1, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [ + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "附件引用安全边界自动化缺口", + "evidence": "当前 Controller 无附件上传/引用 API,未伪造附件成功", + "code": null, + "requestId": null, + "traceId": null + } + ], + "createdResources": { + "oceanBooking": { + "id": "2085982258035470337", + "marker": "ADMIN-API-20260808065140561", + "finalStatus": "RELEASED" + }, + "truckAppointment": { + "id": "2085982263269961729", + "marker": "ADMIN-API-20260808065140561", + "finalStatus": "CANCELLED" + } + }, + "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": "66a718d3-da2c-4bdd-a74a-8eb49efef556, db108f6c-e823-42df-b1b4-c32793493320", + "traceId": "3bd6196f0e624b8db6ecc986b314a78d", + "evidence": "", + "checkedAt": "2026-08-08T06:51:40.939Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱列表分页与 keyword 查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&keyword=ADMIN-API-20260808065140561" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "661eb9ca-1677-41b9-a92b-da07a1c1c46d, 0a2ab443-4d1e-4aad-8d8c-0520412a098b", + "traceId": "4a6ef864b3d8421e9af5331083f8584a", + "evidence": "", + "checkedAt": "2026-08-08T06:51:41.127Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱列表分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&keyword=ADMIN-API-20260808065140561" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "661eb9ca-1677-41b9-a92b-da07a1c1c46d, 0a2ab443-4d1e-4aad-8d8c-0520412a098b", + "traceId": "4a6ef864b3d8421e9af5331083f8584a", + "evidence": "records=0", + "checkedAt": "2026-08-08T06:51:41.127Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 DRAFT 状态筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=DRAFT" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aa09a8c5-df63-451e-b777-4001ceef75b3, bade92fb-6103-4bbc-a081-f8767af3472f", + "traceId": "f2b1e8b0bbc64d86b6eb564d4b13e60e", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:41.162Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 SUBMITTED 状态筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=SUBMITTED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b111ccd2-e9d0-48b8-8408-3c794463114b, ae6d1fd3-3238-4c18-ba17-389c546c18d5", + "traceId": "0bc41333c1364e22bb9cb1d5bc678159", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:41.201Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 CONFIRMED 状态筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=CONFIRMED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1a5e8093-0e7c-45af-a864-dd651f049595, 354d952f-6677-47b2-b203-6499ca00966a", + "traceId": "c66dbeae051d43c98efda5c54dfcd3e5", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:41.247Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 RELEASED 状态筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=RELEASED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "75d8842e-749c-4268-b5f4-25fdde93509b, 7a586ca2-72ba-48d1-9b52-71b76a63886e", + "traceId": "0aca8394454d45369b2560abe7f16011", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:41.294Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 FAILED 状态筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=FAILED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b19509ea-5762-4ed1-adaa-a0a60e58e8e2, 4cd100a5-9200-47bb-ade8-b751808675b2", + "traceId": "30352b99c7c146e29920fc2617c10cab", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:41.337Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 CANCELLED 状态筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=CANCELLED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a4e71281-33b6-4cc4-a55b-87e963482c39, 0c7838fa-cdc2-4433-94f0-f24082c5f12e", + "traceId": "e08f5a051dd84df38386b3ffd757d3c1", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:41.382Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "创建隔离海运订舱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "099a4c12-cf2a-4f4f-b404-f8807d3a4e3f, c6854ce3-439c-4a38-8b09-20055efc5450", + "traceId": "62937e7c8d4d437990ee240fc0c4c4d3", + "evidence": "key=ADMIN-API-20260808065140561-ocean-create", + "checkedAt": "2026-08-08T06:51:41.568Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 DTO 字段、DRAFT 和9类关联字段完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "099a4c12-cf2a-4f4f-b404-f8807d3a4e3f, c6854ce3-439c-4a38-8b09-20055efc5450", + "traceId": "62937e7c8d4d437990ee240fc0c4c4d3", + "evidence": "bookingId=2085982258035470337, parties=3, requirements=1", + "checkedAt": "2026-08-08T06:51:41.568Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "创建 Idempotency-Key 重放返回同一订舱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3d4035c2-0962-4d48-8390-b20268cf26bb, 65daea22-0817-4636-9e5e-95cb82fddc8f", + "traceId": "dcc68bc1340b4c9683be20d0116be7d6", + "evidence": "first=2085982258035470337, replay=2085982258035470337", + "checkedAt": "2026-08-08T06:51:41.634Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "编辑 DRAFT 订舱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a253cc06-2201-49fa-b853-b1ec3e3e11e1, 3e606ac7-41bd-4ec8-b49b-830dd4746638", + "traceId": "639f5803a8444d5fafa07da8065ec8a8", + "evidence": "version=0", + "checkedAt": "2026-08-08T06:51:41.715Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱旧版本编辑返回冲突", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337" + }, + "http": 200, + "code": "A0409", + "message": "数据已被其他人修改,请刷新后重试", + "requestId": "dbbadeda-c171-4529-a020-93960964dfcb", + "traceId": "5431a218c6a44b819797b44a25cdadfc", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T06:51:41.759Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "冲突后回查订舱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f351532f-4861-4740-9d65-145ad280f6a6, 2c5680ee-6e28-4ce8-99a1-4d98de7b5d5d", + "traceId": "07edb049ca94487ea2b905f567cabb87", + "evidence": "", + "checkedAt": "2026-08-08T06:51:41.798Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱冲突未部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f351532f-4861-4740-9d65-145ad280f6a6, 2c5680ee-6e28-4ce8-99a1-4d98de7b5d5d", + "traceId": "07edb049ca94487ea2b905f567cabb87", + "evidence": "vessel=编辑船-8065140561", + "checkedAt": "2026-08-08T06:51:41.798Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "提交订舱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3a747a1e-361d-4b62-8160-8379d6feae16, 181bfb40-5c12-4a89-867b-069fee2f3bce", + "traceId": "0e3d9635576142beb881da2d63e282de", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T06:51:41.882Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "确认订舱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337/confirm" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "487650f4-6402-4fcc-a442-a7e9bdabbfe1, 834b086d-3930-4dcb-88e6-7c696043253b", + "traceId": "8e5b851f40c34d4f816fb9ab8f818815", + "evidence": "status=CONFIRMED", + "checkedAt": "2026-08-08T06:51:41.944Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "申请改船", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337/change-request" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc282501-6fef-4c8e-a4d4-6e2b3c538a48, d9a57f8d-44c7-404c-bc11-0ab679fc7ba9", + "traceId": "4aad031f8c904500b1152029c25b5d0a", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.020Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "确认改船", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337/change-confirm" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eb8ad243-1ca5-41ef-a44e-48655d21caae, 48b77c3e-55dc-414c-bcb1-1cc1c1692b1d", + "traceId": "49600083bd3a42138891cb5827b4699b", + "evidence": "status=CONFIRMED", + "checkedAt": "2026-08-08T06:51:42.089Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "放舱", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337/release" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2027ebba-f74c-458a-8c74-e120c5a33d5c, 917b8b7a-8d74-4e05-a662-774a4bfe3403", + "traceId": "b4ec35a4ee3d4603957e076a242a12e8", + "evidence": "status=RELEASED", + "checkedAt": "2026-08-08T06:51:42.156Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "回查 RELEASED 订舱详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7db56024-109d-4bca-b6b2-195c07c70883, 44212ba4-15e8-4fb1-879c-6b3daa3a1a3f", + "traceId": "20eee4f6393b45afa81affd9401588f7", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.206Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱状态历史、审计操作者和终态完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings/2085982258035470337" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7db56024-109d-4bca-b6b2-195c07c70883, 44212ba4-15e8-4fb1-879c-6b3daa3a1a3f", + "traceId": "20eee4f6393b45afa81affd9401588f7", + "evidence": "status=RELEASED, histories=6", + "checkedAt": "2026-08-08T06:51:42.207Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "不存在订舱详情安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings/999999999999999999" + }, + "http": 200, + "code": "A0404", + "message": "订舱单不存在", + "requestId": "d199c9c9-3411-4af8-b58e-7f2d65f2bc85", + "traceId": "616976fe959d42f9aa7fd03111ec27b6", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T06:51:42.247Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约分页 keyword 查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&keyword=ADMIN-API-20260808065140561" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5072cb09-390c-4a91-aebf-ca25d145e336, a854bc2a-e0bb-4c20-962a-107b0bdf4efd", + "traceId": "47980072601f4a7d845f1117bd043fda", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.281Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&keyword=ADMIN-API-20260808065140561" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5072cb09-390c-4a91-aebf-ca25d145e336, a854bc2a-e0bb-4c20-962a-107b0bdf4efd", + "traceId": "47980072601f4a7d845f1117bd043fda", + "evidence": "records=0", + "checkedAt": "2026-08-08T06:51:42.281Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DRAFT 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=DRAFT" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "492c7bf3-22cf-4d25-87b3-f0292c945db0, f3094249-238f-408b-a957-364828788f79", + "traceId": "ff4d190c3a744253965f83a2789e1367", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.328Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 PENDING_DISPATCH 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=PENDING_DISPATCH" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bfc3795b-5192-4a73-ae83-b4c4786e7178, 5429016d-b0c4-4c54-a14c-918bc6896264", + "traceId": "713f99e6860145239d9227baa087f8d9", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.372Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DISPATCHED 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=DISPATCHED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "67cfd8d3-0482-47c4-ad60-74598b4d415d, 4826c721-1473-4ade-a54c-3e071626465b", + "traceId": "9a790d7733494e2cb06d4de4452466fd", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.404Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 PICKUP_IN_PROGRESS 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=PICKUP_IN_PROGRESS" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2a7bbc9-c22d-492a-9ec1-992f285e076c, c3f203f5-4684-4b92-8b2a-ec12442b729b", + "traceId": "fbe651bfd7be4419bfc78a1b656dbdd3", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.447Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 ARRIVED_WAREHOUSE 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=ARRIVED_WAREHOUSE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e0064a70-64f3-4d96-b2d6-5da07e3a1a83, 4588441c-6c7f-4cb0-875a-a50a71a3951c", + "traceId": "05dfb282680d4765b6f20c454806a831", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.478Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 LOADING 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=LOADING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "92757e59-18ad-431d-95bd-d47ecda9a313, 9080de66-c84d-4b21-97ce-a1495b0d8469", + "traceId": "5a208a62dadf4442b5ce1cf3721789cb", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.510Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DEPARTED 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=DEPARTED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c24c1019-e100-492a-a0b8-e1abc7b39905, 7a9c9599-b8cc-497c-b0aa-badb1db3d7f8", + "traceId": "3049d7e3887747eba4c57052f03b87e9", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.537Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 COMPLETED 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=COMPLETED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "150a13cb-10e8-4240-8754-68bd83dfd6e1, 3e907e25-3c38-47c2-9d1c-c9536eb32b47", + "traceId": "e1192348ebe34fae889932a4d42891fd", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.573Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 RESCHEDULED 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=RESCHEDULED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7967f81d-2cd2-440e-81fa-11f810407cbd, 53aaff01-ef31-447e-86f4-3d0b24a1d0c6", + "traceId": "0fd85f2b6ef2471290fb48389ab12a43", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.602Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 EXCEPTION 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=EXCEPTION" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6758a4a8-0210-4425-944f-457bb26b0e74, 95d21c0d-79a9-4969-a5d8-996671323f52", + "traceId": "ae993624c3464732968c6f7321314122", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.635Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 CANCELLED 筛选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=CANCELLED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d2bbaa6c-74e6-4b30-83dc-108bb2ce189f, b3f45c0a-88db-40e0-a04b-762eee161ac7", + "traceId": "04758f91b4164bf098f19e5670c974b0", + "evidence": "HTTP=200, code=200, records=0", + "checkedAt": "2026-08-08T06:51:42.665Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "创建隔离拖车预约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "123310c3-671c-4a88-868a-8fbc61aaf4b8, a30f8814-1ccb-4f3c-8567-ff8487350530", + "traceId": "06fcd045571c44fe88fb86355d49baa2", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.714Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约费用、司机车辆和地址字段完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "123310c3-671c-4a88-868a-8fbc61aaf4b8, a30f8814-1ccb-4f3c-8567-ff8487350530", + "traceId": "06fcd045571c44fe88fb86355d49baa2", + "evidence": "id=2085982263269961729, status=DRAFT", + "checkedAt": "2026-08-08T06:51:42.715Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "编辑拖车预约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/truck-appointments/2085982263269961729" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6551ebaa-b729-4385-853d-bcb696d95332, 7f444999-76bc-4e1c-952a-cf527d9699f9", + "traceId": "3624ec172c2149debbc102d00f5c4afd", + "evidence": "version=0", + "checkedAt": "2026-08-08T06:51:42.752Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约旧版本编辑返回冲突", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/truck-appointments/2085982263269961729" + }, + "http": 200, + "code": "A0409", + "message": "版本已变化,请刷新后重试", + "requestId": "46697583-b5a5-45f5-9eb9-9f7f852e7c20", + "traceId": "ab5b9af2b0f047beb4950d29c4cfd622", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T06:51:42.790Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "冲突后回查拖车预约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments/2085982263269961729" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6fc782ff-a742-4f9d-82a1-dfe64c5e73ca, a86dec93-566a-43c8-8ee7-7eeadb2b7004", + "traceId": "e19f4ca1872b4dda84c3dfbd99c0caf5", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.817Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约冲突未部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments/2085982263269961729" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6fc782ff-a742-4f9d-82a1-dfe64c5e73ca, a86dec93-566a-43c8-8ee7-7eeadb2b7004", + "traceId": "e19f4ca1872b4dda84c3dfbd99c0caf5", + "evidence": "vehicleNo=粤C-140561", + "checkedAt": "2026-08-08T06:51:42.817Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "提交预约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9040e6ad-f4e1-492d-b892-60ff4ee65f21, b30e968b-b9dd-4e5c-9d5e-d994aae4908f", + "traceId": "86eea2aea64d4596ac2fc2a4763caf62", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.865Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "提交预约 状态返回", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9040e6ad-f4e1-492d-b892-60ff4ee65f21, b30e968b-b9dd-4e5c-9d5e-d994aae4908f", + "traceId": "86eea2aea64d4596ac2fc2a4763caf62", + "evidence": "status=PENDING_DISPATCH", + "checkedAt": "2026-08-08T06:51:42.865Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "派车", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/dispatch" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6a1898bf-c727-412f-81b1-233543b4ac7b, fe653a0a-d48a-4d39-84bb-11dadfe60649", + "traceId": "835c26fc51374828af6b8db51985da05", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.906Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "派车 状态返回", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/dispatch" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6a1898bf-c727-412f-81b1-233543b4ac7b, fe653a0a-d48a-4d39-84bb-11dadfe60649", + "traceId": "835c26fc51374828af6b8db51985da05", + "evidence": "status=DISPATCHED", + "checkedAt": "2026-08-08T06:51:42.906Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "开始提货", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/pickup" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad8fa932-a0ba-4dab-a2df-bfe75c95e5b0, f6ae1cc9-6f82-4280-a45d-ecf839c0ac56", + "traceId": "364bc28187044b378297a78453be4ced", + "evidence": "", + "checkedAt": "2026-08-08T06:51:42.955Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "开始提货 状态返回", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/pickup" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ad8fa932-a0ba-4dab-a2df-bfe75c95e5b0, f6ae1cc9-6f82-4280-a45d-ecf839c0ac56", + "traceId": "364bc28187044b378297a78453be4ced", + "evidence": "status=PICKUP_IN_PROGRESS", + "checkedAt": "2026-08-08T06:51:42.955Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "到仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/arrive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8bde41f5-fce3-44ec-bbfb-c053c2de642a, 02742629-7420-468f-be05-457187e41c11", + "traceId": "be85359b0f104fc2b435276332ecec5e", + "evidence": "", + "checkedAt": "2026-08-08T06:51:43.001Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "到仓 状态返回", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/arrive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8bde41f5-fce3-44ec-bbfb-c053c2de642a, 02742629-7420-468f-be05-457187e41c11", + "traceId": "be85359b0f104fc2b435276332ecec5e", + "evidence": "status=ARRIVED_WAREHOUSE", + "checkedAt": "2026-08-08T06:51:43.001Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "开始装货", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/load" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9f7cc4ba-3ef0-47d6-bcc8-18132990609e, 704865d5-3bd5-4b68-aada-9ba19e926594", + "traceId": "5918353e4ca84eb8bb9e3ba06c5e347e", + "evidence": "", + "checkedAt": "2026-08-08T06:51:43.038Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "开始装货 状态返回", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/load" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9f7cc4ba-3ef0-47d6-bcc8-18132990609e, 704865d5-3bd5-4b68-aada-9ba19e926594", + "traceId": "5918353e4ca84eb8bb9e3ba06c5e347e", + "evidence": "status=LOADING", + "checkedAt": "2026-08-08T06:51:43.038Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "离场", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/depart" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e5e578a6-b4a9-4c25-9144-c5152de1353e, aef92656-0fef-47fe-91e2-8ecc87d8a36c", + "traceId": "41e1ee3cd1f14ac89d856a233468488b", + "evidence": "", + "checkedAt": "2026-08-08T06:51:43.083Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "离场 状态返回", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/depart" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e5e578a6-b4a9-4c25-9144-c5152de1353e, aef92656-0fef-47fe-91e2-8ecc87d8a36c", + "traceId": "41e1ee3cd1f14ac89d856a233468488b", + "evidence": "status=DEPARTED", + "checkedAt": "2026-08-08T06:51:43.083Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "完成", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/complete" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b98b9945-23bd-4ae1-83e2-0391e394a23e, 58581a05-86e1-482c-86e3-713104f33426", + "traceId": "f5688f2db80342058c852a45b4ae7a5b", + "evidence": "", + "checkedAt": "2026-08-08T06:51:43.123Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "完成 状态返回", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments/2085982263269961729/complete" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b98b9945-23bd-4ae1-83e2-0391e394a23e, 58581a05-86e1-482c-86e3-713104f33426", + "traceId": "f5688f2db80342058c852a45b4ae7a5b", + "evidence": "status=COMPLETED", + "checkedAt": "2026-08-08T06:51:43.123Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "回查 COMPLETED 拖车预约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments/2085982263269961729" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "766099e0-cab1-49b9-b38e-3c9ef2fcffbe, 3e99ce4f-a166-49af-9718-4413bbc47162", + "traceId": "b320dd1565ff429a85a794246a32b654", + "evidence": "", + "checkedAt": "2026-08-08T06:51:43.162Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约状态终态和费用快照正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments/2085982263269961729" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "766099e0-cab1-49b9-b38e-3c9ef2fcffbe, 3e99ce4f-a166-49af-9718-4413bbc47162", + "traceId": "b320dd1565ff429a85a794246a32b654", + "evidence": "status=COMPLETED", + "checkedAt": "2026-08-08T06:51:43.162Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "附件引用安全边界自动化缺口", + "passed": false, + "deploymentBlocker": true, + "request": null, + "http": null, + "code": null, + "message": null, + "requestId": null, + "traceId": null, + "evidence": "当前 Controller 无附件上传/引用 API,未伪造附件成功", + "checkedAt": "2026-08-08T06:51:43.162Z" + } + ] +} diff --git a/reports/postdeploy-service-center.json b/reports/postdeploy-service-center.json new file mode 100644 index 000000000..fcc57214b --- /dev/null +++ b/reports/postdeploy-service-center.json @@ -0,0 +1,744 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808064712449", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T06:47:14.075Z", + "startedAt": "2026-08-08T06:47:12.449Z", + "success": false, + "fatal": null, + "summary": { + "total": 26, + "passed": 1, + "failed": 25 + }, + "modules": [ + { + "name": "ocean-bookings", + "startedAt": "2026-08-08T06:47:12.837Z", + "finishedAt": "2026-08-08T06:47:13.606Z", + "success": false, + "passed": 0, + "failed": 10, + "fatal": null + }, + { + "name": "truck-appointments", + "startedAt": "2026-08-08T06:47:13.607Z", + "finishedAt": "2026-08-08T06:47:14.075Z", + "success": false, + "passed": 0, + "failed": 15, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [ + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱列表分页与 keyword 查询", + "evidence": "", + "code": "A0403", + "requestId": "ed457d91-872d-4e75-977d-9e0264534bd1", + "traceId": "69b0190b15604e25a3f61d983f6a575d" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱列表分页结构正确", + "evidence": "records=n/a", + "code": "A0403", + "requestId": "ed457d91-872d-4e75-977d-9e0264534bd1", + "traceId": "69b0190b15604e25a3f61d983f6a575d" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 DRAFT 状态筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "d54acdfd-59ca-42c6-9100-3fafbb58fed1", + "traceId": "cbedc0c382384c4e90f9017e1f0813b0" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 SUBMITTED 状态筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "bc6939bf-90b8-439c-8ab4-ea4b1f852334", + "traceId": "554ee600606a4014a0576fd6b947cb3f" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 CONFIRMED 状态筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "e7fdd888-8f70-4c14-9fd8-80295c13c21c", + "traceId": "d349a30924704b93a1f4f84a3d11821a" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 RELEASED 状态筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "8eeae8b2-f74f-4580-95a4-27c2766a6996", + "traceId": "25f7a45dbf504562bf0e304dda652657" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 FAILED 状态筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "88d7405d-76b3-49d7-9f2c-548681781d70", + "traceId": "455b1549cd1f4a2681629566fa4c70d7" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 CANCELLED 状态筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "2a42fa60-4488-4c30-a5d0-190d8344cde3", + "traceId": "26478125e9b94d0aa01675ec96d06684" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "创建隔离海运订舱", + "evidence": "key=ADMIN-API-20260808064712449-ocean-create", + "code": "A0403", + "requestId": "a256eec7-f568-42b3-b3a2-611c251586c6", + "traceId": "7b49626fca6a4b60979d70bf44863127" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 DTO 字段、DRAFT 和9类关联字段完整", + "evidence": "bookingId=missing, parties=n/a, requirements=n/a", + "code": "A0403", + "requestId": "a256eec7-f568-42b3-b3a2-611c251586c6", + "traceId": "7b49626fca6a4b60979d70bf44863127" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约分页 keyword 查询", + "evidence": "", + "code": "A0403", + "requestId": "743f537b-3993-456c-a7b4-6876d1a87bc2", + "traceId": "1ae0828a8f9a433598007c3b8d2faa93" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约分页结构正确", + "evidence": "records=n/a", + "code": "A0403", + "requestId": "743f537b-3993-456c-a7b4-6876d1a87bc2", + "traceId": "1ae0828a8f9a433598007c3b8d2faa93" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DRAFT 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "4eacc68b-ff41-4a75-823e-8fa6de62cbe2", + "traceId": "3f6cbb9ee8fc4226938c8a518f0b92f8" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 PENDING_DISPATCH 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "b03a83c8-0a99-4acc-8fdc-d27076a3e1dc", + "traceId": "77f8f44501004f70adc1c1c79a6f9697" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DISPATCHED 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "e4943121-2b35-4a0a-a41c-357c6f7eac1e", + "traceId": "db60390b02b1446189cba05b36c592ad" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 PICKUP_IN_PROGRESS 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "62aff6d2-13a9-4003-9e40-60cef827099c", + "traceId": "00d7851fcced446ebcb22b429c480dee" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 ARRIVED_WAREHOUSE 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "7dac2027-fff0-4d00-8259-6929107819dd", + "traceId": "7b4e355e6801472595a2744b21bea683" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 LOADING 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "6f197d56-55fb-43d6-bd3a-aa66aff41041", + "traceId": "e0bd0ea79d734d7b9293a065a4bd370d" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DEPARTED 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "c66f4376-e53b-4237-860b-65d88837b302", + "traceId": "2edd2f5df58b4e008cc2ea4d036c30fb" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 COMPLETED 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "33d2ba0c-b9d9-4f86-86a9-979f3bcc30ee", + "traceId": "9c48a0c1cf6a45518e32daf025cf67f3" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 RESCHEDULED 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "e9be7958-1f40-4e35-923c-e4bccd1cdbd4", + "traceId": "31865c46cbf640f59eb358182ac569a9" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 EXCEPTION 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "e9880e54-cd81-4eaa-b400-a23906a7542e", + "traceId": "f2119d43632240a0b95f597c5908dacd" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 CANCELLED 筛选", + "evidence": "HTTP=200, code=A0403, records=n/a", + "code": "A0403", + "requestId": "4ba4b116-2f1c-48f4-90ab-d56bb26f11f6", + "traceId": "a5bc812ecefa4dcb94af96ea9dd7bae7" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "创建隔离拖车预约", + "evidence": "", + "code": "A0403", + "requestId": "35abb2b5-f631-46c5-850e-b2b63a370e18", + "traceId": "c730567af3554a6e834711383ab3a71c" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约费用、司机车辆和地址字段完整", + "evidence": "id=missing, status=missing", + "code": "A0403", + "requestId": "35abb2b5-f631-46c5-850e-b2b63a370e18", + "traceId": "c730567af3554a6e834711383ab3a71c" + } + ], + "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": "a800004d-edfa-40c3-833a-861b275f568a, ed4e7e33-25f6-42aa-80cf-2169bf716a8a", + "traceId": "8bb3e73ba9ca4d20b70c4648d9c301cb", + "evidence": "", + "checkedAt": "2026-08-08T06:47:12.836Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱列表分页与 keyword 查询", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&keyword=ADMIN-API-20260808064712449" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "ed457d91-872d-4e75-977d-9e0264534bd1", + "traceId": "69b0190b15604e25a3f61d983f6a575d", + "evidence": "", + "checkedAt": "2026-08-08T06:47:13.195Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱列表分页结构正确", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&keyword=ADMIN-API-20260808064712449" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "ed457d91-872d-4e75-977d-9e0264534bd1", + "traceId": "69b0190b15604e25a3f61d983f6a575d", + "evidence": "records=n/a", + "checkedAt": "2026-08-08T06:47:13.195Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 DRAFT 状态筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=DRAFT" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "d54acdfd-59ca-42c6-9100-3fafbb58fed1", + "traceId": "cbedc0c382384c4e90f9017e1f0813b0", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.240Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 SUBMITTED 状态筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=SUBMITTED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "bc6939bf-90b8-439c-8ab4-ea4b1f852334", + "traceId": "554ee600606a4014a0576fd6b947cb3f", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.285Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 CONFIRMED 状态筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=CONFIRMED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "e7fdd888-8f70-4c14-9fd8-80295c13c21c", + "traceId": "d349a30924704b93a1f4f84a3d11821a", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.334Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 RELEASED 状态筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=RELEASED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "8eeae8b2-f74f-4580-95a4-27c2766a6996", + "traceId": "25f7a45dbf504562bf0e304dda652657", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.376Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 FAILED 状态筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=FAILED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "88d7405d-76b3-49d7-9f2c-548681781d70", + "traceId": "455b1549cd1f4a2681629566fa4c70d7", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.421Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 CANCELLED 状态筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/ocean-bookings?page=1&size=5&status=CANCELLED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "2a42fa60-4488-4c30-a5d0-190d8344cde3", + "traceId": "26478125e9b94d0aa01675ec96d06684", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.465Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "创建隔离海运订舱", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "a256eec7-f568-42b3-b3a2-611c251586c6", + "traceId": "7b49626fca6a4b60979d70bf44863127", + "evidence": "key=ADMIN-API-20260808064712449-ocean-create", + "checkedAt": "2026-08-08T06:47:13.606Z" + }, + { + "module": "ocean-bookings", + "scenario": "ocean-booking-lifecycle", + "name": "订舱 DTO 字段、DRAFT 和9类关联字段完整", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/ocean-bookings" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "a256eec7-f568-42b3-b3a2-611c251586c6", + "traceId": "7b49626fca6a4b60979d70bf44863127", + "evidence": "bookingId=missing, parties=n/a, requirements=n/a", + "checkedAt": "2026-08-08T06:47:13.606Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约分页 keyword 查询", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&keyword=ADMIN-API-20260808064712449" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "743f537b-3993-456c-a7b4-6876d1a87bc2", + "traceId": "1ae0828a8f9a433598007c3b8d2faa93", + "evidence": "", + "checkedAt": "2026-08-08T06:47:13.659Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约分页结构正确", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&keyword=ADMIN-API-20260808064712449" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "743f537b-3993-456c-a7b4-6876d1a87bc2", + "traceId": "1ae0828a8f9a433598007c3b8d2faa93", + "evidence": "records=n/a", + "checkedAt": "2026-08-08T06:47:13.659Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DRAFT 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=DRAFT" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "4eacc68b-ff41-4a75-823e-8fa6de62cbe2", + "traceId": "3f6cbb9ee8fc4226938c8a518f0b92f8", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.697Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 PENDING_DISPATCH 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=PENDING_DISPATCH" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "b03a83c8-0a99-4acc-8fdc-d27076a3e1dc", + "traceId": "77f8f44501004f70adc1c1c79a6f9697", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.727Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DISPATCHED 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=DISPATCHED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "e4943121-2b35-4a0a-a41c-357c6f7eac1e", + "traceId": "db60390b02b1446189cba05b36c592ad", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.758Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 PICKUP_IN_PROGRESS 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=PICKUP_IN_PROGRESS" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "62aff6d2-13a9-4003-9e40-60cef827099c", + "traceId": "00d7851fcced446ebcb22b429c480dee", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.793Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 ARRIVED_WAREHOUSE 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=ARRIVED_WAREHOUSE" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "7dac2027-fff0-4d00-8259-6929107819dd", + "traceId": "7b4e355e6801472595a2744b21bea683", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.823Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 LOADING 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=LOADING" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "6f197d56-55fb-43d6-bd3a-aa66aff41041", + "traceId": "e0bd0ea79d734d7b9293a065a4bd370d", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.851Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 DEPARTED 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=DEPARTED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "c66f4376-e53b-4237-860b-65d88837b302", + "traceId": "2edd2f5df58b4e008cc2ea4d036c30fb", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.885Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 COMPLETED 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=COMPLETED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "33d2ba0c-b9d9-4f86-86a9-979f3bcc30ee", + "traceId": "9c48a0c1cf6a45518e32daf025cf67f3", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.914Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 RESCHEDULED 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=RESCHEDULED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "e9be7958-1f40-4e35-923c-e4bccd1cdbd4", + "traceId": "31865c46cbf640f59eb358182ac569a9", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.944Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 EXCEPTION 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=EXCEPTION" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "e9880e54-cd81-4eaa-b400-a23906a7542e", + "traceId": "f2119d43632240a0b95f597c5908dacd", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:13.975Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约 CANCELLED 筛选", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "GET", + "path": "/api/platform/v1/truck-appointments?page=1&size=5&status=CANCELLED" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "4ba4b116-2f1c-48f4-90ab-d56bb26f11f6", + "traceId": "a5bc812ecefa4dcb94af96ea9dd7bae7", + "evidence": "HTTP=200, code=A0403, records=n/a", + "checkedAt": "2026-08-08T06:47:14.008Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "创建隔离拖车预约", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "35abb2b5-f631-46c5-850e-b2b63a370e18", + "traceId": "c730567af3554a6e834711383ab3a71c", + "evidence": "", + "checkedAt": "2026-08-08T06:47:14.075Z" + }, + { + "module": "truck-appointments", + "scenario": "truck-appointment-lifecycle", + "name": "拖车预约费用、司机车辆和地址字段完整", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/truck-appointments" + }, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "35abb2b5-f631-46c5-850e-b2b63a370e18", + "traceId": "c730567af3554a6e834711383ab3a71c", + "evidence": "id=missing, status=missing", + "checkedAt": "2026-08-08T06:47:14.075Z" + } + ] +} diff --git a/warehouse/src/main/java/com/baiyue/warehouse/service/OverseasStorageFeeService.java b/warehouse/src/main/java/com/baiyue/warehouse/service/OverseasStorageFeeService.java index b425f9025..83ece5c6f 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/service/OverseasStorageFeeService.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/service/OverseasStorageFeeService.java @@ -148,7 +148,8 @@ public class OverseasStorageFeeService { throw new BizException(ResultCode.VALIDATION_FAILED, "费用类型和计费单位不匹配"); } List tiers = new ArrayList<>(source); - tiers.sort(Comparator.comparing(OverseasStorageFeeDtos.TierRequest::feeType) + tiers.sort(Comparator.comparingInt((OverseasStorageFeeDtos.TierRequest tier) -> + "STORAGE".equals(tier.feeType()) ? 0 : 1) .thenComparingInt(OverseasStorageFeeDtos.TierRequest::startDay)); for (String feeType : List.of("STORAGE", "RETURN_STORAGE")) { List group = tiers.stream().filter(t -> feeType.equals(t.feeType())).toList();