ANG YU 4 лет назад
Родитель
Сommit
ceb47b9353

+ 10 - 0
app/Http/Controllers/TestController.php

@@ -45,6 +45,7 @@ use App\Services\BatchService;
 use App\Services\CacheShelfService;
 use App\Services\ForeignHaiRoboticsService;
 use App\Services\OrderPackageReceivedSyncService;
+use App\Services\OrderPackageService;
 use App\Services\OrderService;
 use App\Services\OwnerFeeTotalService;
 use App\Services\OwnerLogisticFeeReportService;
@@ -389,4 +390,13 @@ sql;
         return ['success' => true];
     }
 
+    public function collectUpload()
+    {
+        /** @var OrderPackageService $service */
+        $service = app('OrderPackageService');
+       return $service->collectUpload([
+            '75803656098638',
+            '75803656098612'
+        ]);
+    }
 }

+ 4 - 4
app/Jobs/LogisticZopSync.php

@@ -24,7 +24,7 @@ class LogisticZopSync implements ShouldQueue
      * @var string $logistic_number
      */
     protected $logistic_number;
-     /**@var LogisticZopService $logistic_zop_service **/
+    /**@var LogisticZopService $logistic_zop_service * */
     protected $logistic_zop_service;
     /**
      * @var  OrderPackageReceivedSyncService $order_package_received_sync_service
@@ -52,9 +52,9 @@ class LogisticZopSync implements ShouldQueue
     {
         LogService::log(LogisticZopSync::class, "JOB-ZOP", $this->logistic_number);
         //标记上有同步的操作
-        OrderPackage::query()->where('logistic_number', $this->logistic_number)->update(['sync_routes_flag'=> true]);
+        OrderPackage::query()->where('logistic_number', $this->logistic_number)->update(['sync_routes_flag' => true]);
         $nativeResponse = $this->logistic_zop_service->query($this->logistic_number);
-        $logisticResponseFormatted = $this->logistic_zop_service->format($nativeResponse,$this->logistic_number);
-        $this->order_package_received_sync_service->update([$logisticResponseFormatted]);
+        $logisticResponseFormatted = $this->logistic_zop_service->format($nativeResponse, $this->logistic_number);
+        if (!empty($logisticResponseFormatted)) $this->order_package_received_sync_service->update([$logisticResponseFormatted]);
     }
 }

+ 3 - 0
app/Services/LogisticZopService.php

@@ -32,6 +32,9 @@ class LogisticZopService implements LogisticRouteInterface
     {
 
         $order_package = OrderPackage::query()->where('logistic_number', $logistic_number)->first();
+        if (empty($order_package)) {
+            return [];
+        }
         $result = [
             'logistic_number' => $logistic_number,
             'status' => $order_package->status,

+ 168 - 83
app/Services/OrderPackageService.php

@@ -11,14 +11,18 @@ use App\Services\common\DataHandlerService;
 use Carbon\Carbon;
 use App\Traits\ServiceAppAop;
 use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Facades\Http;
 
 
 class OrderPackageService
 {
     use ServiceAppAop;
-    protected $modelClass=OrderPackage::class;
-    public function batchUpdate(array $params){
-        return app(BatchUpdateService::class)->batchUpdate('order_packages',$params);
+
+    protected $modelClass = OrderPackage::class;
+
+    public function batchUpdate(array $params)
+    {
+        return app(BatchUpdateService::class)->batchUpdate('order_packages', $params);
     }
 
     /** @var OrderTrackingService $orderTrackingService */
@@ -29,10 +33,11 @@ class OrderPackageService
      * @param array $values
      * @return OrderPackage $package
      */
