LogisticYTOService.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace App\Services;
  3. use App\OrderPackage;
  4. use App\Traits\ServiceAppAop;
  5. use Carbon\Carbon;
  6. use Doctrine\DBAL\Connection;
  7. use Illuminate\Support\Facades\Http;
  8. class LogisticYTOService
  9. {
  10. use ServiceAppAop;
  11. public function query($logistic_number)
  12. {
  13. $app_key = config('api_logistic.YTO.prod.app-key');
  14. $app_secret = config('api_logistic.YTO.prod.app-secret');
  15. $user_id = config('api_logistic.YTO.prod.user_id');
  16. $method = config('api_logistic.YTO.prod.method');
  17. $format = config('api_logistic.YTO.prod.format');
  18. $v = config('api_logistic.YTO.prod.v');
  19. $url = config('api_logistic.YTO.prod.search.url');
  20. $body = [
  21. "Number" => $logistic_number
  22. ];
  23. $secret=$app_secret.'app_key'.$app_key.'format'.$format.'method'.$method.'timestamp'.Carbon::now()->toDateTimeString().'user_id'.$user_id.'v'.$v;
  24. $sign = strtoupper(md5($secret));
  25. $headers = [
  26. 'sign' => $sign,
  27. 'app_key' => $app_key,
  28. 'format' => $format,
  29. 'method' => $method,
  30. 'timestamp' => Carbon::now()->toDateTimeString(),
  31. 'user_id' => $user_id,
  32. 'v' => $v,
  33. 'param'=>json_encode($body, JSON_UNESCAPED_UNICODE)
  34. ];
  35. $response = Http::asForm()->post($url,$headers);
  36. return json_decode($response->body());
  37. }
  38. public function format($response,$logistic_number): array
  39. {
  40. $result = [];
  41. if (is_object($response) && $response->code=='1001') {
  42. return [
  43. 'logistic_number' => $logistic_number,
  44. 'exception_type' => '揽件异常',
  45. 'exception' => '是',
  46. ];
  47. }
  48. else {
  49. try {
  50. if (is_array($response))$result['logistic_number'] = $response[0]->waybill_No;
  51. } catch (\Exception $e) {
  52. LogService::log(LogisticYTOService::class, "YTO快递信息异常", $response);
  53. }
  54. if (!empty($response) && is_array($response)) {
  55. $lastNativeRoute = $response[count($response) - 1];
  56. $result['status'] = $this->getStatus($lastNativeRoute);
  57. if ($result['status'] == '已收件') $result['received_at'] = $lastNativeRoute->upload_Time;
  58. $result['transfer_status'] = $this->getTransferStatus($response);
  59. $result['routes_length'] = array_key_exists('transfer_status', $result) ? count($result['transfer_status']) : 0;
  60. $orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');
  61. $exceptionData = $orderPackageReceivedSyncService->setExceptionType($result, $lastNativeRoute ? $lastNativeRoute->upload_Time : null);
  62. $result['exception_type'] = $exceptionData['exception_type'];
  63. $result['exception'] = $exceptionData['exception'];
  64. } else {
  65. $result['status'] = null;
  66. $result['transfer_status'] = [];
  67. }
  68. if (!array_key_exists('status', $result)) {$result['status'] = null;$result['transfer_status'] = [];}
  69. //如果没有发现额外的异常,且查询到物流轨迹,将异常置为无
  70. if (!array_key_exists('exception', $result)
  71. && !array_key_exists('exception_type', $result)
  72. && array_key_exists('transfer_status', $result)
  73. ) {$result['exception_type'] = '无';$result['exception'] = '否';}
  74. return $result;
  75. }
  76. }
  77. /**
  78. * @param $nativeData
  79. * @return string
  80. */
  81. private function getStatus($nativeData): string
  82. {
  83. $status = null;
  84. switch ($nativeData->infoContent) {
  85. case 'ARRIVAL':
  86. case 'GOT':
  87. $status = '已揽收';
  88. break;
  89. case 'DEPARTURE':
  90. case 'PACKAGE':
  91. $status = '在途';
  92. break;
  93. case 'SENT_SCAN':
  94. case 'INBOUND':
  95. $status = '派送中';
  96. break;
  97. case 'SIGNED':
  98. $status = '已收件';
  99. break;
  100. case 'TMS_RETURN':
  101. $status = '返回中';
  102. break;
  103. default:
  104. $status = '无';
  105. }
  106. return $status;
  107. }
  108. /**
  109. * @param $nativeRoutes
  110. * @return array
  111. */
  112. private function getTransferStatus($nativeRoutes): array
  113. {
  114. $transferStatus = [];
  115. foreach ($nativeRoutes as $nativeRoute) {
  116. $item = [];
  117. $item['accept_time'] = $nativeRoute->upload_Time;
  118. $item['accept_address'] = $nativeRoute->processInfo;
  119. $item['remark'] = "";
  120. $transferStatus[] = $item;
  121. }
  122. return $transferStatus;
  123. }
  124. }