Przeglądaj źródła

快递同步 周旭需求发布

ANG YU 4 lat temu
rodzic
commit
5b0bc64fee

+ 47 - 6
app/Filters/OrderPackageFilters.php

@@ -4,7 +4,9 @@
 namespace App\Filters;
 
 use App\Order;
+use App\OrderIssue;
 use App\Services\UserService;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Carbon;
 use Illuminate\Support\Str;
@@ -15,7 +17,12 @@ class OrderPackageFilters
     protected $request;
     protected $queryBuilder;
     protected $filters = ['logistic_number', 'status', 'received_at_start',
-        'received_at_end', 'is_weighed', 'logistic', 'owner', 'sent_at_start', 'sent_at_end', 'is_exception', 'exception_type', 'default_date','has_transfer_status'];
+        'default_logistics',
+        'is_issue',
+        'sync_routes_flag',
+        'received_at_end', 'is_weighed', 'logistic', 'owner', 'sent_at_start', 'sent_at_end', 'is_exception', 'exception_type', 'default_date', 'has_transfer_status'];
+
+    protected $orderIssueQuery;
 
     public function __construct(Request $request)
     {
@@ -34,26 +41,37 @@ class OrderPackageFilters
         return $this->queryBuilder;
     }
 
+    public function getOrderIssueQuery(): Builder
+    {
+        if (!$this->orderIssueQuery) {
+            $this->orderIssueQuery = OrderIssue::query()->select('order_id');
+        }
+        return $this->orderIssueQuery;
+    }
+
 
     private function logistic_number($logistic_number)
     {
         if (strpos($logistic_number, ',') || strpos($logistic_number, ',') || strpos($logistic_number, ' ')) {
             $arr = array_filter(preg_split('/[,, ]+/is', $logistic_number));
-            $this->queryBuilder->whereIn('logistic_number',$arr);
+            $this->queryBuilder->whereIn('logistic_number', $arr);
         } else {
-            $this->queryBuilder->where('logistic_number','like',$logistic_number."%");
+            $this->queryBuilder->where('logistic_number', 'like', $logistic_number . "%");
         }
     }
 
     private function exception_type($exception_type)
     {
-        $this->queryBuilder->where('exception_type', $exception_type);
+        $exception_types = array_filter(preg_split('/[,, ]+/is', $exception_type));
+
+        $this->queryBuilder->whereIn('exception_type', $exception_types);
     }
+
     private function has_transfer_status($has_transfer_status)
     {
-        if ($has_transfer_status=='是') {
+        if ($has_transfer_status == '是') {
             $this->queryBuilder->whereNotNull('transfer_status');
-        } elseif ($has_transfer_status=='否') {
+        } elseif ($has_transfer_status == '否') {
             $this->queryBuilder->whereNull('transfer_status');
         }
     }
@@ -115,4 +133,27 @@ class OrderPackageFilters
     {
         $this->queryBuilder->where('sent_at', '>=', now()->startOfDay()->subDays(15))->where('sent_at', '<', now()->startOfDay()->addDay());
     }
+
+    public function default_logistics()
+    {
+        $this->queryBuilder->whereIn('order_id', function ($query) {
+            $query->from('orders')
+                ->select('id')
+                ->whereNotIn('logistic_id', [13, 24, 25, 26, 27, 30, 31, 32, 33, 34, 60, 63, 65, 66, 68, 70, 102, 105, 107, 116,]);
+        });
+    }
+
+    public function is_issue($is_issue)
+    {
+        $this->queryBuilder->whereIn('order_id', function ($query) {
+            $query->from('orders')->select('id')->whereIn('id', function ($query) {
+                $query->from('order_issues')->select('order_id');
+            });
+        });
+    }
+
+    public function sync_routes_flag($sync_routes_flag)
+    {
+        $this->queryBuilder->where('sync_routes_flag', $sync_routes_flag === 'true');
+    }
 }

+ 20 - 11
app/Http/Controllers/OrderPackageController.php

