LogisticZopService.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace App\Services;
  3. use App\library\zop\ZopClient;
  4. use App\library\zop\ZopProperties;
  5. use App\library\zop\ZopRequest;
  6. use Carbon\Carbon;
  7. class LogisticZopService
  8. {
  9. /**
  10. * 获取中通快递路由信息
  11. * @param array $logisticNums
  12. * @return array
  13. */
  14. public function get(array $logisticNums): array
  15. {
  16. $result = [];
  17. $url = config('api_logistic.ZTO.url');
  18. $xAppKey = config('api_logistic.ZTO.x-appKey');
  19. $appSecret = config('api_logistic.ZTO.appSecret');
  20. $properties = new ZopProperties($xAppKey, $appSecret);
  21. $client = new ZopClient($properties);
  22. $request = new ZopRequest();
  23. $request->setUrl($url);
  24. foreach ($logisticNums as $logisticNum) {
  25. $request->setBody(json_encode([
  26. 'billCode' => $logisticNum,
  27. ]));
  28. $response = json_decode($client->execute($request));
  29. if ($response->status) {
  30. $result[] = [
  31. 'routes' => $response->result,
  32. 'logisticNum' => $logisticNum,
  33. ];
  34. } else {
  35. // throw new WarningException("单号没有查询到快递路由信息','LogisticZopService->get->{$logisticNum}");
  36. }
  37. }
  38. return $this->transformRoutes($result);
  39. }
  40. /**
  41. * 转换快递路由信息
  42. * @param array $routs 快递路由
  43. * @return array
  44. */
  45. public function transformRoutes(array $routs): array
  46. {
  47. $result = [];
  48. foreach ($routs as $route) {
  49. $resultItem = [];
  50. $resultItem['logistic_number'] = $route['logisticNum'];
  51. $itemRoutes = $route['routes'];
  52. if (empty($itemRoutes)) {
  53. continue;
  54. }
  55. $lastRoute = $itemRoutes[count($itemRoutes) - 1];
  56. switch ($lastRoute->scanType) {
  57. case '收件':
  58. $resultItem['status'] = '已揽收';
  59. break;
  60. case '到件':
  61. case '发件':
  62. $resultItem['status'] = '在途';
  63. break;
  64. case 'ARRIVAL':
  65. case '派件':
  66. $resultItem['status'] = '派送中';
  67. break;
  68. case 'SIGNED':
  69. case '签收':
  70. $resultItem['status'] = '已收件';
  71. $resultItem['received_at'] = Carbon::parse($lastRoute->scanDate / 1000)->toDateTimeString();
  72. break;
  73. default:
  74. break;
  75. }
  76. $transfer_status = [];
  77. foreach ($itemRoutes as $item) {
  78. $data = [];
  79. $data['accept_time'] = Carbon::parse($item->scanDate / 1000)->toDateTimeString();
  80. $scanSite = $item->scanSite;
  81. $data['accept_address'] = $scanSite->prov . '-' . $scanSite->name;
  82. $data['remark'] = $item->scanType;
  83. $transfer_status[] = $data;
  84. }
  85. $resultItem['transfer_status'] = $transfer_status;
  86. $result[] = $resultItem;
  87. }
  88. return $result;
  89. }
  90. }