Просмотр исходного кода

Merge branch 'work_order_4' into zengjun

ajun 4 лет назад
Родитель
Сommit
be8f3bc8f3

+ 3 - 1
app/Filters/WorkOrderFilters.php

@@ -78,8 +78,10 @@ class WorkOrderFilters
         // 审核 默认为 待审核
         if (isset($this->params['is_review'])){
             $this->queryBuilder->where('status','2');
+            $this->queryBuilder->whereHas('orderIssue');
         } else {
-            $this->queryBuilder->where('status','1');
+            $work_order_query = WorkOrder::query()->select('id')->where('status','2')->whereHas('orderIssue');
+            $this->queryBuilder->whereNotIn('id',$work_order_query);
         }
     }
 

+ 2 - 7
app/Http/Controllers/WorkOrderController.php

@@ -15,20 +15,15 @@ use Illuminate\Support\Facades\Gate;
 class WorkOrderController extends Controller
 {
 
-    const ORDER_ISSUE_TYPES = 'orderIssueTypes';
-
     public function index(Request $request, WorkOrderFilters $filters, WorkOrderService $service)
     {
         if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
 
-        $workOrders = WorkOrder::query()->filter($filters)->with(['type', 'creator', 'order' => function ($query) {
-            /** @var $query Builder */
-            $query->with('packages', 'issue', 'logistic');
-        }, 'reviewer','issueType'])->orderByDesc(  'status')->paginate($request['paginate'] ?? 50);
+        $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderBy('created_at')->orderByDesc('status')->paginate($request['paginate'] ?? 50);
         $logistics = Logistic::all();
         $orderIssueTypes = OrderIssueType::all();
         $service->tags($workOrders);
-        return view('order.workOrder.index', compact('workOrders', 'logistics', '' . self::ORDER_ISSUE_TYPES . ''));
+        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes'));
     }
 
     // 审核 api

+ 41 - 0
app/WorkOrder.php

@@ -3,11 +3,13 @@
 namespace App;
 
 use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Facades\Gate;
 
 class WorkOrder extends Model
 {
@@ -115,9 +117,48 @@ class WorkOrder extends Model
         return $this->belongsTo(OrderIssueType::class,'order_issue_type_id');
     }
 
+    /** 对应问题件 */
+    public function orderIssue(): BelongsTo
+    {
+        return $this->belongsTo(OrderIssue::class,'order_id','order_id');
+    }
+
     public function scopeFilter($query, $filters)
     {
         return $filters->apply($query);
     }
 
+
+    /** 默认 with 参数 */
+    public function scopeDefaultWith($query)
+    {
+        $query->with(['type','issueType','creator','reviewer','order'=>function($query){
+            /** @var $query Builder */
+            $query->with('packages','logistic');
+        },'orderIssue'=>function($query){
+            /** @var $query Builder */
+            $query->with(['issueType','logs'=>function($query){
+                if (Gate::denies('订单管理-问题件-客户不可见')){
+                    $query->with('user')->orderByDesc('created_at');
+                } else{
+                    $query->with('user')->where('tag','=',0)->orderByDesc('created_at');
+                }
+            }]);
+        }]);
+
+        $query->with(['type', 'creator', 'order' => function ($query) {
+            /** @var $query Builder */
+            $query->with(['packages', 'issue'=>function($query){
+                /** @var $query Builder */
+                $query->with(['issueType','logs'=>function($query){
+                    if (Gate::denies('订单管理-问题件-客户不可见')){
+                        $query->with('user')->orderByDesc('created_at');
+                    } else{
+                        $query->with('user')->where('tag','=',0)->orderByDesc('created_at');
+                    }
+                }]);
+            }, 'logistic']);
+        }, 'reviewer','issueType']);
+    }
+
 }

+ 145 - 70
resources/views/order/workOrder/index.blade.php

@@ -15,16 +15,9 @@
                     @can('订单管理-订单问题件生成')
                         <span class="ml-1">
                        <button type="button" class="btn btn-outline-primary btn-sm form-control-sm  tooltipTarget"
-                               @click="interceptMessage()">拦截导出</button>
+                               @click="exportText()">导出文本</button>
                        </span>
                     @endcan