@@ -9,21 +9,30 @@ class OrderPackageController extends Controller
 {
     public function update(Request $request)
     {
-        $remarkItem = $request->input('remark');
+        $remark = $request->input('remark');
         /**
          * @var $orderPackage OrderPackage
          */
         $orderPackage = OrderPackage::query()->find($request->input('orderPackageId'));
-        if (is_null($orderPackage->remark)) {
-            $orderPackage->remark = [$remarkItem];
-        } else {
-            $remark = $orderPackage->remark;
-            $remark[] = $remarkItem;
-            $remark = array_reverse($remark);
-            $orderPackage->remark = $remark;
-        }
-        $orderPackage->save();
-        return ['success' => true, 'data' => $orderPackage->refresh()->remark];
+
+        $orderPackage->orderPackageRemarks()
+            ->create([
+                'user_id' => auth()->id(),
+                'content' => $remark,
+            ]);
+        return ['success' => true, 'data' => $orderPackage->orderPackageRemarks()->with('user')->orderByDesc('created_at')->get()];
+    }
+
+    public function destroy(Request $request)
+    {
+        /**
+         * @var $orderPackage OrderPackage
+         */
+        $orderPackage = OrderPackage::query()->find($request->input('orderPackageId'));
+
+
+        $orderPackage->orderPackageRemarks()->where('id',$request->remarkId)->delete();
+        return ['success' => true, 'data' => $orderPackage->orderPackageRemarks()->with('user')->orderByDesc('created_at')->get()];
     }
 
 }

+ 9 - 2
app/Http/Controllers/PackageLogisticController.php

@@ -30,11 +30,18 @@ class PackageLogisticController extends Controller
         $paginateParams = $request->input();
         $orderPackages = OrderPackage::query()
             ->filter($filters)
-            ->whereIn('owner_id', $owner_ids)->with(['order.logistic', 'order.owner', 'order.issue' => function ($query) {
+            ->with(['order.logistic',
+                'orderPackageRemarks'=>function ($query){
+                    $query->with('user')->orderByDesc('created_at');
+                },
+                'order.owner',
+                'order.issue' => function ($query) {
                 $query->with(['issueType', 'logs' => function ($query) {
                     $query->with('user')->orderBy('created_at', 'DESC');
                 }]);
-            }])->orderByDesc('id')->paginate($request->paginate ?? 50);
+            }])
+            ->orderByDesc('id')
+            ->paginate($request->paginate ?? 50);
         $logistics = Logistic::all();
         $owners = Owner::find($owner_ids);
         return view('package.logistic.index', compact('orderPackages', 'logistics', 'owners', 'paginateParams'));

+ 4 - 0
app/Jobs/LogisticAliJiSuSync.php

@@ -2,6 +2,7 @@
 
 namespace App\Jobs;
 
+use App\OrderPackage;
 use App\Services\LogisticAliJiSuApiService;
 use App\Services\LogService;
 use App\Services\OrderPackageReceivedSyncService;