-    public function firstOrCreate($logistic_number, array $values){
-        /** @var $package OrderPackage  */
-        $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first();
-        if ($package)return $package;
+    public function firstOrCreate($logistic_number, array $values)
+    {
+        /** @var $package OrderPackage */
+        $package = OrderPackage::query()->where('logistic_number', $logistic_number)->first();
+        if ($package) return $package;
 
         /** @var OrderService */
         $order = app('OrderService')->logisticNumberFirstOrCreateOrder($logistic_number);
@@ -59,47 +64,50 @@ class OrderPackageService
             ->paginate($paginate);
     }
 
-    public function getByWmsOrders($orderHeaders){
-        $order_nos = data_get($orderHeaders,'*.orderno');
+    public function getByWmsOrders($orderHeaders)
+    {
+        $order_nos = data_get($orderHeaders, '*.orderno');
         return OrderPackage::query()->with('order')
-            ->whereIn('order_id',function($query) use ($order_nos){
-                $query->from('orders')->select('id')->whereIn('code',$order_nos);
+            ->whereIn('order_id', function ($query) use ($order_nos) {
+                $query->from('orders')->select('id')->whereIn('code', $order_nos);
             })->get();
     }
 
     public function create(array $params)
     {
-        if(count($params) == 0)return null;
+        if (count($params) == 0) return null;
         try {
             $this->insert($params);
-            app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage' . count($params) . json_encode($params));
+            app('LogService')->log(__METHOD__, __FUNCTION__, '批量生成 orderPackage' . count($params) . json_encode($params));
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
+            app('LogService')->log(__METHOD__, __FUNCTION__, '批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
         } finally {
-            $logistic_numbers = data_get($params,'*.logistic_number');
+            $logistic_numbers = data_get($params, '*.logistic_number');
             unset($params);
-            return OrderPackage::query()->whereIn('logistic_number',$logistic_numbers)->get();
+            return OrderPackage::query()->whereIn('logistic_number', $logistic_numbers)->get();
         }
     }
 
     public function getByOrderNos($orderNos)
     {
         return OrderPackage::query()->with('order')
-            ->whereIn('order_id',function($query)use($orderNos){
-                $query->from('orders')->select('id')->whereIn('code',$orderNos);
+            ->whereIn('order_id', function ($query) use ($orderNos) {
+                $query->from('orders')->select('id')->whereIn('code', $orderNos);
             })->get();
     }
 
-    public function update($orderClientNo,$logisticNumber)
+    public function update($orderClientNo, $logisticNumber)
     {
-        $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$orderClientNo)->first();
-        if(!$order){
-            $order = Order::query()->create(['client_code'=>$orderClientNo]);
+        $order = Order::query()->with('packages.commodities.commodity')->where('client_code', $orderClientNo)->first();
+        if (!$order) {
+            $order = Order::query()->create(['client_code' => $orderClientNo]);
+        }
+        $orderPackage = OrderPackage::query()->where('logistic_number', $logisticNumber)->first();
+        if ($orderPackage) {
+            return compact('orderPackage', 'order');
         }
-        $orderPackage = OrderPackage::query()->where('logistic_number',$logisticNumber)->first();
-        if($orderPackage){return  compact('orderPackage','order');}
-        $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]);
-        return  compact('orderPackage','order');
+        $orderPackage = OrderPackage::query()->create(['order_id' => $order->id, 'logistic_number' => $logisticNumber]);
+        return compact('orderPackage', 'order');
     }
 
     public function syncOrderPackage(&$orderHeaders)
@@ -111,84 +119,84 @@ class OrderPackageService
     {
         /** @var OrderService $orderService */
         $orderService = app('OrderService');
-        if(!$orderHeaders)return;
+        if (!$orderHeaders) return;
         $orders = $orderService->getByWmsOrders($orderHeaders);
         $this->processCancelOrderPackages($orderHeaders);                           // 取消订单操作 及 过滤
-        $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno'));          // 已有
-        $this->createOrderPackage($orderHeaders,$orders,$packages);                     // 创建package
-        $this->updatePackage($orderHeaders,$packages);
-        $this->deleteUnnecessaryPackage($orderHeaders,$packages);     // 删除package
-        unset($orders,$packages);       // 手动清除
+        $packages = $this->getByOrderNos(data_get($orderHeaders, '*.orderno'));          // 已有
+        $this->createOrderPackage($orderHeaders, $orders, $packages);                     // 创建package
+        $this->updatePackage($orderHeaders, $packages);
+        $this->deleteUnnecessaryPackage($orderHeaders, $packages);     // 删除package
+        unset($orders, $packages);       // 手动清除
     }
 
-    public function createOrderPackage($orderHeaders,$orders,$packages)
+    public function createOrderPackage($orderHeaders, $orders, $packages)
     {
-        if(!$orderHeaders)return;
+        if (!$orderHeaders) return;
         /**
          * @var DataHandlerService $dataHandlerService
          * @var LogisticService $logsitcService
          */
         $logisticService = app(LogisticService::class);
         $dataHandlerService = app(DataHandlerService::class);
-        $orderHeaders_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
-        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
+        $orderHeaders_map = $dataHandlerService->dataHeader(['orderno'], $orderHeaders);
+        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'], $packages);
         $inner_params = [];
 
         /** 定制京东快递的订单 */
         $logistic = $logisticService->getLogisticByCodes(['JDKD'])->first();
-        foreach ($orders as $order){
-            $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$orderHeaders_map);
-            if(!$orderHeader)continue;
-            if($orderHeader->sostatus == 90)continue;
-            $params = $this->getInnerParams($orderHeader,$order,$packages_maps,$logistic);
-            $inner_params = array_merge($inner_params,$params);
+        foreach ($orders as $order) {
+            $orderHeader = $dataHandlerService->getKeyValue(['orderno' => $order->code], $orderHeaders_map);
+            if (!$orderHeader) continue;
+            if ($orderHeader->sostatus == 90) continue;
+            $params = $this->getInnerParams($orderHeader, $order, $packages_maps, $logistic);
+            $inner_params = array_merge($inner_params, $params);
         }
 
         /** 批量添加 */
-        if(count($inner_params)>0){
+        if (count($inner_params) > 0) {
             try {
-                $inner_array = array_chunk($inner_params,5000);
+                $inner_array = array_chunk($inner_params, 5000);
                 foreach ($inner_array as $params) {
                     $bool = $this->insert($params);
                     $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null;
                 }
             } catch (\Exception $e) {
-                LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' .json_encode($e->getMessage()). json_encode($inner_params).json_encode($e->getTraceAsString()));
+                LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' . json_encode($e->getMessage()) . json_encode($inner_params) . json_encode($e->getTraceAsString()));
             }
         }
     }
 
-    public function getInnerParams($orderHeader,$order,$packages_maps,$logistic): array
+    public function getInnerParams($orderHeader, $order, $packages_maps, $logistic): array
     {
         /**
-        * @var DataHandlerService $dataHandlerService
-        */
+         * @var DataHandlerService $dataHandlerService
+         */
         $dataHandlerService = app('DataHandlerService');
-        $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails,'*.picktotraceid')),['','*']);
+        $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails, '*.picktotraceid')), ['', '*']);
         $date = Carbon::now()->format('Y-m-d H:i:s');
         $inner_params = [];
         $sentAtMap = [];
 
-        if($orderHeader['sostatus'] == '90'){
-            if($orderHeader['soreference5']=='')$logistic_numbers = [$orderHeader['orderno']];
+        if ($orderHeader['sostatus'] == '90') {
+            if ($orderHeader['soreference5'] == '') $logistic_numbers = [$orderHeader['orderno']];
             else $logistic_numbers = [$orderHeader['soreference5']];
         }
 
         /** sent_at checktime */
-        foreach ($orderHeader->actAllocationDetails as $item){
+        foreach ($orderHeader->actAllocationDetails as $item) {
             $sentAtMap[$item->picktotraceid] = $item;
         }
 
         /** 承运商是京东时的定制操作 */
-        if($order['logistic_id'] == $logistic['id'] && count($logistic_numbers) == 1){
+        if ($order['logistic_id'] == $logistic['id'] && count($logistic_numbers) == 1) {
             $logistic_numbers = [$orderHeader['soreference5']];
             $sentAtMap[$orderHeader['soreference5']] = $orderHeader->actAllocationDetails->first() ?? null;
         }
 
-        foreach ($logistic_numbers as $logistic_number){
-            $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps);
+        foreach ($logistic_numbers as $logistic_number) {
+            $package = $dataHandlerService->getKeyValue(['logistic_number' => $logistic_number], $packages_maps);
 
-            if(isset($package))continue;
+            if (isset($package)) continue;
             try {
                 $data = $sentAtMap[$logistic_number];
             } catch (\Exception $e) {
@@ -202,14 +210,14 @@ class OrderPackageService
                 'updated_at' => $date,
                 'status' => '无',
                 'owner_id' => $order->owner_id,
-                'sent_at' => $data ? $data->checktime:null,
+                'sent_at' => $data ? $data->checktime : null,
             ];
         }
         return $inner_params;
     }
 
 
-    public function deleteUnnecessaryPackage($orderHeaders,$packages)
+    public function deleteUnnecessaryPackage($orderHeaders, $packages)
     {
         /**
          * @var DataHandlerService $dataHandlerService
@@ -221,45 +229,45 @@ class OrderPackageService
 
         $logistic_numbers = array();
         foreach ($orderHeaders as $orderHeader) {
-            if($orderHeader['sostatus'] == '90') {
-                if($orderHeader['soreference5'] == '') $logistic_numbers[$orderHeader['orderno']] = $orderHeader['orderno'];
+            if ($orderHeader['sostatus'] == '90') {
+                if ($orderHeader['soreference5'] == '') $logistic_numbers[$orderHeader['orderno']] = $orderHeader['orderno'];
                 else $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
-            } elseif ($orderHeader['userdefine1'] == 'JDKD' ){
+            } elseif ($orderHeader['userdefine1'] == 'JDKD') {
                 $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
             } else {
                 foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
-                    $logistic_numbers[$actAllocationDetail['picktotraceid']] =  $actAllocationDetail['picktotraceid'];
+                    $logistic_numbers[$actAllocationDetail['picktotraceid']] = $actAllocationDetail['picktotraceid'];
                 }
             }
         }
 
         /** WMS快递单号唯一化 剔除 '',' ','*'*/
         $logistic_numbers = array_unique(array_values($logistic_numbers));
-        $logistic_numbers = array_diff($logistic_numbers,['',' ','*']);
+        $logistic_numbers = array_diff($logistic_numbers, ['', ' ', '*']);
 
         /** WAS数据库中已有的快递单号*/
-        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
-        $exits_number = data_get($packages,'*.logistic_number');
+        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'], $packages);
+        $exits_number = data_get($packages, '*.logistic_number');
 
         /** WMS快递单号 和 WAS的快递单号 的差集*/
         $packages = array();
-        $diff_number = array_diff($exits_number,$logistic_numbers);
+        $diff_number = array_diff($exits_number, $logistic_numbers);
 
         /** 记录差集对应的OrderPackage的id*/
         foreach ($diff_number as $number) {
-            $package = $dataHandlerService->getKeyValue(['logistic_number'=>$number],$packages_maps);
-            if($package ?? false)$packages[]=$package->id;
+            $package = $dataHandlerService->getKeyValue(['logistic_number' => $number], $packages_maps);
+            if ($package ?? false) $packages[] = $package->id;
         }
 
         /** 删除 OrderPackage 和 OrderPackageCommodities*/
-        if(count($packages)==0)return;
+        if (count($packages) == 0) return;
         try {
             $bool = OrderPackage::query()->whereIn('id', $packages)->delete();
-            $orderPackageCommodities = OrderPackageCommodities::query()->whereIn('order_package_id',$packages)->get();
+            $orderPackageCommodities = OrderPackageCommodities::query()->whereIn('order_package_id', $packages)->get();
             $orderPackageCommoditiesService->deleteOrderCommodities($orderPackageCommodities);
-            $bool ? LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages)) : null;
+            $bool ? LogService::log(__METHOD__, __FUNCTION__, '删除多余包裹 ids:' . json_encode($packages)) : null;
         } catch (\Exception $e) {
-            LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages).$e->getMessage());
+            LogService::log(__METHOD__, __FUNCTION__, '删除多余包裹 ids:' . json_encode($packages) . $e->getMessage());
         }
     }
 
