You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.3 KiB
136 lines
4.3 KiB
# 第三方对接自测:地址联想 → 选首条可选候选 → 询价 → 轮询
|
|
# 用法:
|
|
# $env:CHAJIA_BASE_URL = "https://if.dev.51track.vip"
|
|
# $env:CHAJIA_SERVICE_TOKEN = "<Token>"
|
|
# $env:CHAJIA_CUSTOMER_ID = "CUST_001"
|
|
# powershell -ExecutionPolicy Bypass -File scripts/test-host-api.ps1
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
$Base = if ($env:CHAJIA_BASE_URL) { $env:CHAJIA_BASE_URL.TrimEnd("/") } else { "" }
|
|
$Token = $env:CHAJIA_SERVICE_TOKEN
|
|
$CustomerId = $env:CHAJIA_CUSTOMER_ID
|
|
|
|
if (-not $Base -or -not $Token -or -not $CustomerId) {
|
|
Write-Host "Set env: CHAJIA_BASE_URL, CHAJIA_SERVICE_TOKEN, CHAJIA_CUSTOMER_ID" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
$headers = @{
|
|
Authorization = "Bearer $Token"
|
|
"X-Customer-Id" = $CustomerId
|
|
"Content-Type" = "application/json"
|
|
"Cache-Control" = "no-store"
|
|
}
|
|
|
|
function Pick-FirstSelectable($candidates) {
|
|
foreach ($c in $candidates) {
|
|
if ($c.selectable -ne $false) { return $c }
|
|
}
|
|
return $null
|
|
}
|
|
|
|
function Build-ConfirmedAddress($candidate) {
|
|
return @{
|
|
street = $candidate.street
|
|
city = $candidate.city
|
|
state = $candidate.state
|
|
zip = if ($candidate.zip) { $candidate.zip } else { "" }
|
|
place_id = $candidate.option_id
|
|
formatted_address = $candidate.formatted_address
|
|
selected_from_suggestions = $true
|
|
mothership_option_id = $candidate.option_id
|
|
mothership_display_label = $candidate.display_label
|
|
selected_from_mothership = $true
|
|
}
|
|
}
|
|
|
|
Write-Host "=== [1/3] POST /api/addresses/mothership-candidates ===" -ForegroundColor Cyan
|
|
$body1 = @{
|
|
customer_id = $CustomerId
|
|
pickup_address = @{
|
|
street = "1234 Warehouse Blvd"
|
|
city = "Los Angeles"
|
|
state = "CA"
|
|
zip = "90001"
|
|
}
|
|
delivery_address = @{
|
|
street = "5678 Distribution Dr"
|
|
city = "Dallas"
|
|
state = "TX"
|
|
zip = "75201"
|
|
}
|
|
} | ConvertTo-Json -Depth 5
|
|
|
|
$r1 = Invoke-RestMethod -Uri "$Base/api/addresses/mothership-candidates" -Method POST -Headers $headers -Body $body1
|
|
if ($r1.code -ne 0) {
|
|
Write-Host "Step 1 failed: $($r1.message)" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
$pickup = Pick-FirstSelectable $r1.data.pickup_candidates
|
|
$delivery = Pick-FirstSelectable $r1.data.delivery_candidates
|
|
if (-not $pickup -or -not $delivery) {
|
|
Write-Host "No selectable address candidates" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
Write-Host " pickup: $($pickup.display_label)"
|
|
Write-Host " delivery: $($delivery.display_label)"
|
|
|
|
$requestId = [guid]::NewGuid().ToString()
|
|
Write-Host "=== [2/3] POST /api/quotes request_id=$requestId ===" -ForegroundColor Cyan
|
|
|
|
$quoteBody = @{
|
|
request_id = $requestId
|
|
customer_id = $CustomerId
|
|
pickup_address = Build-ConfirmedAddress $pickup
|
|
delivery_address = Build-ConfirmedAddress $delivery
|
|
weight = @{ value = 500; unit = "kg" }
|
|
dimensions = @{ length = 120; width = 100; height = 150; unit = "cm" }
|
|
pallet_count = 2
|
|
cargo_type = "general_freight"
|
|
}
|
|
if ($r1.data.quote_session_id) {
|
|
$quoteBody.quote_session_id = $r1.data.quote_session_id
|
|
}
|
|
|
|
$r2 = Invoke-RestMethod -Uri "$Base/api/quotes" -Method POST -Headers $headers -Body ($quoteBody | ConvertTo-Json -Depth 8)
|
|
if ($r2.code -ne 0 -or -not $r2.data.quote_id) {
|
|
Write-Host "Step 2 failed: $($r2.message)" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
$quoteId = $r2.data.quote_id
|
|
Write-Host " quote_id=$quoteId status=$($r2.data.status)"
|
|
|
|
Write-Host "=== [3/3] GET /api/quotes/$quoteId (poll every 2s) ===" -ForegroundColor Cyan
|
|
$final = $null
|
|
for ($i = 1; $i -le 20; $i++) {
|
|
Start-Sleep -Seconds 2
|
|
$r3 = Invoke-RestMethod -Uri "$Base/api/quotes/$quoteId" -Method GET -Headers $headers
|
|
$st = $r3.data.status
|
|
Write-Host " poll $i : status=$st"
|
|
if ($st -in @("done", "failed", "expired")) {
|
|
$final = $r3
|
|
break
|
|
}
|
|
}
|
|
|
|
if (-not $final) {
|
|
Write-Host "Poll timeout" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
if ($final.data.status -ne "done") {
|
|
Write-Host "Quote failed: status=$($final.data.status) error=$($final.data.error_message)" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-Host "PASS" -ForegroundColor Green
|
|
foreach ($q in $final.data.quotes) {
|
|
$line = " $($q.service_level) / $($q.rate_option) / $($q.carrier) -> final_total=$($q.final_total) USD"
|
|
Write-Host $line
|
|
}
|