@@ -46,6 +47,9 @@ class LogisticAliJiSuSync implements ShouldQueue
     public function handle()
     {
         LogService::log(LogisticAliJiSuSync::class, "{$this->logistic_number}-JOB-AliJiSu", '');
+        //标记上有同步的操作
+        OrderPackage::query()->where('logistic_number', $this->logistic_number)->update(['sync_routes_flag'=> true]);
+
         $this->logisticAliJiSuApiService = app('LogisticAliJiSuApiService');
         try {
             $response = $this->logisticAliJiSuApiService->query($this->logistic_number);

+ 3 - 0
app/Jobs/LogisticSFSync.php

@@ -2,6 +2,7 @@
 
 namespace App\Jobs;
 
+use App\OrderPackage;
 use App\Services\LogisticSFService;
 use App\Services\LogService;
 use Illuminate\Bus\Queueable;
@@ -45,6 +46,8 @@ class LogisticSFSync implements ShouldQueue
     public function handle()
     {
         LogService::log(LogisticSFSync::class, "JOB-SF", $this->logistic_number);
+        //标记上有同步的操作
+        OrderPackage::query()->where('logistic_number', $this->logistic_number)->update(['sync_routes_flag'=> true]);
         $this->logisticSFService = app('LogisticSFService');
         $formedData = $this->logisticSFService->get([$this->logistic_number]);
         $this->orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');

+ 4 - 0
app/Jobs/LogisticYDSync.php

@@ -2,6 +2,7 @@
 
 namespace App\Jobs;
 
+use App\OrderPackage;
 use App\Services\LogisticYDService;
 use App\Services\LogService;
 use App\Services\OrderPackageReceivedSyncService;
@@ -44,6 +45,9 @@ class LogisticYDSync implements ShouldQueue
     public function handle()
     {
         LogService::log(LogisticYDSync::class, "JOB-YD", $this->logistic_number);
+        //标记上有同步的操作
+        OrderPackage::query()->where('logistic_number', $this->logistic_number)->update(['sync_routes_flag'=> true]);
+
         $this->logisticYDService = app('LogisticYDService');
         //先订阅订单
         $this->logisticYDService->registerApi([$this->logistic_number]);

+ 4 - 0
app/Jobs/LogisticYTOSync.php

@@ -2,6 +2,7 @@
 
 namespace App\Jobs;
 
+use App\OrderPackage;
 use App\Services\LogisticYTOService;
 use App\Services\LogService;
 use App\Services\OrderPackageReceivedSyncService;
@@ -46,6 +47,9 @@ class LogisticYTOSync implements ShouldQueue
     public function handle()
     {
         LogService::log(LogisticYTOSync::class, "JOB-YTO", $this->logistic_number);
+        //标记上有同步的操作
+        OrderPackage::query()->where('logistic_number', $this->logistic_number)->update(['sync_routes_flag'=> true]);
+
         $this->logisticYTOService = app('LogisticYTOService');
         $this->orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');
         $nativeResponse = $this->logisticYTOService->query($this->logistic_number);

+ 3 - 0
app/Jobs/LogisticZopSync.php

@@ -3,6 +3,7 @@
 namespace App\Jobs;
 
 
+use App\OrderPackage;
 use App\Services\LogisticZopService;
 use App\Services\LogService;
 use App\Services\OrderPackageReceivedSyncService;
@@ -50,6 +51,8 @@ class LogisticZopSync implements ShouldQueue
     public function handle()
     {
         LogService::log(LogisticZopSync::class, "JOB-ZOP", $this->logistic_number);
+        //标记上有同步的操作
+        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]);

+ 29 - 3
app/OrderPackage.php

@@ -24,8 +24,29 @@ class OrderPackage extends Model
 
     use ModelTimeFormat;
 
-    protected $fillable = ['order_id','logistic_number','batch_number',
-        'batch_rule','bulk','weight','length','width','height','paper_box_id','measuring_machine_id','weighed_at','status','sent_at','received_at','exception','transfer_status','remark','owner_id','uploaded_to_wms','exception_type'];
+    protected $fillable = [
+        'order_id',
+        'logistic_number',
+        'batch_number',
+        'batch_rule',
+        'bulk',
+        'weight',
+        'length',
+        'width',
+        'height',
+        'paper_box_id',
+        'measuring_machine_id',
+        'weighed_at',
+        'status',
+        'sent_at',
+        'received_at',
+        'exception',
+        'transfer_status',
+        'owner_id',
+        'uploaded_to_wms',
+        'exception_type',
+        'sync_routes_flag',
+    ];
 
     public function order(){
         return $this->belongsTo('App\Order','order_id','id');
@@ -33,7 +54,7 @@ class OrderPackage extends Model
 
     protected $casts = [
         'transfer_status' => 'array',
-        'remark' => 'array',
+        'sync_routes_flag' => 'boolean',
     ];
 
     public function commodities(): HasMany
@@ -294,4 +315,9 @@ class OrderPackage extends Model
     {
         return $this->belongsTo(Owner::class);
     }
+
+    public function orderPackageRemarks(): HasMany
+    {
+        return $this->hasMany(OrderPackageRemark::class);
+    }
 }

+ 33 - 0
app/OrderPackageRemark.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class OrderPackageRemark extends Model
+{
+    use ModelLogChanging;
+    use SoftDeletes;
+    use ModelTimeFormat;
+
+    public $fillable = [
+        'order_package_id',
+        'user_id',
+        'content',
+    ];
+
+    public function orderPackage(): BelongsTo
+    {
+        return $this->belongsTo(OrderPackage::class);
+    }
+
+    public function user(): BelongsTo
+    {
+        return $this->belongsTo(User::class);
+    }
+}

+ 4 - 2
app/Providers/AppServiceProvider.php

@@ -167,6 +167,7 @@ use App\Services\RequirementService;
 use App\Services\RequirementUserService;
 use App\Services\WorkOrderService;
 use App\Services\WorkOrderTypeService;
+use App\Services\OrderPackageRemarkService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -239,9 +240,9 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('BatchService',BatchService::class);
         app()->singleton('BatchUpdateService', BatchUpdateService::class);
         app()->singleton('CacheService',CacheService::class);
-        app()->singleton('CityService',CityService::class);
         app()->singleton('CacheShelfService',CacheShelfService::class);
         app()->singleton('CheckActiveMenuService',CheckActiveMenuService::class);
+        app()->singleton('CityService',CityService::class);
         app()->singleton('CommodityBarcodeService',CommodityBarcodeService::class);
         app()->singleton('CommodityMaterialBoxModelService',CommodityMaterialBoxModelService::class);
         app()->singleton('CommodityService', CommodityService::class);
@@ -304,6 +305,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OrderPackageExceptionTypeCountingRecordService', OrderPackageExceptionTypeCountingRecordService::class);
         app()->singleton('OrderPackageReceivedSyncRecordService', OrderPackageReceivedSyncRecordService::class);
         app()->singleton('OrderPackageReceivedSyncService', OrderPackageReceivedSyncService::class);
+        app()->singleton('OrderPackageRemarkService',OrderPackageRemarkService::class);
         app()->singleton('OrderPackageService', OrderPackageService::class);
         app()->singleton('OrderService', OrderService::class);
         app()->singleton('OrderTrackingService', OrderTrackingService::class);
@@ -381,8 +383,8 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('UserWorkgroupService', UserWorkgroupService::class);
         app()->singleton('WarehouseService', WarehouseService::class);
         app()->singleton('WaybillFinancialService', WaybillFinancialService::class);
-        app()->singleton('WeighExceptedService', WeighExceptedService::class);
         app()->singleton('WaybillService', WaybillService::class);
+        app()->singleton('WeighExceptedService', WeighExceptedService::class);
         app()->singleton('WorkOrderService',WorkOrderService::class);
         app()->singleton('WorkOrderTypeService',WorkOrderTypeService::class);
     }

+ 13 - 0
app/Services/OrderPackageRemarkService.php

@@ -0,0 +1,13 @@
+<?php 
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\OrderPackageRemark;
+
+class OrderPackageRemarkService
+{
+    use ServiceAppAop;
+    protected $modelClass=OrderPackageRemark::class;
+
+}

+ 12 - 0
database/factories/OrderPackageRemarkFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OrderPackageRemark;
+use Faker\Generator as Faker;
+
+$factory->define(OrderPackageRemark::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 50 - 0
database/migrations/2021_08_18_111331_add_column_sync_routes_flag_to_order_packages_table.php

@@ -0,0 +1,50 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnSyncRoutesFlagToOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->boolean('sync_routes_flag')->default(false)->comment('是否有同步过信息');
+
+            $table->dropIndex('order_packages_sent_at_exception_index');
+            $table->dropIndex('order_packages_received_at_exception_index');
+            $table->dropIndex('order_packages_logistic_number_index');
+            $table->dropIndex('order_packages_sent_at_exception_type_owner_id_index');
+
+            $table->index(['sent_at','order_id','exception','exception_type','status','received_at','sync_routes_flag'],'order_packages_express_index');
+
+            $table->dropColumn('remark');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_packages', function (Blueprint $table) {
+            $table->dropColumn('sync_routes_flag');
+
+            $table->index(['sent_at', 'exception']);
+            $table->index(['received_at', 'exception']);
+            $table->index('logistic_number');
+            $table->index(['sent_at','exception_type','owner_id']);
+
+            $table->dropIndex('order_packages_express_index');
+
+            $table->text('remark')->comment('客服备注');
+        });
+    }
+}