@@ -267,7 +275,7 @@ class OrderPackageService
     {
         $map = $this->getSentAtMap($orderHeaders);
         $update_params = [];
-        $update_params[] = ['id','sent_at'];
+        $update_params[] = ['id', 'sent_at'];
         foreach ($packages as $package) {
             if ($package->sent_at) continue;
             try {
@@ -280,7 +288,7 @@ class OrderPackageService
                     'id' => $package->id,
                     'sent_at' => $checktime,
                 ];
-            }else {
+            } else {
                 continue;
             }
 
@@ -311,28 +319,105 @@ class OrderPackageService
      */
     public function processCancelOrderPackages(&$orderHeaders)
     {
-        $this->instant($this->orderTrackingService,'OrderTrackingService');
+        $this->instant($this->orderTrackingService, 'OrderTrackingService');
 
-        $cancelOrder = $orderHeaders->filter(function($orderHeader){
+        $cancelOrder = $orderHeaders->filter(function ($orderHeader) {
             return $orderHeader->sostatus == '90';
         });
 
-        $orderPackages = OrderPackage::query()->whereIn('order_id',function($query)use($cancelOrder){
+        $orderPackages = OrderPackage::query()->whereIn('order_id', function ($query) use ($cancelOrder) {
             /** @var Builder $query */
-            $query->from((new Order())->getTable())->selectRaw('id')->whereIn('code',data_get($cancelOrder,'*.orderno'));
+            $query->from((new Order())->getTable())->selectRaw('id')->whereIn('code', data_get($cancelOrder, '*.orderno'));
         })->get();
 
-        if($orderPackages->count() == 0)return ;
+        if ($orderPackages->count() == 0) return;
 
         $orderPackage_list = $orderPackages->chunk(200);
-        foreach ($orderPackage_list as $orderPackageSet){
-            OrderPackage::query()->whereIn('id',data_get($orderPackageSet,'*.id'))->delete();
-            $items = OrderTracking::query()->whereIn('order_package_commodity_id',function($query)use($orderPackages){
+        foreach ($orderPackage_list as $orderPackageSet) {
+            OrderPackage::query()->whereIn('id', data_get($orderPackageSet, '*.id'))->delete();
+            $items = OrderTracking::query()->whereIn('order_package_commodity_id', function ($query) use ($orderPackages) {
                 /** @var Builder $query */
-                $query->from((new OrderPackageCommodities)->getTable())->selectRaw('id')->whereIn('order_package_id',data_get($orderPackages,'*.id'));
+                $query->from((new OrderPackageCommodities)->getTable())->selectRaw('id')->whereIn('order_package_id', data_get($orderPackages, '*.id'));
             })->get();
             $this->orderTrackingService->deleteOrderTracings($items);
         }
 
     }
+
+    /**
+     * 一键揽收上传
+     * @param $logistic_numbers array
+     * @return array
+     */
+    public function collectUpload(array $logistic_numbers=[]): array
+    {
+        //参数校验
+        if (empty($logistic_numbers)) {
+            return [
+                'success' => false,
+                'message' => '输入快递单号为空',
+            ];
+        }
+        $orderPackageCount = OrderPackage::query()->whereIn('logistic_number', $logistic_numbers)
+            ->whereIn('order_id', function ($query) {
+                $query->from('orders')->select('id')->whereIn('logistic_id', function ($query) {
+                    $query->from('logistics')->select('id')->whereIn('code', [
+                        'ZTO',
+                        'ZTO-1',
+                        'WPZTO',
+                    ]);
+                });
+            })->count();
+        if ($orderPackageCount !== count($logistic_numbers)) {
+            return [
+                'success' => false,
+                'message' => '输入的快递单号异常,请检查承运商是否全部为中通',
+            ];
+        }
+
+        $url = config('api_logistic.collectUpload.ZTO.test.url');
+        $xAppKey = config('api_logistic.collectUpload.ZTO.test.x-appKey');
+        $appSecret = config('api_logistic.collectUpload.ZTO.test.appSecret');
+        $appId = config('api_logistic.collectUpload.ZTO.test.appId');
+        //中通接口最大支持100条
+        $logistic_numbers_chunked = array_chunk($logistic_numbers, 100);
+
+        foreach ($logistic_numbers_chunked as $logistic_numbers_chunked_items) {
+            $orderPackages = OrderPackage::query()
+                ->select('weight', 'logistic_number')
+                ->whereIn('logistic_number', $logistic_numbers_chunked_items)->get();
+
+            $collectUploadDTOS = [];
+
+            foreach ($orderPackages as $orderPackage) {
+                $collectUploadDTOS[] = [
+                    'billCode' => $orderPackage->logistic_number,
+                    'weight' => $orderPackage->weight ?? 0,
+                    'appId' => $appId,
+                    'importDate' => now()->toDateTimeString(),
+                ];
+            }
+            $body = json_encode([
+                'collectUploadDTOS' => $collectUploadDTOS,
+            ], JSON_UNESCAPED_UNICODE);
+            $data_digest = base64_encode(md5($body . $appSecret, TRUE));
+            $headers = [
+                'Content-Type' => 'application/json; charset=UTF-8',
+                'x-companyid' => $xAppKey,
+                'x-datadigest' => $data_digest,
+            ];
+            $response = Http::withHeaders($headers)->withBody($body, 'application/json')->post($url);
+            $responseBody = json_decode($response->body());
+            if ($responseBody->statusCode === 'S210' ||//无权限
+                $responseBody->statusCode === 'PARAM_ERROR'||//揽收上传信息为空
+                $responseBody->statusCode === 'SYSTEM_ERROR'//系统异常,请联系系统管理员
+            ) {
+                return [
+                    'success' => false,
+                    'message' => $responseBody->message,
+                ];
+            }
+        }
+        return ['success' => true, 'message' => '一键揽收上传成功'];
+    }
 }

+ 28 - 11
config/api_logistic.php

@@ -118,7 +118,7 @@ return [
                 'url' => 'https://u-openapi.yundasys.com/openapi/outer/logictis/subscribe',
             ],
         ],
-        'prod'=>[
+        'prod' => [
             'app-key' => '000638',
             'app-secret' => '0b941e746e3e4a5687c11f11f32ef9a3',
             'search' => [
@@ -169,17 +169,17 @@ return [
     'init_date' => '2021-05-17 23:59:59',
     'querying_days' => 15,
     'DB' => [
-        'test'=>[
+        'test' => [
             'app_key' => 'bb4e6c0b24794795c306b3461f5470d3',
             'company_code' => 'EWBSHBSGYLGLYXGS',
             'customer_Code' => 'F2015082279473065',
             'sign' => 'IYKO',
             'needTraceInfo' => 0, //是否需要订阅轨迹 1:是 2:否
-            'orderType' => [1 => '散客模式',2 => '大客户模式',3 => '同步筛单下单'], //下单模式 1:散客模式 2:大客户模式 3:同步筛单下单
+            'orderType' => [1 => '散客模式', 2 => '大客户模式', 3 => '同步筛单下单'], //下单模式 1:散客模式 2:大客户模式 3:同步筛单下单
             'transportType' => ['JZQY_LONG' => '精准汽运', 'JZKH' => '精准卡航'], //运输方式/产品类型 快递运输方式 : RCP:大件快递360; NZBRH:重包入户; ZBTH:重包特惠; WXJTH:微小件特惠; JJDJ:经济大件; PACKAGE:标准快递; DEAP:特准快件;HKDJC:航空大件次日达; HKDJG:航空大件隔日达; TZKJC:特快专递; 零担运输方式: JZKY:精准空运(仅散客模式支持该运输方式); JZQY_LONG:精准汽运; JZKH:精准卡航; 整车运输方式 1.整车配送 ZCPS 2.精准专车 JZZHC
-            'payType' => [0 => '发货人付款(现付)(大客户模式不支持寄付)',1 => '收货人付款(到付)',2 => '发货人付款(月结)'], //支付方式  0、发货人付款(现付)(大客户模式不支持寄付) 1、收货人付款(到付) 2、发货人付款(月结)
-            'backSignBill' => [0 =>'无需返单',1 => '签收单原件返回',2 => '电子签收单'], //签收回单  0:无需返单 1:签收单原件返回 2:电子签收单(电子签名图片需要另外对接查询接口)
-            'packageService' => ['纸','纤','木箱','木架','托膜','托木'],  //包装(直接用中文) : 纸、纤、木箱、木架、托膜、托木(大客户模式下运输方式为零担时必填)
+            'payType' => [0 => '发货人付款(现付)(大客户模式不支持寄付)', 1 => '收货人付款(到付)', 2 => '发货人付款(月结)'], //支付方式  0、发货人付款(现付)(大客户模式不支持寄付) 1、收货人付款(到付) 2、发货人付款(月结)
+            'backSignBill' => [0 => '无需返单', 1 => '签收单原件返回', 2 => '电子签收单'], //签收回单  0:无需返单 1:签收单原件返回 2:电子签收单(电子签名图片需要另外对接查询接口)
+            'packageService' => ['纸', '纤', '木箱', '木架', '托膜', '托木'],  //包装(直接用中文) : 纸、纤、木箱、木架、托膜、托木(大客户模式下运输方式为零担时必填)
             'smsNotify' => 'N', //短信通知  Y:需要 N: 不需要
             'passwordSigning' => 'N', //是否口令签收 仅适用于快递,Y:需要 N: 不需要;若为Y,必须收货人提供验证码给快递员才能签收,该服务是有偿的,具体费用请让我司收货营业部联系张宁(491407),请慎重使用!
             'uri' => [
@@ -187,17 +187,17 @@ return [
                 'order_locus' => 'http://dpsanbox.deppon.com/sandbox-web/standard-order/newTraceQuery.action',
             ]
         ],
-        'prod'=>[
+        'prod' => [
             'app_key' => 'bb4e6c0b24794795c306b3461f5470d3',
             'company_code' => 'EWBSHBSGYLGLYXGS',
             'customer_Code' => 'F2015082279473065',
             'sign' => 'IYKO',
             'needTraceInfo' => 0, //是否需要订阅轨迹 1:是 2:否
-            'orderType' => [1 => '散客模式',2 => '大客户模式',3 => '同步筛单下单'], //下单模式 1:散客模式 2:大客户模式 3:同步筛单下单
+            'orderType' => [1 => '散客模式', 2 => '大客户模式', 3 => '同步筛单下单'], //下单模式 1:散客模式 2:大客户模式 3:同步筛单下单
             'transportType' => ['JZQY_LONG' => '精准汽运', 'JZKH' => '精准卡航'], //运输方式/产品类型 快递运输方式 : RCP:大件快递360; NZBRH:重包入户; ZBTH:重包特惠; WXJTH:微小件特惠; JJDJ:经济大件; PACKAGE:标准快递; DEAP:特准快件;HKDJC:航空大件次日达; HKDJG:航空大件隔日达; TZKJC:特快专递; 零担运输方式: JZKY:精准空运(仅散客模式支持该运输方式); JZQY_LONG:精准汽运; JZKH:精准卡航; 整车运输方式 1.整车配送 ZCPS 2.精准专车 JZZHC
-            'payType' => [0 => '发货人付款(现付)(大客户模式不支持寄付)',1 => '收货人付款(到付)',2 => '发货人付款(月结)'], //支付方式  0、发货人付款(现付)(大客户模式不支持寄付) 1、收货人付款(到付) 2、发货人付款(月结)
-            'backSignBill' => [0 =>'无需返单',1 => '签收单原件返回',2 => '电子签收单'], //签收回单  0:无需返单 1:签收单原件返回 2:电子签收单(电子签名图片需要另外对接查询接口)
-            'packageService' => ['纸','纤','木箱','木架','托膜','托木'],  //包装(直接用中文) : 纸、纤、木箱、木架、托膜、托木(大客户模式下运输方式为零担时必填)
+            'payType' => [0 => '发货人付款(现付)(大客户模式不支持寄付)', 1 => '收货人付款(到付)', 2 => '发货人付款(月结)'], //支付方式  0、发货人付款(现付)(大客户模式不支持寄付) 1、收货人付款(到付) 2、发货人付款(月结)
+            'backSignBill' => [0 => '无需返单', 1 => '签收单原件返回', 2 => '电子签收单'], //签收回单  0:无需返单 1:签收单原件返回 2:电子签收单(电子签名图片需要另外对接查询接口)
+            'packageService' => ['纸', '纤', '木箱', '木架', '托膜', '托木'],  //包装(直接用中文) : 纸、纤、木箱、木架、托膜、托木(大客户模式下运输方式为零担时必填)
             'smsNotify' => 'N', //短信通知  Y:需要 N: 不需要
             'passwordSigning' => 'N', //是否口令签收 仅适用于快递,Y:需要 N: 不需要;若为Y,必须收货人提供验证码给快递员才能签收,该服务是有偿的,具体费用请让我司收货营业部联系张宁(491407),请慎重使用!
             'uri' => [
@@ -206,4 +206,21 @@ return [
             ]
         ]
     ],
+
+    'collectUpload' => [
+        'ZTO' => [
+            'test' => [
+                'url' => 'https://japi-test.zto.com/zto.network.collectUpload',
+                'x-appKey' => 'c51c718eb899e9f706979',
+                'appSecret' => '9f664e3ab08049874aa417720840161a',
+                'appId' => 'GJWL',
+            ],
+            'prod' =>[
+                'url' => 'https://japi.zto.com/zto.network.collectUpload',
+                'x-appKey' => 'c51c718eb899e9f706979',
+                'appSecret' => '9f664e3ab08049874aa417720840161a',
+                'appId' => '9f664e3ab08049874aa417720840161a',
+            ]
+        ]
+    ]
 ];

+ 1 - 1
tests/Feature/LogisticZopSyncTest.php

@@ -39,7 +39,7 @@ class LogisticZopSyncTest extends TestCase
 
     public function test_get()
     {
-        LogisticZopSync::dispatch('75497969890714');
+        LogisticZopSync::dispatch('75502471791896');
     }