LogisticYTOService.php 4.0 KB

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