+ 35 - 0
database/migrations/2021_08_18_141408_create_order_package_remarks_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderPackageRemarksTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_package_remarks', function (Blueprint $table) {
+            $table->id();
+            $table->integer('order_package_id')->index();
+            $table->integer('user_id')->index();
+            $table->string('content')->comment('内容');
+            $table->softDeletes();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_package_remarks');
+    }
+}

+ 16 - 0
database/seeds/OrderPackageRemarkSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class OrderPackageRemarkSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 146 - 30
resources/views/package/logistic/index.blade.php

@@ -1,8 +1,68 @@
 @extends('layouts.app')
 @section('title')快递查询-包裹管理@endsection
+@section('head')
+    <style>
+        /*备注容器*/
+        .order-package-remarks{
+            position:relative;
+        }
+        /*新建按钮*/
+        .btn-create-remark {
+            width: 25px;
+            height: 25px;
+            line-height: 25px;
+            text-align: center;
+            position: absolute;
+            display: none;
+            background-color: rgb(92, 141, 236);
+            border: blue solid 1px;
+            color: #111;
+            box-shadow: 0 0 6px #4747f1;
+            float: left;
+        }
+        .order-package-remarks:hover .btn-create-remark{
+            display: block;
+        }
+        /*新建输入框*/
+        .remark-input {
+            height: 30px;
+            line-height: 30px;
+            padding-left: 16px;
+            margin-left: 35px;
+            box-shadow: 0 0 6px #fff6a1;
+            border-radius: 5px;
+        }
+        /*删除按钮*/
+        .order-package-remarks table .destroy {
+            float: right;
+            position: absolute;
+            right: 0;
+            padding: 0 !important;
+            width: 29px !important;
+            min-width: 30px !important;
+            border: 0 solid transparent !important;
+        }
 
