更新
This commit is contained in:
@@ -353,6 +353,93 @@ class ExpressTrackingService
|
||||
|
||||
$responseTime = (int) ((microtime(true) - $startTime) * 1000);
|
||||
|
||||
return self::persistTrackingResult($tracking, $result, $isAuto, $responseTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接调用京东官方物流接口(绕过快递100),将轨迹落库到 express_tracking / express_trace。
|
||||
* 供后台「京东接口更新」按钮使用;未配置京东官方接口或无轨迹时返回失败。
|
||||
*
|
||||
* @return array{success:bool, message:string, traces_count:int, state:string, source:string}
|
||||
*/
|
||||
public static function queryJdOfficialAndUpdate(string $trackingNumber): array
|
||||
{
|
||||
$fail = static fn (string $msg): array => [
|
||||
'success' => false,
|
||||
'message' => $msg,
|
||||
'traces_count' => 0,
|
||||
'state' => '',
|
||||
'source' => 'jd_official',
|
||||
];
|
||||
|
||||
$tn = trim($trackingNumber);
|
||||
if ($tn === '') {
|
||||
return $fail('快递单号不能为空');
|
||||
}
|
||||
if (!JdLogisticsService::isConfigured()) {
|
||||
return $fail('未配置京东官方物流接口(请在 .env 配置 JD_LOGISTICS_* 后重试)');
|
||||
}
|
||||
|
||||
$tracking = self::resolveTrackingByNumber($tn);
|
||||
if (!$tracking) {
|
||||
return $fail('未找到该快递单号对应的业务订单或物流追踪记录');
|
||||
}
|
||||
|
||||
$startTime = microtime(true);
|
||||
try {
|
||||
$jd = JdLogisticsService::queryTrace($tn, (string) ($tracking->recipient_phone ?? ''));
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('queryJdOfficialAndUpdate failed', [
|
||||
'tracking_number' => $tn,
|
||||
'error' => $e->getMessage(),
|
||||
]);
|
||||
|
||||
return $fail('京东官方接口请求异常:' . $e->getMessage());
|
||||
}
|
||||
$responseTime = (int) ((microtime(true) - $startTime) * 1000);
|
||||
|
||||
if ($jd === null || empty($jd['traces'])) {
|
||||
self::logQuery($tn, (string) $tracking->express_company, 'manual', [
|
||||
'source' => 'jd_official',
|
||||
'hint' => '京东官方接口未返回有效轨迹',
|
||||
'traces' => [],
|
||||
], $responseTime);
|
||||
|
||||
return $fail('京东官方接口未返回有效轨迹,请确认运单号或稍后重试');
|
||||
}
|
||||
|
||||
$result = [
|
||||
'carrier' => 'jd',
|
||||
'carrier_label' => '京东快递',
|
||||
'kuaidi_com' => 'jd',
|
||||
'traces' => $jd['traces'],
|
||||
'state' => (string) ($jd['state'] ?? '0'),
|
||||
'state_text' => (string) ($jd['state_text'] ?? ''),
|
||||
'source' => 'jd_official',
|
||||
'hint' => '',
|
||||
'official_url' => '',
|
||||
];
|
||||
|
||||
self::persistTrackingResult($tracking, $result, false, $responseTime);
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
'message' => '京东物流轨迹已更新',
|
||||
'traces_count' => count($jd['traces']),
|
||||
'state' => (string) ($jd['state_text'] ?? ''),
|
||||
'source' => 'jd_official',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 将一次轨迹查询结果(快递100 / 京东官方等)落库并推进订单状态。
|
||||
*
|
||||
* @param array<string, mixed> $result query 返回的轨迹结构
|
||||
* @param bool $isAuto 是否定时任务触发(影响查询日志类型与医助释放)
|
||||
* @return array<string, mixed>|null 查询结果;自动任务时可能含 _assistant_sync
|
||||
*/
|
||||
private static function persistTrackingResult(ExpressTracking $tracking, array $result, bool $isAuto, int $responseTime): ?array
|
||||
{
|
||||
// 记录查询日志
|
||||
self::logQuery(
|
||||
$tracking->tracking_number,
|
||||
|
||||
Reference in New Issue
Block a user