-                    @can('订单管理-订单问题件生成')
-                        <span class="ml-1">
-                       <button type="button" class="btn btn-outline-primary btn-sm form-control-sm  tooltipTarget"
-                               @click="modificationMessage()">信息修改导出</button>
-                       </span>
-                    @endcan
-
                     @can('订单管理-工单处理-审核')
                         <span class="ml-1">
                         <button type="button" class="btn btn-outline-success btn-sm form-control-sm  tooltipTarget"
@@ -48,22 +41,6 @@
                                     <span>@{{ i+1 }}</span>
                                     <span v-show="item.is_issue_order" class="badge badge-primary">问题件</span>
                                 </td>
-                                <td class="text-center">
-                                    <template v-if="item.status === '已处理'">
-                                        <h5><span class="badge badge-secondary"
-                                                  style="opacity: 0.7">@{{ item.grad }}</span></h5>
-                                    </template>
-                                    <template v-else>
-                                        <h5><span class="badge badge-light" style="opacity: 0.7"
-                                                  v-if="item.grad === '一般'">@{{ item.grad }}</span></h5>
-                                        <h5><span class="badge badge-primary" style="opacity: 0.7"
-                                                  v-if="item.grad === '重要'">@{{ item.grad }}</span></h5>
-                                        <h5><span class="badge badge-warning" style="opacity: 0.7"
-                                                  v-if="item.grad === '紧急'">@{{ item.grad }}</span></h5>
-                                        <h5><span class="badge badge-danger" style="opacity: 0.7"
-                                                  v-if="item.grad === '重要且紧急'">@{{ item.grad }}</span></h5>
-                                    </template>
-                                </td>
                                 <td class="text-center">
                                     @can('订单管理-订单问题件生成')
                                         <button class="btn btn-sm btn-outline-primary" @click="createOrderIssue(item,true)" v-show="!item.is_issue_order ">
@@ -77,6 +54,7 @@
                                     @endcan
                                 </td>
                                 <td>@{{item.type ? item.type.name : '' }}</td>
+                                <td class="text-center">@{{ item.status }}</td>
                                 <td>@{{item.order ? (item.order.logistic ? item.order.logistic.name : '') : '' }}</td>
                                 <td class="text-center">
                                     <template v-if="item.order">
@@ -119,7 +97,54 @@
                                     @endcan
                                 </td>
                                 <td class="text-center">@{{ item.remark }}</td>
-                                <td class="text-center">@{{ item.status }}</td>
+
+                                <td class="text-center">
+                                        @{{ item.result_explain ?item.result_explain : '' }}
+                                </td>
+                                <td class="text-center">
+                                    @{{ item.issue_order_type ?item.issue_order_type : '' }}
+                                </td>
+                                <td class="text-center p-0">
+                                    <template v-if="item.issue_logs">
+                                        <template v-if="item.issue_logs.length === 1">
+                                            <table class="table table-sm m-0">
+                                                <tr class="table table-sm">
+                                                    <td>@{{ item.issue_logs[0].content }}</td>
+                                                    <td>@{{ item.issue_logs[0].username }}</td>
+                                                    <td>@{{ item.issue_logs[0].created_at }}</td>
+                                                </tr>
+                                            </table>
+                                        </template>
+                                        <template v-else>
+                                            <transition name="fade">
+                                            <table class="table table-sm m-0" v-if="selectOrderIssue === item.id">
+
+                                                    <tr v-for="log in item.issue_logs">
+                                                        <td>@{{ log.content }}</td>
+                                                        <td>@{{ log.username }}</td>
+                                                        <td>@{{ log.created_at }}</td>
+                                                    </tr>
+                                            </table>
+                                            </transition>
+                                            <transition name="fade">
+                                            <table class="table table-sm m-0" v-if="electOrderIssue !== item.id">
+                                                <tr>
+                                                <td>@{{ item.issue_logs[0].content }}</td>
+                                                <td>@{{ item.issue_logs[0].username }}</td>
+                                                <td>@{{ item.issue_logs[0].created_at }}</td>
+                                                </tr>
+                                            </table>
+                                            </transition>
+                                            <button class="btn btn-sm btn-outline-primary"
+                                                    v-show="selectOrderIssue !== item.id"
+                                                    @click="selectOrderIssue = item.id">展开
+                                            </button>
+                                            <button class="btn btn-sm btn-outline-primary" v-show="selectOrderIssue === item.id"
+                                                    @click="selectOrderIssue = null">收起
+                                            </button>
+                                        </template>
+                                    </template>
+                                </td>
                                 <td class="text-center">
                                     <template v-if="item.review_at">
                                         <div v-if="item.order && item.order.packages">