+        .remark-created_at{
+            border-right: none !important;
+        }
+
+        .btn-destroy-remark {
+            display: none;
+            background-color: rgba(0, 0, 0, 0);
+            border: red solid 1px;
+            color: red;
+            box-shadow: 0 0 6px #ac4a4a;
+        }
+
+        .order-package-remarks table:hover .btn-destroy-remark{
+            display: block;
+        }
+
+    </style>
+@stop
 @section('content')
-    <div id="list" class="d-none">
+    <div id="list" class="d-none package-logistic-index">
         <div class="container-fluid">
             <div id="form_div"></div>
             <div class="ml-3 form-inline" id="btn">
@@ -49,7 +109,14 @@
                     <td>
                         <input class="checkItem" type="checkbox" :value="package.logistic_number">
                     </td>
-                    <td><span>@{{ i+1 }} <span class="badge badge-danger" v-if="package.order.issue">问题件</span></span>
+                    <td>
+                        <span style="position:relative">
+                            @{{ i+1 }}
+                            <span class="badge badge-danger" v-if="package.order.issue">问题件</span>
+                            <span
+                                style="display: inline-block;width: 15px;height: 15px;border-radius: 50%;position: absolute;top: 2px; margin-left: 3px;box-shadow: 0 0 3px #211f1f"
+                                  :style="package.sync_routes_flag?'background-color:#4ed32d':'background-color:#e83939'"></span>
+                        </span>
                     </td>
                     <td>
                         <select class="form-control-sm" v-model="package.exception_type"
@@ -90,32 +157,38 @@
                             </label>
                         </div>
                     </td>
