Forráskód Böngészése

Merge branch 'yang'

zhouzhendong 4 éve
szülő
commit
24c8541718

+ 102 - 0
app/Http/Controllers/OrderController.php

@@ -4,19 +4,24 @@ namespace App\Http\Controllers;
 
 use App\Components\Database;
 use App\Http\Requests\OrderDelivering;
+use App\OracleActAllocationDetails;
 use App\OracleDOCOrderHeader;
 use App\OracleDOCWaveDetails;
 use App\OrderIssueType;
+use App\OrderPackage;
 use App\Services\LogisticService;
 use App\Services\LogService;
+use App\Services\OrderPackageService;
 use App\Services\OrderService;
 use App\Services\RejectedBillItemService;
 use App\Services\RejectedBillService;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Oursdreams\Export\Export;
+use function DeepCopy\deep_copy;
 
 class OrderController extends Controller
 {
@@ -424,4 +429,101 @@ sql;
         return["status"=>'part',"msg"=>$txt];
     }
 
+    /**
+     * 一键揽收分配
+     * @param Request $request
+     * @return array
+     */
+    public function collectUpload(Request $request): array
+    {
+        $inOrderno = $request->orderno;
+        $strict = $request->strict;
+        if (empty($inOrderno)) return ['success' => false, 'message' => '选择为空'];
+        $orderno = deep_copy($inOrderno);
+
+        /**
+         * 是否是严格模式
+         * 是
+         *          根据筛选条件
+         *           1. 状态 61 81
+         *           2. 承运商是中通
+         *           3. 有单号
+         *           4. 有复核,
+         *           5. 没揽收
+         * 否
+         * 筛选出快递单号
+         * 将快递单号调用一键揽收
+         *      如果返回异常,记录异常
+         * 调用分配
+         * 将入参与过滤结果取差集合,结果就是不复核的单号,作为错误提示返回
+         */
+        //严格模式,校验订单与包裹状态
+        if ($strict) {
+            $logisticNums = OracleActAllocationDetails::query()
+                ->select('picktotraceid')
+                ->whereIn('orderno', $orderno)
+                ->whereNotNull('picktotraceid')//有单号
+                ->whereNotNull('checktime')//有复核
+                ->whereIn('orderno', function (Builder $query) use ($orderno) {
+                    $query->from('doc_order_header')
+                        ->select('orderno')
+                        ->whereIn('orderno', $orderno)
+                        ->whereIn('carriername', ['中通(轻小包裹)', '中通', '中通速递']) // 承运商是中通
+                        ->whereBetween('sostatus', [61, 81]); //状态 61 81
+                })
+                ->pluck('picktotraceid');
+            $logisticNums = OrderPackage::query()
+                ->select('logistic_number')
+                ->whereIn('logistic_number', $logisticNums)
+                ->whereNull('transfer_status')
+                ->pluck('logistic_number');
+        }else{
+            //非严格模式 不进行任何校验
+            $logisticNums = OracleActAllocationDetails::query()
+                ->select('picktotraceid')
+                ->whereIn('orderno', $orderno)
+                ->pluck('picktotraceid');
+        }
+
+        //调用一键揽收
+        /** @var OrderPackageService $orderPackageService */
+        $orderPackageService = app('OrderPackageService');
+        $collectUpLoadResult = $orderPackageService->collectUpload($logisticNums->toArray());
+        $error = [];
+        //揽收有异常记录
+        if (!$collectUpLoadResult['success']) {
+            $error['collectUpload'] = $collectUpLoadResult['message'];
+        }
+        /** @var OrderService $orderService */
+        $orderService = app('OrderService');
+        //根据快递单号查询orderno
+        $allocationOrdernos = OrderPackage::query()
+            ->whereIn('logistic_number', $logisticNums)
+            ->leftJoin('orders', 'order_id', '=', 'orders.id')
+            ->select('orders.code')
+            ->pluck('code');
+        //调用分配接口
+        $allocationOrdernos->each(function ($orderno) use ($orderService) {
+            $orderService->allocation($orderno);
+        });
+        if ($strict) {
+            //输入的orderno与最终可以一键揽收的orderno取差集合
+            $errorOrderno =  array_diff($inOrderno, $allocationOrdernos->toArray());
+        }
+
+        $result = [];
+        if (!empty($error)) {
+            $result['success'] = false;
+            $result['error_message'] = $error;
+        }else if(!empty($errorOrderno)){
+            $result['success'] = false;
+            $result['error_message'][] = $error;
+        }
+        else {
+            $result['success']=true;
+            $result['message']='一键揽收分配完成';
+        }
+        return $result;
+    }
+
 }

+ 2 - 2
app/Http/Controllers/TestController.php

@@ -490,8 +490,8 @@ sql;
         /** @var OrderPackageService $service */
         $service = app('OrderPackageService');
        return $service->collectUpload([
-            '75803656098638',
-            '75803656098612'
+            '75810646867541',
+            '75810646197516'
         ]);
     }
 

+ 5 - 4
app/OrderPackage.php

@@ -39,10 +39,11 @@ class OrderPackage extends Model
         'transfer_status',
         'owner_id',
         'uploaded_to_wms',
