Преглед изворни кода

ID 251
快递包裹系统,按吴娜截图增加“导出”(和其他模块一样的导出功能),“复制单号”(复制勾选的单号至剪贴板,换行分隔),“批量状态修改”(将目前已有状态可以按勾选的批量修改)

ANG YU пре 4 година
родитељ
комит
1a68838049

+ 76 - 4
app/Http/Controllers/PackageLogisticController.php

@@ -3,12 +3,13 @@
 namespace App\Http\Controllers;
 
 use App\Events\UpdateOrderPackageExceptionListenerEvent;
+use App\Exceptions\Exception;
 use App\Filters\OrderPackageFilters;
 use App\Logistic;
 use App\OrderPackage;
 use App\Owner;
+use App\Services\common\ExportService;
 use App\Services\UserService;
-use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 
 class PackageLogisticController extends Controller
@@ -30,7 +31,7 @@ class PackageLogisticController extends Controller
         $orderPackages = OrderPackage::query()
             ->filter($filters)
             ->whereIn('owner_id', $owner_ids)->with(['order.logistic', 'order.owner', 'order.issue' => function ($query) {
-                $query->with(['issueType', 'logs'=>function($query) {
+                $query->with(['issueType', 'logs' => function ($query) {
                     $query->with('user')->orderBy('created_at', 'DESC');
                 }]);
             }])->orderByDesc('id')->paginate($request->paginate ?? 50);
@@ -56,14 +57,14 @@ class PackageLogisticController extends Controller
     public function batchUpdate(Request $request)
     {
         $data = [];
-        if (array_key_exists('exception_type',$request->all())) {
+        if (array_key_exists('exception_type', $request->all())) {
             if ('无' == $request->input('exception_type')) {
                 $data['exception_type'] = $request->input('exception_type');
                 $data['exception'] = "否";
             } else {
                 $data['exception_type'] = $request->input('exception_type');
             }
-        }else if (array_key_exists('status',$request->all())) {
+        } else if (array_key_exists('status', $request->all())) {
             $data['status'] = $request->input('status');
         }
         $logistic_numbers = $request->input('logistic_numbers');
@@ -71,4 +72,75 @@ class PackageLogisticController extends Controller
         //更新统计数据
         event(new UpdateOrderPackageExceptionListenerEvent($logistic_numbers));
     }
+
+    /**
+     * @throws Exception
+     */
+    public function export(Request $request, OrderPackageFilters $filters)
+    {
+        /** @var UserService $userService */
+        $userService = app('UserService');
+        $owner_ids = $userService->getPermittingOwnerIds(auth()->user());
+        $query = OrderPackage::query()
+            ->filter($filters)
+            ->whereIn('owner_id', $owner_ids)
+            ->with(['order.logistic', 'order.owner', 'order.issue' => function ($query) {
+                $query->with(['issueType', 'logs' => function ($query) {
+                    $query->with('user')->orderBy('created_at', 'DESC');
+                }]);
+            }]);
+        if ($request->exists('checkAllSign')) {
+            $orderPackages = $query->orderByDesc('id')->get();
+        } else {
+            $orderPackages = $query
+                ->whereIn('logistic_number', explode(',', $request['data']))
+                ->orderByDesc('id')->get();
+        }
+        $row = ["异常类型", "单号", "状态", "快递公司", "货主", "省份", "发出日期", "收货日期", "称重日期", "快递路由", "客服备注", "情况说明", "问题类别", "说明", "操作者", "时间",];
+        $json = [];
+        foreach ($orderPackages as $orderPackage) {
+            $transfer_status = "";
+            if (is_array($orderPackage->transfer_status) && !empty($orderPackage->transfer_status)) {
+                foreach ($orderPackage->transfer_status as $transfer) {
+                    $transferItemStr = "";
+                    $transferItemStr = $transferItemStr . $transfer['accept_address'] . "   " . $transfer['remark'] . "   " . $transfer['accept_time'];
+                    $transfer_status = $transfer_status . $transferItemStr . ",\r\n";
+                }
+            }
+            $remark = "";
+            if (is_array($orderPackage->remark) && !empty($orderPackage->remark)) {
+                foreach ($orderPackage->remark as $remarkItem) {
+                    $remark = $remark . $remarkItem . ",\r\n";
+                }
+            }
+            $logsContent = "";
+            $users = "";
+            $logCreatedAt = "";
+            if ($orderPackage->order && $orderPackage->order->issue) {
+                foreach ($orderPackage->order->issue->logs as $log) {
+                    $logsContent = $logsContent . $log->content . ",\r\n";
+                    $users = $users . $log->user->name . ",\r\n";
+                    $logCreatedAt = $logCreatedAt . $log->created_at . ",\r\n";
+                }
+            }
+            $data = [
+                $orderPackage->exception_type,
+                $orderPackage->logistic_number,
+                $orderPackage->status,
+                $orderPackage->order->logistic->name,
+                $orderPackage->order->owner->name,
+                $orderPackage->order->province,
+                $orderPackage->sent_at,
+                $orderPackage->received_at,
+                $orderPackage->weighed_at,
+                $transfer_status,
+                $remark,
+                $logsContent,
+                $users,
+                $logCreatedAt,
+            ];
+            $json[] = $data;
+        }
+        return app(ExportService::class)->json($row, $json, "包裹快递");
+    }
 }

+ 1 - 1
app/Services/OrderPackageReceivedSyncService.php

@@ -138,7 +138,7 @@ class OrderPackageReceivedSyncService
             if (isset($data['status'])) $orderPackage->status = $data['status'];
             if (isset($data['received_at'])) $orderPackage->received_at = $data['received_at'];
             if (isset($data['exception'])) $orderPackage->exception = $data['exception'];
-            if (isset($data['transfer_status'])) $orderPackage->transfer_status = $data['transfer_status'];
+            if (isset($data['transfer_status'])&&!empty($data['transfer_status'])) $orderPackage->transfer_status = $data['transfer_status'];
             if (isset($data['exception_type'])) $orderPackage->exception_type = $data['exception_type'];
             $orderPackage->save();
         }

+ 113 - 66
resources/views/package/logistic/index.blade.php

@@ -10,22 +10,40 @@
             <div id="form_div"></div>
             <div class="form-inline" id="btn">
                 @can('包裹管理-快递-异常类型-编辑')
-                    <select class="form-control-sm" v-model="batchExceptionType">
-                        <option v-for="(value,index) in exception_types" :value="value"
-                                :name="value" :key="index">@{{ value }}
-                        </option>
-                    </select>
-                    <button @click="batchExceptionTypeUpdate()" type="button"
-                            class="btn btn-sm ml-2 btn-outline-primary">批量异常状态修改
-                    </button>
-                    <select class="form-control-sm ml-2" v-model="batchStatus">
-                        <option v-for="(value,index) in statuses" :value="value"
-                                :name="value" :key="index">@{{ value }}
-                        </option>
-                    </select>
-                    <button @click="batchStatusUpdate()" type="button"
-                            class="btn btn-sm ml-2 btn-outline-danger">批量状态修改
-                    </button>
+                    <span class="dropdown ml-1">
+                        <button type="button"
+                                class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
+                                data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">导出Excel
+                        </button>
+                        <div class="dropdown-menu">
+                            <a class="dropdown-item" @click="orderPackageExport(false)" href="javascript:">导出勾选内容</a>
+                            <a class="dropdown-item" @click="orderPackageExport(true)" href="javascript:">导出所有页</a>
+                        </div>
+                    </span>
+                    <span class="ml-1">
+                        <select class="form-control-sm" v-model="batchExceptionType">
+                            <option v-for="(value,index) in exception_types" :value="value"
+                                    :name="value" :key="index">@{{ value }}
+                            </option>
+                        </select>
+                        <button @click="batchExceptionTypeUpdate()" type="button"
+                                class="btn btn-sm ml-2 btn-outline-primary">批量异常状态修改
+                        </button>
+                    </span>
+                    <span class="ml-1">
+                        <select class="form-control-sm ml-2" v-model="batchStatus">
+                            <option v-for="(value,index) in statuses" :value="value"
+                                    :name="value" :key="index">@{{ value }}
+                            </option>
+                        </select>
+                        <button @click="batchStatusUpdate()" type="button"
+                                class="btn btn-sm ml-2 btn-outline-danger">批量状态修改
+                        </button>
+                    </span>
+                    <span class="ml-1">
+                        <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget"
+                                @click="copyLogisticNumber" style="background: #dad7e8;">复制快递单号</button>
+                    </span>
                 @endcan
             </div>
             <table class="table table-striped table-sm text-nowrap table-hover" id="table">
@@ -34,7 +52,8 @@
                     <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>
+                    <td><span>@{{ i+1 }} <span class="badge badge-danger" v-if="package.order.issue">问题件</span></span>
+                    </td>
                     <td>
                         <select class="form-control-sm" v-model="package.exception_type"
                                 @change="package.showEditButton = true">
@@ -74,28 +93,30 @@
                             </label>
                         </div>
                     </td>
-                    <td @mouseover="remarkHover = package.id" @mouseleave="remarkHover=null;remark=null;isShowRemarkInput = false">
+                    <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>
+                            <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 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">
+                            <div @click="showRemarkItem(i)" v-if="package.remark && package.remark.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>
+                                    &nbsp;<span v-if="package.remark && showRemarkList[i]">收起</span><span
+                                        v-else>展开</span>&nbsp;@{{ package.remark.length }} 条
+                                </label>
+                            </div>
                         @endcan
                     </td>
                     <td class="text-overflow-warp-200"><span v-if="package.order && package.order.issue">@{{ package.order.issue.result_explain }}</span>
@@ -117,10 +138,12 @@
             <div class="text-info h5 btn btn">{{$orderPackages->count()}}/{{$orderPackages->total()}}</div>
             {{$orderPackages->appends($paginateParams)->links()}}
         </div>
+        <textarea id="clipboardDiv" style="opacity:0"></textarea>
     </div>
 @endsection
 
 @section('lastScript')
+    <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
     <script>
@@ -159,8 +182,8 @@
                     '无',
                 ],
                 statuses: [
-                  '已揽收',
-                  '无',
+                    '已揽收',
+                    '无',
                 ],
                 exception_editable: @can('包裹管理-快递-异常类型-编辑') true @else false  @endcan,
                 selectedExceptionType: '修改异常类型',
@@ -280,31 +303,31 @@
                 });
                 _this.form.init();
                 let column = [
-                    {name:'index',value: '序号', neglect: true},
-                    {name:'exception_type',value: '异常类型'},
-                    {name:'logistic_number',value: '单号'},
-                    {name:'status',value: '状态'},
-                    {name:'logistic_name',value: '快递公司'},
-                    {name:'owner_name',value: '货主'},
-                    {name:'province',value: '省份'},
-                    {name:'sent_at',value: '发出日期'},
-                    {name:'received_at',value: '收货日期'},
-                    {name:'weighed_at',value: '称重日期'},
-                    {name:'transfer_status',value: '快递路由'},
-                    {name:'remark',value: '客服备注'},
-                    {name:'result_explain',value: '情况说明'},
-                    {name:'issue_type',value: '问题类别'},
-                    {name:'content',value: '说明'},
-                    {name:'operation_name',value: '操作者'},
-                    {name:'operation_date',value: '时间'},
+                    {name: 'index', value: '序号', neglect: true},
+                    {name: 'exception_type', value: '异常类型'},
+                    {name: 'logistic_number', value: '单号'},
+                    {name: 'status', value: '状态'},
+                    {name: 'logistic_name', value: '快递公司'},
+                    {name: 'owner_name', value: '货主'},
+                    {name: 'province', value: '省份'},
+                    {name: 'sent_at', value: '发出日期'},
+                    {name: 'received_at', value: '收货日期'},
+                    {name: 'weighed_at', value: '称重日期'},
+                    {name: 'transfer_status', value: '快递路由'},
+                    {name: 'remark', value: '客服备注'},
+                    {name: 'result_explain', value: '情况说明'},
+                    {name: 'issue_type', value: '问题类别'},
+                    {name: 'content', value: '说明'},
+                    {name: 'operation_name', value: '操作者'},
+                    {name: 'operation_date', value: '时间'},
                 ];
                 new Header({
                     el: "table",
-                    name:"package",
+                    name: "package",
                     column: column,
                     data: this.packages,
                     restorationColumn: 'addtime',
-                    fixedTop:($('#form_div').height())+($('#btn').height())+1,
+                    fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
                 }).init();
             },
             methods: {
@@ -364,30 +387,54 @@
                     })
                 },
                 submitRemark(orderPackage) {
-                    if (this.remark===null){
+                    if (this.remark === null) {
                         return
                     }
                     let url = '{{url('apiLocal/package/logistic/')}}';
                     let _this = this;
-                    axios.put(url,{remark:_this.remark,orderPackageId:orderPackage.id}).then(function (response) {
-                        if (response.data.success){
+                    axios.put(url, {remark: _this.remark, orderPackageId: orderPackage.id}).then(function (response) {
+                        if (response.data.success) {
                             orderPackage.remark = response.data.data
                             tempTip.setDuration(2000);
                             tempTip.showSuccess('成功!');
-                        } else{
+                        } else {
                             tempTip.setDuration(5000);
                             tempTip.show(response.data.fail_info);
                         }
                     }).catch(function (err) {
                         tempTip.setDuration(3000);
-                        tempTip.show("网络错误:"+err)
+                        tempTip.show("网络错误:" + err)
                     });
                 },
-                {{--orderPackageExport(checkAllSign){--}}
-                {{--    let url = '{{url('package/logistic/export')}}';--}}
-                {{--    let token='{{ csrf_token() }}';--}}
-                {{--    excelExport(checkAllSign,checkData,url,this.packages.length,token,{is_merge : this.is_merge});--}}
-                {{--},--}}
+                copyLogisticNumber() {
+                    if (checkData.length === 0) {
+                        tempTip.show('没有勾选');
+                        return;
+                    }
+                    this.copyText(checkData.join('\n'));
+                },
+                copyText(text) {
+                    try {
+                        $('#clipboardDiv').text(text).select().focus();
+                        document.execCommand("Copy");
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制成功')
+                    } catch (e) {
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制失败:' + e)
+                    }
+                },
+                orderPackageExport(sign) {
+                    let url = '{{url('package/logistic/export')}}';
+                    let token = '{{ csrf_token() }}';
+                    if (sign) {
+                        excelExport(true, checkData, url, this.total, token);
+                    } else {
+                        excelExport(false, checkData, url, null, token);
+                    }
+                },
             },
             filters: {
                 toObjected: function (value) {

+ 1 - 0
routes/web.php

@@ -396,6 +396,7 @@ Route::group(['prefix'=>'package'],function(){
     Route::get('weigh/index','WeighController@index');
     Route::resource('weigh','WeighController');
     Route::put('logistic/batchUpdate','PackageLogisticController@batchUpdate');
+    Route::any('logistic/export','PackageLogisticController@export');
     Route::resource('logistic','PackageLogisticController');
 });
 Route::resource('package','WeighController');