-                    <td @mouseover="remarkHover = package.id"
-                        @mouseleave="remarkHover=null;remark=null;isShowRemarkInput = false">
-                        @can('包裹管理-快递-客服备注')
-                            <button @click="isShowRemarkInput = true" v-if="remarkHover===package.id">新增</button>
-                            <input @keydown.enter="submitRemark(package)"
-                                   v-if="isShowRemarkInput && remarkHover===package.id" type="text" v-model="remark">
-                            <div v-if="package.remark && package.remark.length>0" :id="'remark-'+i">
-                                <div v-if="showRemarkList[i]" class="text-overflow-warp-200 up">
-                                    <p v-for="remark_item in package.remark">
-                                        @{{ remark_item }}
-                                    </p>
-                                </div>
-                                <div class="text-overflow-warp-200" v-else>
-                                    @{{ package.remark[0] }}
-                                </div>
-                            </div>
-                            <div @click="showRemarkItem(i)" v-if="package.remark && package.remark.length > 1">
-                                <label class="text-center mt-0 p-0 cursor-pointer pull-left">
+{{--                    @can('包裹管理-快递-客服备注')--}}
+                    <td  class="m-0 p-0 order-package-remarks" style="padding-left: 0 !important;padding-right: 0 !important">
+                        <label :for="'create_remark_'+package.id" class="btn-create-remark" @click="package.input_remark=!package.input_remark">
+                            新
+                        </label>
+                        <input :id="'create_remark_'+package.id" @keyup.enter="submitRemark(package)" v-model="remark" v-show="package.input_remark" type="text" class="remark-input">
+                       <table class="table m-0 p-0 ">
+                           <tr v-show="package.order_package_remarks.length > 0 && package.showMoreRemark===true" v-for="(item,index) of package.order_package_remarks" :key="item.id">
+                               <td :title="item.content" style="width: 100px;overflow:hidden !important;">@{{ item.content }}</td>
+                               <td class="text-secondary">@{{ item.user.name }}</td>
+                               <td class="text-secondary remark-created_at">@{{ item.created_at }}</td>
+                               <td class="destroy"><button   class="btn-destroy-remark" @click="destroyRemark(package,item.id)">删</button></td>
+                           </tr>
+                           <tr v-show="(!package.showMoreRemark) && package.order_package_remarks.length > 0" >
+                               <td :title="package.order_package_remarks[0]? package.order_package_remarks[0].content:''" style="width: 100px;overflow:hidden !important;">@{{ package.order_package_remarks[0]?package.order_package_remarks[0].content:'' }}</td>
+                               <td class="text-secondary">@{{ package.order_package_remarks[0]?package.order_package_remarks[0].user.name:'' }}</td>
+                               <td class="text-secondary remark-created_at">@{{ package.order_package_remarks[0]?package.order_package_remarks[0].created_at:'' }}</td>
+                               <td class="destroy"><button   class="btn-destroy-remark" @click="destroyRemark(package,package.order_package_remarks[0].id)">删</button></td>
+                           </tr>
+                       </table>
+                        <div
+                            class="float-left"
+                            @click="package.showMoreRemark = !package.showMoreRemark" v-show="package.order_package_remarks && package.order_package_remarks.length > 1">
+                            <label class="text-center mt-0 p-0 cursor-pointer pull-left">
                                 <span class="fa"
-                                      :class="package.isShowRemark ? 'fa-angle-double-down' : 'fa-angle-double-right'"></span>
-                                    &nbsp;<span v-if="package.remark && showRemarkList[i]">收起</span><span
-                                        v-else>展开</span>&nbsp;@{{ package.remark.length }} 条
-                                </label>
-                            </div>
-                        @endcan
+                                      :class="package.showMoreRemark ? 'fa-angle-double-down' : 'fa-angle-double-right'"></span>
+                                &nbsp;<span v-if="package.order_package_remarks && package.showMoreRemark">收起</span><span
+                                    v-else>展开</span>&nbsp;@{{ package.order_package_remarks.length }} 条
+                            </label>
+                        </div>
                     </td>
