This commit is contained in:
Your Name
2026-06-04 10:17:47 +08:00
parent 32f8e19bf1
commit ef014e0d9d
3 changed files with 128 additions and 2 deletions
@@ -162,6 +162,76 @@ class ExpressTrackingService
return $stats;
}
/**
* 甘草路由不可用时的降级:按业务订单运单号走快递100 查询并落库(自发货等场景)
*
* @return array{
* success: bool,
* message: string,
* traces_count: int,
* state: string,
* source: string,
* assistant_sync?: array|null
* }
*/
public static function queryKuaidiForPrescriptionOrder(PrescriptionOrder $order, bool $isAuto = true): array
{
$fail = static fn (string $msg): array => [
'success' => false,
'message' => $msg,
'traces_count' => 0,
'state' => '',
'source' => 'kuaidi100_fallback',
'assistant_sync' => null,
];
$tn = trim((string) ($order->tracking_number ?? ''));
if ($tn === '') {
return $fail('甘草无快递任务且业务单未填写快递单号,无法走快递100');
}
$tracking = self::resolveTrackingByNumber($tn);
if (!$tracking) {
return $fail('未找到运单对应的物流追踪记录');
}
self::backfillRecipientPhoneFromPrescriptionOrder($tracking);
self::syncTrackingExpressCompanyFromNumber($tracking);
try {
$result = self::queryAndUpdate((int) $tracking->id, $isAuto);
$ok = self::isKuaidiQuerySuccessful($result);
$tracking = ExpressTracking::where('id', (int) $tracking->id)->whereNull('delete_time')->find();
$state = $tracking ? (string) ($tracking->current_state ?? '') : '';
$hint = trim((string) ($result['hint'] ?? ''));
$message = $ok
? 'ok(甘草无快递任务,已降级快递100)'
: ($hint !== '' ? $hint : '快递100 查询未返回有效轨迹');
$assistantSync = null;
if (is_array($result) && isset($result['_assistant_sync']) && is_array($result['_assistant_sync'])) {
$assistantSync = $result['_assistant_sync'];
}
return [
'success' => $ok,
'message' => $message,
'traces_count' => count($result['traces'] ?? []),
'state' => $state,
'source' => 'kuaidi100_fallback',
'assistant_sync' => $assistantSync,
];
} catch (\Throwable $e) {
Log::error('queryKuaidiForPrescriptionOrder failed', [
'order_id' => (int) $order->id,
'tracking_number' => $tn,
'error' => $e->getMessage(),
]);
return $fail('快递100 降级异常:' . $e->getMessage());
}
}
/**
* 确保 express_tracking 存在(不发起查询)
*/