-        'sync_routes_flag',
-        'is_manual_update',
-        'exception_status',
-        'is_delay_deliver',
+        'sync_routes_flag',//同步物流信息标记
+        'is_manual_update',//是否手动更新状态
+        'exception_status',//异常状态
+        'is_delay_deliver',//是否延时发货
+        'collecting_status',//手动揽收状态
     ];
 
     protected $casts = [

+ 26 - 29
app/Services/OrderPackageService.php

@@ -356,7 +356,7 @@ class OrderPackageService
     }
 
     /**
-     * 中通一键揽收上传
+     * 中通一键揽收
      * 由于中通接口只支持100条的操作,本接口支持100以上
      * 如果中途调用中通接口发生异常,本方法不会停止,但在最后会返回错误信息,将执行失败的单号和原因返回
      * @param $logistic_numbers array
@@ -371,23 +371,7 @@ class OrderPackageService
                 '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 = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.url') : config('api_logistic.collectUpload.ZTO.test.url');
         $xAppKey = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.x-appKey') : config('api_logistic.collectUpload.ZTO.test.x-appKey');
         $appSecret = env('APP_ENV') === 'production' ? config('api_logistic.collectUpload.ZTO.prod.appSecret') : config('api_logistic.collectUpload.ZTO.test.appSecret');
@@ -411,25 +395,38 @@ class OrderPackageService
                 ];
             }
             try {
+                //调用中通接口
                 $response = $this->sentReqToZOP($collectUploadDTOS, $appSecret, $xAppKey, $url);
+
+                //接口返回的异常包装
+                $responseBody = json_decode($response->body());
+                if ($responseBody->statusCode === 'S210' ||//无权限
+                    $responseBody->statusCode === 'PARAM_ERROR' ||//揽收上传信息为空
+                    $responseBody->statusCode === 'SYSTEM_ERROR'//系统异常,请联系系统管理员
+                ) {
+                    //有异常包装
+                    $errorMessage[] = [
+                        'status_code' => $responseBody->statusCode,
+                        'message' => $responseBody->message,
+                        'logistic_number' => $logistic_numbers_chunked_items,
+                    ];
+                } else {
+                    //没有异常将对应包裹标记为手动揽收
+                    OrderPackage::query()
+                        ->select('weight', 'logistic_number')
+                        ->whereIn('logistic_number', $logistic_numbers_chunked_items)->update([
+                            'collecting_status' => 1,
+                        ]);
+                }
             } catch (\Exception $e) {
+                //调用异常,构建异常返回体
                 $errorMessage[] = [
                     'status_code' => 'REQUEST_ERROR',
                     'message' => [$e->getMessage()],
                     'logistic_number' => $logistic_numbers_chunked_items,
                 ];
             }
-            $responseBody = json_decode($response->body());
-            if ($responseBody->statusCode === 'S210' ||//无权限
-                $responseBody->statusCode === 'PARAM_ERROR' ||//揽收上传信息为空
-                $responseBody->statusCode === 'SYSTEM_ERROR'//系统异常,请联系系统管理员
-            ) {
-                $errorMessage[] = [
-                    'status_code' => $responseBody->statusCode,
-                    'message' => $responseBody->message,
-                    'logistic_number' => $logistic_numbers_chunked_items,
-                ];
-            }
+
         }
         if (empty($errorMessage)) {
             return ['success' => true, 'message' => '一键揽收上传成功'];

+ 32 - 0
database/migrations/2021_09_26_095833_add_column_manual_collection_status_to_order_packages_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnManualCollectionStatusToOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->integer('collecting_status')->default(0)->comment('手动揽收标记 0:不是手动揽收 1:是手动揽收');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropColumn('collecting_status');
+        });
+    }
+}

+ 18 - 0
resources/views/order/index/delivering.blade.php

@@ -44,6 +44,10 @@
                         <button class="btn btn-sm ml-1 btn-success tooltipTarget" title="订单一键回传必须满足条件:订单状态为“分配完成,部分拣货,拣货完成,播种完成”;订单未冻结;订单有快递单号"
                                 @click="manualBack()">一键回传</button>
                     @endcan
+{{--                    @can('订单管理-订单-一键揽收')--}}
+                        <button class="btn btn-sm ml-1 btn-success tooltipTarget" title="订单一键揽收必须满足条件:承运商为:“中通” 订单状态为“播种完成,部分装箱,完全装箱,部分装车,装车完成,部分发运,完全发运”;订单未冻结;订单有快递单号,快递未揽收"
+                                @click="collectUpload()">一键揽收分配</button>
+{{--                    @endcan--}}
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
@@ -1174,6 +1178,20 @@
                         window.tempTip.show("网络错误:" + err);
                     })
                 },
+                collectUpload(){
+                    if(checkData.length===0){tempTip.show('没有勾选记录');return;}
+                    const data = {
+                        'orderno': checkData,
+                        'strict': false,
+                    };
+                    window.axios.post("{{url('order/collectUpload')}}", data).then(res => {
+                        if (res.data.success) {
+                            tempTip.showSuccess(res.data.message)
+                        }else {
+                            tempTip.show(res.data.error_message);
+                        }
+                    });
+                },
                 isDB(item){
                     if(item.indexOf('德邦') == -1  || item.indexOf('京东') == -1) return false;
                     return  true;

+ 1 - 0
routes/web.php

@@ -799,6 +799,7 @@ Route::group(['prefix'=>'package'],function(){
         Route::post('deAllocationAll','OrderController@deAllocationAll');
         Route::post('allocation','OrderController@allocation');
         Route::post('manualBack','OrderController@manualBack');
+        Route::post('collectUpload','OrderController@collectUpload');
         Route::post('resetLogisticsGetMark','OrderController@resetLogisticsGetMark');
         Route::post('resetInterfaceReturnMark','OrderController@resetInterfaceReturnMark');
         Route::post('createRejectedBill','OrderController@createRejectedBill');