+{{--                    @endcan--}}
                     <td class="text-overflow-warp-200"><span v-if="package.order && package.order.issue">@{{ package.order.issue.result_explain }}</span>
                     </td>
                     <td class="text-overflow-warp-200"><span
@@ -250,7 +323,9 @@
                             placeholder: '是否有物流信息',
                             data: [{name: '是', value: '是'}, {name: '否', value: '否'}]
                         },
+
                         {name: 'default_date', type: 'checkbox', tip: '默认15天', data: [{name: 'ture', value: '默认15天'}]},
+                        {name: 'default_logistics', type: 'checkbox', tip: '默认承运商', data: [{name: 'ture', value: '默认承运商'}]},
 
                     ], [
                         {
@@ -279,9 +354,9 @@
 
                         {
                             name: 'exception_type',
-                            type: 'select',
+                            type: 'select_multiple_select',
                             tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
-                            placeholder: '异常类型',
+                            placeholder: ['异常类型', '定位或多选异常类型'],
                             data: [
                                 {name: '疑似库内丢件', value: '疑似库内丢件'},
                                 {name: '揽件异常', value: '揽件异常'},
@@ -292,6 +367,21 @@
                                 {name: '无', value: '无'}
                             ]
                         },
+                        {
+                            name: 'is_issue',
+                            type: 'select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
+                            placeholder: '是否为问题件',
+                            data: [{name: '是', value: '是'}, {name: '否', value: '否'}]
+                        },
+
+                        {
+                            name: 'sync_routes_flag',
+                            type: 'select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
+                            placeholder: '是否有查询记录',
+                            data: [{name: true, value: '是'}, {name: false, value: '否'}]
+                        },
                     ]
                 ];
                 _this.form = new query({
@@ -390,9 +480,35 @@
                     }
                     let url = '{{url('apiLocal/package/logistic/')}}';
                     let _this = this;
-                    axios.put(url, {remark: _this.remark, orderPackageId: orderPackage.id}).then(function (response) {
+                    tempTip.setDuration(2000);
+                    tempTip.showSuccess('正在操作请稍后!');
+                    axios.put(url, {remark: _this.remark, orderPackageId: orderPackage.id}).then(response=>{
+                        if (response.data.success) {
+                            orderPackage.order_package_remarks = response.data.data
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('成功!');
+                            _this.remark = '';
+                            orderPackage.input_remark = false;
+                        } else {
+                            tempTip.setDuration(5000);
+                            tempTip.show(response.data.fail_info);
+                        }
+                    }).catch(function (err) {
+                        tempTip.setDuration(3000);
+                        tempTip.show("网络错误:" + err)
+                    });
+                },
+                destroyRemark(orderPackage,remarkId) {
+                    let url = '{{url('apiLocal/package/logistic/delete')}}';
+                    if (!confirm('是否却认删除', false)) {
+                        return;
+                    };
+                    let _this = this;
+                    tempTip.setDuration(2000);
+                    tempTip.showSuccess('正在操作请稍后!');
+                    axios.post(url, {orderPackageId: orderPackage.id,remarkId:remarkId}).then(response=>{
                         if (response.data.success) {
-                            orderPackage.remark = response.data.data
+                            orderPackage.order_package_remarks = response.data.data
                             tempTip.setDuration(2000);
                             tempTip.showSuccess('成功!');
                         } else {

+ 1 - 0
routes/apiLocal.php

@@ -222,6 +222,7 @@ Route::group(['prefix' => 'station'],function(){
 /** 包裹 */
 Route::group(['prefix' => 'package'], function () {
     Route::put('logistic', 'OrderPackageController@update')->name('orderPackage.update');
+    Route::post('logistic/delete', 'OrderPackageController@destroy')->name('orderPackage.destroy');
 });
 /** 快递打印 */
 Route::group(['prefix' => 'print'],function (){

+ 1 - 1
tests/Feature/LogisticZopSyncTest.php

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