@@ -169,6 +194,14 @@
 @section("lastScript")
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header.js')}}"></script>
+    <style>
+        .fade-enter-active, .fade-leave-active {
+            transition: opacity .5s;
+        }
+        .fade-enter, .fade-leave-to  {
+            opacity: 0;
+        }
+    </style>
     <script>
         let list = new Vue({
             el: "#list",
@@ -190,6 +223,7 @@
                 ],
                 selectOrderPackage: null,
                 selectOrder: null,
+                selectOrderIssue:null,
             },
             mounted() {
                 console.log();
@@ -230,14 +264,20 @@
                 this.form.init();
                 let column = [
                     {name: 'no', value: '序号', neglect: true},
-                    {name: 'grad', value: '工单等级'},
                     {name: 'operation', value: '操作', neglect: true},
                     {name: 'type', value: '相关类型'},
+                    {name: 'status', value: '状态'},
                     {name: 'logisticName', value: '承运商'},
                     {name: 'logisticNumber', value: '快递单号'},
-                    {name: 'orderIssueType', value: '问题件类型'},
+                    {name: 'issueType', value: '问题件类型'},
                     {name: 'workOrderInfo', value: '问题描述'},
-                    {name: 'status', value: '状态', neglect: true},
+                    {name:'result_explain',value:'情况说明'},
+                    {name:'orderIssueType',value:'问题件类别'},
+                    {name:'orderIssueProcessLogs',type:'multi',title:"处理结果",rows:[
+                            {value:"内容",col:"4"},
+                            {value:"操作人",col:"4"},
+                            {value:"时间",col:"4"},
+                    ]},
                     {name: 'Info', value: '物流跟踪信息', neglect: true},
                     {name: 'creator', value: '创建人'},
                     {name: 'submit_at', value: '提交时间'},
@@ -266,6 +306,21 @@
                 sortOrder(workOrder) {
                     let self = this;
                     if (!workOrder.order) return;
+                    if (workOrder.order_issue){
+                        workOrder.result_explain = workOrder.order_issue.result_explain;
+                        if (workOrder.order_issue.issue_type){
+                            workOrder.issue_order_type = workOrder.order_issue.issue_type.name;
+                        }
+                        if (workOrder.order_issue.logs){
+                            workOrder.issue_logs  = workOrder.order_issue.logs.map(item=>{
+                                return {
+                                    username : item.user ? item.user.name : '',
+                                    content: item.content,
+                                    created_at : item.created_at
+                                };
+                            });
+                        }
+                    }
                     if (!workOrder.order.packages) return;
                     $.each(workOrder.order.packages, function (i, item) {
                         self.sortTransfer(item);
@@ -331,57 +386,77 @@
                         return null;
                     }
                     return this.workOrders.filter((item) => {
+                        if (!item.order) return false;
+                        if (!item.order.packages) return false;
                         return selected.includes(item.id + '');
                     });
                 },
-                interceptMessage() {
-                    let selectItems = this.getMessageWorkOrder();
-                    if (selectItems === null) return;
-                    let zto_and_sf = '';
-                    let rest_logistic = '';
-                    selectItems.forEach(item => {
-                        // 中通、顺丰
-                        if (item.order.logistic.code.includes('SF') || item.order.logistic.code.includes('ZTO')) {
-                            item.order.packages.forEach(node => {
-                                zto_and_sf += node.logistic_number + '\n';
-                            });
-                        } else {
-                            let item_order_logistic_name = item.order.logistic.name;
-                            let item_order_adder = item.order.consignee_name + ' '
-                                + item.order.consignee_phone + ' '
-                                // + item.order.province + ' ' + item.order.city + ' ' + item.order.district
-                                + ' ' + item.order.address;
-                            item.order.packages.forEach(node => {
-                                rest_logistic += item_order_logistic_name + ' ' + node.logistic_number + ' ' + item_order_adder + ' ——拦截\n';
-                            });
-                        }
+                exportText(){
+                    let items = this.getMessageWorkOrder();
+                    if (items == null) return ;
+                    let text = '';
+                    items.forEach(item=>{
+                        if (item.order) text += this.getExportText(item);
                     });
-                    let text = zto_and_sf.trim('\n') + ' ——拦截' + '\n';
-                    text += rest_logistic;
+                    console.log(text);
                     this.copyText(text);
                 },
-                modificationMessage() {
-                    let selectItems = this.getMessageWorkOrder();
-                    if (selectItems === null) return;
-                    let zto = '';
-                    let sf = '';
-                    let rest_logistic = '';
-                    selectItems.forEach(item => {
-                        let logistic_code = item.order.logistic.code;
-                        let adder = item.order.consignee_name + ' ' + item.order.consignee_phone + ' '
-                            + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
+                getExportText(item){
+                    if (!item.order) return '';
+                    if (!item.order.packages) return '';
+                    switch (item.issue_order_type){
+                        case '拦截':
+                            return this.interceptMessage(item);
+                        case '信息修改':
+                            return this.modificationMessage(item);
+                        default :
+                            return  this.getMessage(item);
+                    }
+                },
+                interceptMessage(item) {
+                    let message  = '';
+                    if (item.order.logistic.code.includes('SF') || item.order.logistic.code.includes('ZTO')) {
                         item.order.packages.forEach(node => {
-                            if (logistic_code.includes('SF')) { // 顺丰订单
-                                sf += node.logistic_number + ' ——改信息: ' + item.remark + ',运费到付或月结' + '\n';
-                            } else if (logistic_code.includes('ZTO')) {
-                                zto += node.logistic_number + ' ——改信息:' + item.remark + '\n';
-                            } else {
-                                rest_logistic += node.logistic_number + ' ' + adder + ' ——改地址' + item.remark + '\n';
-                            }
+                            message += node.logistic_number + '\n';
+                        });
+                        message += message.trim('\n') +  ' ——拦截\n';
+                    } else {
+                        let item_order_logistic_name = item.order.logistic.name;
+                        let item_order_adder = item.order.consignee_name + ' '
+                            + item.order.consignee_phone + ' '
+                            + ' ' + item.order.address;
+                        item.order.packages.forEach(p => {
+                            if (p) message += item_order_logistic_name + ' ' + p.logistic_number + ' ' + item_order_adder + '\n';
                         });
+                        message += message.trim('\n') +  ' ——拦截\n';
+                    }
+                    return message;
+                },
+                modificationMessage(item) {
+                    let message = '';
+                    let logistic_code = item.order.logistic.code;
+                    let adder = item.order.consignee_name + ' ' + item.order.consignee_phone + ' '
+                        + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
+                    item.order.packages.forEach(node => {
+                        if (logistic_code.includes('SF')) { // 顺丰订单
+                            message += node.logistic_number + ' ——改信息: ' + item.remark + ',运费到付或月结' + '\n';
+                        } else if (logistic_code.includes('ZTO')) {
+                            message += node.logistic_number + ' ——改信息:' + item.remark + '\n';
+                        } else {
+                            message += node.logistic_number + ' ' + adder + ' ——改地址' + item.remark + '\n';
+                        }
                     });
-                    let text = sf + zto + rest_logistic;
-                    this.copyText(text);
+                    return message;
+                },
+                getMessage(item){
+                    let message = '';
+                    if (!item.order.packages) return message;
+                    let adder = item.order.consignee_name + ' ' + item.order.consignee_phone + ' '
+                        + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
+                    item.order.packages.forEach(p=>{
+                        message+= p.logistic_number + '  '+ adder + ' ——描述 '+itemremark+'\n';
+                    });
+                    return message;
                 },
                 copyText(text) {
                     let ele = document.querySelector('#copy_text');