LogisticZopService.php 3.2 KB

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