فهرست منبع

中通快递信息同步

ANG YU 5 سال پیش
والد
کامیت
0f6a4e57bd

+ 73 - 23
app/Services/LogisticZopService.php

@@ -4,14 +4,25 @@
 namespace App\Services;
 
 
+use App\Exceptions\WarningException;
 use App\library\zop\ZopClient;
 use App\library\zop\ZopProperties;
 use App\library\zop\ZopRequest;
+use Carbon\Carbon;
+use Tightenco\Collect\Support\Collection;
 
 class LogisticZopService
 {
-    public function get(array $logisticNums)
+
+
+    /**
+     * 获取中通快递路由信息
+     * @param array $logisticNums
+     * @return array
+     */
+    public function get(array $logisticNums): array
     {
+        $result = [];
 
         $url = config('api_logistic.ZTO.url');
         $xAppKey = config('api_logistic.ZTO.x-appKey');
@@ -22,30 +33,69 @@ class LogisticZopService
         $request = new ZopRequest();
 
         $request->setUrl($url);
-        $body = json_encode([
-            'type' => 1,
-            'billCode' => '75424921258500',
-        ]);
-        $request->setBody($body);
-        return json_decode($client->execute($request));
+        foreach ($logisticNums as $logisticNum) {
+            $request->setBody(json_encode([
+                'billCode' => $logisticNum,
+            ]));
+            $response = json_decode($client->execute($request));
+            if ($response->status) {
+                $result[] = [
+                    'routes' => $response->result,
+                    'logisticNum' => $logisticNum,
+                ];
+            } else {
+//                throw new WarningException("单号没有查询到快递路由信息','LogisticZopService->get->{$logisticNum}");
+            }
+        }
+        return $this->transformRoutes($result);
     }
-    public function tt(array $logisticNums)
-    {
-
-        $url = 'https://japi.zto.com/zto.open.obtainPicePrescription"';
-        $xAppKey = config('api_logistic.ZTO.x-appKey');
-        $xDataDigest = config('api_logistic.ZTO.appSecret');
 
-        $properties = new ZopProperties($xAppKey, $xDataDigest);
-        $client = new ZopClient($properties);
-        $request = new ZopRequest();
+    /**
+     * 转换快递路由信息
+     * @param array $routs 快递路由
+     * @return array
+     */
+    public function transformRoutes(array $routs): array
+    {
+        $result = [];
+        foreach ($routs as $route) {
+            $resultItem = [];
+            $resultItem['logistic_number'] = $route['logisticNum'];
+            $itemRoutes = $route['routes'];
+            $lastRoute = $itemRoutes[count($itemRoutes) - 1];
+            switch ($lastRoute->scanType) {
+                case '收件':
+                    $resultItem['status'] = '已揽收';
+                    break;
+                case '到件':
+                case '发件':
+                    $resultItem['status'] = '在途';
+                    break;
+                case 'ARRIVAL':
+                case '派件':
+                    $resultItem['status'] = '派送中';
+                    break;
+                case 'SIGNED':
+                case '签收':
+                    $resultItem['status'] = '已收件';
+                    $resultItem['received_at'] = Carbon::parse($lastRoute->scanDate / 1000)->toDateTimeString();
+                    break;
+                default:
+                    break;
+            }
+            $transfer_status = [];
+            foreach ($itemRoutes as $item) {
+                $data = [];
+                $data['accept_time'] = Carbon::parse($item->scanDate / 1000)->toDateTimeString();
+                $scanSite = $item->scanSite;
+                $data['accept_address'] = $scanSite->prov . '-' . $scanSite->name;
+                $data['remark'] = $item->scanType;
 
-        $request->setUrl($url);
-        $body = json_encode([
-            'type' => 1,
-            'billCode' => '75424921258500',
-        ]);
-        $request->setBody("{\"transportType\":0,\"sender\":{\"address\":\"华志路1685号\",\"province\":\"上海\",\"city\":\"上海市\",\"district\":\"青浦区\"},\"addresser\":{\"district\":\"青浦区\",\"address\":\"华志路1685号\",\"province\":\"上海\",\"city\":\"上海市\"},\"weight\":1}");
-        return json_decode($client->execute($request));
+                $transfer_status[] = $data;
+            }
+            $resultItem['transfer_status'] = $transfer_status;
+            $result[] = $resultItem;
+        }
+        return $result;
     }
 }

+ 1 - 2
app/Services/OrderPackageReceivedSyncService.php

@@ -60,8 +60,7 @@ class OrderPackageReceivedSyncService
                     $resultSF = $this->logisticSFService->get($logisticNums);
                     break;
                 case "ZTO":
-//                    $resultZT = $this->logisticZopService->get($logisticNums);
-                    $resultZT = [];
+                    $resultZT = $this->logisticZopService->get($logisticNums);
                     break;
                 case "YD":
                     $resultYD = [];

+ 1 - 1
config/api_logistic.php

@@ -102,7 +102,7 @@ return [
     ],
     //中通 https://op.zto.cn/#/Console?type=API
     'ZTO' => [
-        'url' =>  'https://japi.zto.com/zto.open.getOrderInfo',
+        'url' =>  'https://japi.zto.com/zto.open.getRouteInfo',
         'x-appKey' => 'c51c718eb899e9f706979',
         'appSecret' => '9f664e3ab08049874aa417720840161a',
     ],

+ 11 - 1
tests/Services/LogisticZopService/LogisticZopServiceTest.php

@@ -3,6 +3,7 @@
 namespace LogisticZopService;
 
 use App\Services\LogisticZopService;
+use Carbon\Carbon;
 use Tests\TestCase;
 
 class LogisticZopServiceTest extends TestCase
@@ -25,7 +26,16 @@ class LogisticZopServiceTest extends TestCase
      */
     public function get_test()
     {
-        $result = $this->logisticZopService->get([]);
+        $result = $this->logisticZopService->get(['73228022816494']);
+        dd($result);
+    }
+
+    /**
+     * @test
+     */
+    public function carbon_test()
+    {
+        $result =Carbon::parse(1617293640000)->toDateTimeString();
         dd($result);
     }
 

+ 15 - 0
tests/Services/OrderPackageReceivedSyncService/TestSyncLogisticRouteApi.php

@@ -38,11 +38,16 @@ class TestSyncLogisticRouteApi extends TestCase
         $orderPackage1 = factory(OrderPackage::class)->create(['logistic_number' => 'SF1038651915891', 'exception' => '否', 'received_at' => null,]);
         $orderPackage2 = factory(OrderPackage::class)->create(['logistic_number' => 'SF1038651413847', 'exception' => '否', 'received_at' => null,]);
         $orderPackage3 = factory(OrderPackage::class)->create(['logistic_number' => 'SF1038611050071', 'exception' => '否', 'received_at' => null,]);
+        $orderPackage4 = factory(OrderPackage::class)->create(['logistic_number' => '73228021907536', 'exception' => '否', 'received_at' => null,]);
+        $orderPackage5 = factory(OrderPackage::class)->create(['logistic_number' => '73228022816494', 'exception' => '否', 'received_at' => null,]);
         $this->order_package_ids [] = $orderPackage1->id;
         $this->order_package_ids [] = $orderPackage2->id;
         $this->order_package_ids [] = $orderPackage3->id;
+        $this->order_package_ids [] = $orderPackage4->id;
+        $this->order_package_ids [] = $orderPackage5->id;
 
         $this->service->syncLogisticRouteApi(['SF' => ['SF1038651915891', 'SF1038651413847', 'SF1038611050071']]);
+        $this->service->syncLogisticRouteApi(['ZTO' => ['73228021907536', '73228022816494']]);
         $this->assertDatabaseHas('order_packages',[
             'logistic_number' => 'SF1038651915891',
             'status' => '已收件',
@@ -58,5 +63,15 @@ class TestSyncLogisticRouteApi extends TestCase
             'status' => '已收件',
             'exception' => '否',
         ]);
+        $this->assertDatabaseHas('order_packages',[
+            'logistic_number' => '73228021907536',
+            'status' => '已收件',
+            'exception' => '否',
+        ]);
+        $this->assertDatabaseHas('order_packages',[
+            'logistic_number' => '73228022816494',
+            'status' => '已收件',
+            'exception' => '否',
+        ]);
     }
 }