Przeglądaj źródła

Merge branch 'work_order_3' into zengjun

ajun 4 lat temu
rodzic
commit
d7633e9d78

+ 60 - 5
app/Filters/WorkOrderFilters.php

@@ -4,8 +4,11 @@
 namespace App\Filters;
 
 use App\Order;
+use App\OrderIssue;
+use App\OrderPackage;
 use App\Traits\ModelSearchWay;
 use App\WorkOrder;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 
 class WorkOrderFilters
@@ -15,15 +18,26 @@ class WorkOrderFilters
     protected $request;
     protected $queryBuilder;
     protected $filters = [
-        'ids','creator','name','remake','created_at_start','created_at_end','review_at_start','review_at_end','reviewer','word_order_types','word_order_child_types','logistic'
+        'ids',
+        'creator',
+        'remake',
+        'created_at_start','created_at_end',
+        'review_at_start','review_at_end',
+        'reviewer',
+        'word_order_types',
+        'word_order_child_types',
+        'logistic',
+        'is_review',
+        'logistic_number',
+        'is_issue_order',
+        'grad',
     ];
     protected $array_filter;
-    protected $params = [
-        'ids','creator','name','remake','created_at_start','created_at_end','review_at_start','review_at_end','reviewer','word_order_types','word_order_child_types','logistic'
-    ];
+    protected $params = [];
 
     protected $workOrderTypeQuery;
     protected $orderQuery;
+    protected $orderPackageQuery;
 
     public function __construct(Request $request)
     {
@@ -53,12 +67,23 @@ class WorkOrderFilters
 
     public function beforeApply()
     {
+        if ($this->orderPackageQuery){
+            $this->getOrderQuery()->whereIn('id',$this->orderPackageQuery);
+        }
+
         if ($this->orderQuery) {
             $this->queryBuilder->whereIn('order_id',$this->getOrderQuery());
         }
+
+        // 审核 默认为 待审核
+        if (isset($this->params['is_review'])){
+            $this->queryBuilder->where('status','2');
+        } else {
+            $this->queryBuilder->where('status','1');
+        }
     }
 
-    public function getOrderQuery()
+    public function getOrderQuery(): Builder
     {
         if (!$this->orderQuery){
             $this->orderQuery = Order::query()->select('id');
@@ -66,6 +91,14 @@ class WorkOrderFilters
         return $this->orderQuery;
     }
 
+    public function getOrderPackageQuery(): Builder
+    {
+        if (!$this->orderPackageQuery){
+            $this->orderPackageQuery = OrderPackage::query()->select('order_id');
+        }
+        return $this->orderPackageQuery;
+    }
+
     public function id($id)
     {
         if(is_array($id))$this->queryBuilder->whereIn('work_orders.id',$id);
@@ -119,10 +152,32 @@ class WorkOrderFilters
         else $this->workOrderTypeQuery->where('id',$word_order_types);
     }
 
+    // 快递单号
+    public function logistic_number($logistic_number)
+    {
+        $this->searchWay($this->getOrderPackageQuery(),$logistic_number,'order_packages.logistic_number');
+    }
 
+    // 对应问题件
+    public function is_issue_order($is_issue_order)
+    {
+        $orderIssueQuery = OrderIssue::query()->select('order_id')->whereIn('order_id',WorkOrder::query()->select('order_id'));
+        if($is_issue_order == 'true'){
+            $this->queryBuilder->whereIn('order_id',$orderIssueQuery);
+        } else {
+            $this->queryBuilder->whereNotIn('order_id',$orderIssueQuery);
+        }
+    }
+    // 承运商
     public function logistic($logistic)
     {
         $orderQuery = $this->getOrderQuery()->whereIn('id',WorkOrder::query()->select('order_id'));
         $this->searchWay($orderQuery,$logistic,'logistic_id');
     }
+
+    public function grad($grad)
+    {
+        $this->queryBuilder->where('grad',$grad);
+    }
+
 }

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

@@ -40,13 +40,13 @@ class OrderController extends Controller
         $result = $orderService->paginate($request);
         $picktotraceids = $result['picktotraceids'];
         $orders = $result['orders'];
-        $orderIssueNos =  $orderService->返回有问题件的订单号($orders);
+        $orderService->tagOrderByOrderIssue($orders);
         $commodities = $result['commodities'];
         $customers=app('OracleBasCustomerService')->getCustomers($codes);
         $page = $request["page"] ?? 1;
         $codes=DB::connection('oracle')->table('BAS_CODES')->select('code','codename_c')->where('codeid','SO_STS')->orderBy('code','asc')->get();
         $orderIssueType = OrderIssueType::all();
-        return view('order/index/delivering',compact('orders','customers','request','codes','commodities','page','picktotraceids','orderIssueType','orderIssueNos','logistics'));
+        return view('order/index/delivering',compact('orders','customers','request','codes','commodities','page','picktotraceids','orderIssueType','logistics'));
     }
 
     //导出

+ 54 - 117
app/Http/Controllers/WorkOrderController.php

@@ -4,155 +4,92 @@ namespace App\Http\Controllers;
 
 use App\Filters\WorkOrderFilters;
 use App\Logistic;
+use App\OrderIssue;
+use App\OrderIssueType;
 use App\Services\WorkOrderService;
-use App\Services\WorkOrderTypeService;
 use App\WorkOrder;
-use App\WorkOrderType;
-use Illuminate\Contracts\Foundation\Application;
-use Illuminate\Contracts\View\Factory;
 use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
-use Illuminate\Routing\Redirector;
 use Illuminate\Support\Facades\Gate;
-use Illuminate\View\View;
 
 class WorkOrderController extends Controller
 {
-    /**
-     * 工单主页
-     *
-     * @param Request $request
-     * @param WorkOrderFilters $filters
-     * @return Application|Factory|RedirectResponse|Redirector|View
-     */
-    public function index(Request $request, WorkOrderFilters $filters)
+
+    const ORDER_ISSUE_TYPES = 'orderIssueTypes';
+
+    public function index(Request $request, WorkOrderFilters $filters, WorkOrderService $service)
     {
-        if (!Gate::allows('订单管理-工单处理-查询')) return redirect('/');
+        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'])->orderByDesc('created_at', 'grad', 'status')->paginate($request['paginate'] ?? 50);
+        }, 'reviewer','issueType'])->orderByDesc(  'status')->paginate($request['paginate'] ?? 50);
         $logistics = Logistic::all();
-        return view('order.workOrder.index', compact('workOrders', 'logistics'));
-    }
-
-    public function create()
-    {
-        if (!Gate::allows('订单管理-工单处理-创建')) return redirect('/');
-        $workOrderTypes = WorkOrderType::query()->with('childTypes')->get();
-        $grads = WorkOrder::$enums['grad'];
-        array_shift($grads);
-        return view('order.workOrder.create', compact('workOrderTypes', 'grads'));
+        $orderIssueTypes = OrderIssueType::all();
+        $service->tags($workOrders);
+        return view('order.workOrder.index', compact('workOrders', 'logistics', '' . self::ORDER_ISSUE_TYPES . ''));
     }
 
-
-    public function store(Request $request, WorkOrderService $service)
-    {
-        if (!Gate::allows('订单管理-工单处理-创建')) return redirect('/');
-        $result = $service->create($request->all());
-        $workOrderTypes = WorkOrderType::query()->with('childTypes')->get();
-        $grads = WorkOrder::$enums['grad'];
-        array_shift($grads);
-        return view('order.workOrder.create', compact('workOrderTypes', 'result', 'grads'));
-    }
-
-    /**
-     * 生成订单拦截工单
-     * @param Request $request
-     * @param WorkOrderService $service
-     * @return array
-     */
-    public function interceptOrderApi(Request $request, WorkOrderService $service): array
-    {
-        if (!Gate::allows('订单管理-订单-生成工单')) return ['success' => false, 'message' => '没有对应的创建权限'];
-
-        $uniquely_tags = $request['order_nos'];
-
-        $work_order_type = app(WorkOrderTypeService::class)->findOrCreate('订单拦截', 'orders', '订单', '订单拦截');
-
-        $result = $service->exists($work_order_type['id'], $uniquely_tags);     // 检查订单号和工单类型是否有对应的工单
-
-        if ($result['success'])
-            return ['success' => false, 'message' => join(",", array($result['data'])) . "已有对应的订单拦截工单"];
-
-        return $service->interceptOrder($work_order_type, $uniquely_tags, $request['grad']);
-    }
-
-    /**
-     * 生成订单修改工单
-     * @param Request $request
-     * @param WorkOrderService $service
-     * @return array
-     */
-    public function editOrderReceiveInfoApi(Request $request,WorkOrderService $service): array
-    {
-        if (!Gate::allows('订单管理-订单-生成工单')) return ['success' => false, 'message' => '没有对应的创建权限'];
-
-        if (is_array($request['order_nos'])) return ['success' => false,'message' => '参数错误'];
-
-        $uniquely_tag = $request['order_nos'];
-
-        $work_order_type = app(WorkOrderTypeService::class)->findOrCreate('订单收件信息修改', 'orders', '订单', '订单收件信息修改');
-
-        $result = $service->exists($work_order_type['id'], $uniquely_tag);     // 检查订单号和工单类型是否有对应的工单
-
-        if($result['success'])
-            return ['success' => false,'message' => join(",", array($result['data'])) . "已有对应的订单信息修改工单"];
-
-        return $service->editOrder($work_order_type,$uniquely_tag,$request['remake']);
-    }
-
-    /**
-     * 工单审核
-     * @param Request $request
-     * @param WorkOrderService $service
-     * @return array
-     */
+    // 审核 api
     public function reviewApi(Request $request, WorkOrderService $service): array
     {
-        if (!Gate::allows('订单管理-工单处理-审核')) return ['success' => false, 'message' => '没有对应的编辑权限'];
+        if (Gate::denies('订单管理-工单处理-审核')) return ['success' => false, 'message' => '没有对应的编辑权限'];
         $workOrder = WorkOrder::query()->find($request['id']);
         return $service->review($workOrder);
     }
 
-    /**
-     * 生成问题件
-     * @param Request $request
-     * @param WorkOrderService $service
-     * @return array
-     */
-    public function createOrderIssueApi(Request $request, WorkOrderService $service): array
+    // 批量审核 api
+    public function batchReviewApi(Request $request,WorkOrderService  $service): array
     {
-        if (!Gate::allows('订单管理-订单问题件生成'))
-            return ['success' => false, 'message' => '没有对应权限'];
-        $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
-        if (count($work_orders) == 0) return ['success' => false, 'message' => '刷新当前页面重试'];
-        return $service->createOrderIssue($work_orders);
+        if(Gate::denies('订单管理-工单处理-审核'))return ['success' => false, 'message' => '没有对应的编辑权限'];
+        if (WorkOrder::query()->whereIn('id',$request['ids'])->whereNotNull('review_at')->exists())
+            return ['success' => false, 'message' => '选中的工单已有审核完成,刷新页面重试'];
+        $work_orders = WorkOrder::query()->whereIn('id',$request['ids'])->get();
+        $service->tags($work_orders);
+        return $service->batchReview($work_orders);
     }
 
-
-    public function show(WorkOrder $workOrder)
+    // 生成问题件 api
+    public function buildOrderIssueApi(Request $request, WorkOrderService $service): array
     {
-        //
+        if (Gate::denies('订单管理-订单问题件生成'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
+        if (count($work_orders) == 0) return ['success' => false, 'message' => '刷新当前页面重试'];
+        if (OrderIssue::query()->whereIn('order_id',$work_orders->map(function($item){return $item['order_id'];}))->exists()){
+            return ['success' => false, 'message' => '已有对应的问题件'];
+        }
+        $result = $service->buildOrderIssue($work_orders);
+        if (!$result['success']) return $result;
+        $workOrders = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
+            /** @var $query Builder */
+            $query->with('packages', 'issue', 'logistic');
+        }, 'reviewer','issueType'])->whereIn(  'id',$request['ids'])->get();
+        $service->tags($workOrders);
+        return ['success' => true ,'data' => $workOrders];
     }
 
-
-    public function edit(WorkOrder $workOrder)
+    // 创建工单 api
+    public function storeApi(Request $request, WorkOrderService $service):array
     {
-        //
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $params = $request['params'];
+        if (count($params) == 0) return ['success' => false,'message' => '参数异常'];
+        app('OrderService')->syncOrderByCodes(array_map(function($param){
+            return $param['order_no'];
+        },$params));
+        return  $service->build($request['params']);
     }
 
-
-    public function update(Request $request, WorkOrder $workOrder)
+    // 修改问题类型
+    public function updateIssueTypeApi(Request $request): array
     {
-        //
-    }
+        if (Gate::denies('订单管理-工单处理-审核'))
+            return ['success' => false,'message' => '没有对应权限'];
 
-
-    public function destroy(WorkOrder $workOrder)
-    {
-        //
+        WorkOrder::query()->where('id',$request['id'])->update(['order_issue_type_id' => $request['type_id']]);
+        return ['success' => true];
     }
 }

+ 36 - 0
app/Services/OrderIssueService.php

@@ -44,6 +44,42 @@ class OrderIssueService
         }
     }
 
+    /**
+     * 生成问题件
+     * @param  array $params
+     * @return array|false[]
+     */
+    public function buildOrderIssue(array $params): array
+    {
+        $data = Carbon::now();
+        foreach ($params as $param){
+            $inner_params[] = [
+                'order_id' => $param['order_id'],
+                'result_explain'=> $param['result_explain'] ?? '',
+                'imported_status'=> $param['imported_status'] ?? '正常',
+                'custom_code'=> $param['custom_code'] ?? null ,
+                'hidden_tag'=> $param['hidden_tag'] ?? null,
+                'order_issue_type_id' => $param['order_issue_type_id'] ?? '',
+                'created_at' => $data,
+                'updated_at' => $data,
+            ];
+        }
+        if (!isset($inner_params)) return ['success' => false];
+        $bool = OrderIssue::query()->insert($inner_params);
+        if (!$bool) return ['success' => false,'message' => '创建问题件异常'];
+        $ordersIssues = OrderIssue::query()->whereIn('order_id', data_get($inner_params, '*.order_id'))->get();
+        event(new AddOrUpdateOrderIssues(data_get($ordersIssues,'*.order_id')));
+        $this->同步退单状态($ordersIssues);
+        $param = [
+            'ids' => data_get($ordersIssues, '*.id'),
+            'content' => '',
+            'user_id' => Auth::user()['id'],
+            'type' => '创建'
+        ];
+        app(OrderIssueProcessLogService::class)->create($param);
+        return ['success' => true];
+    }
+
     public function createOrderIssueByWmsOrder($orderHeaders, $order_issue_type_id, $result_explain, $imported_status = '正常', $custom_code = null,$hiddenTag = null)
     {
         /** @var OrderService $orderService */

+ 20 - 0
app/Services/OrderService.php

@@ -1484,4 +1484,24 @@ sql;
         app('OrderPackageService')->syncOrderPackage($orderHeaders);
         app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);
     }
+
+    /**
+     * 标记 问题件 存在的 order
+     * @param $orders
+     */
+    public function tagOrderByOrderIssue(&$orders)
+    {
+        $orderNos =  data_get($orders,'*.orderno');
+        $orderIssues = OrderIssue::query()->with('order')->whereIn('order_id',function($query)use($orderNos){
+                $query->from('orders')->select('id')->whereIn('code',$orderNos);
+            })->get();
+        $tags = [];
+        $orderIssues->each(function($item)use(&$tags){
+            $tags[$item['order']['code']] = true;
+        });
+        foreach ($orders as &$order) {
+            if (array_key_exists($order->orderno,$tags))$order->is_order_issue = true;
+            else $order->is_order_issue = false;
+        }
+    }
 }

+ 120 - 93
app/Services/WorkOrderService.php

@@ -7,6 +7,7 @@ use App\OrderIssue;
 use App\OrderIssueType;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
+use App\WorkOrderType;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Auth;
@@ -17,70 +18,81 @@ class WorkOrderService
 
     protected $modelClass = WorkOrder::class;
 
+    protected $work_type_relation = [
+        '拦截' => '订单拦截',
+        '信息更改' => '订单收件信息修改',
+        '其他' => '订单其他异常',
+        '快递异常' => '订单快递异常',
+        '错漏发' => '快递错漏发',
+        '破损' => '快递破损',
+    ];
+
     /**
-     * 订单拦截 工单
-     * @param $workOrderType
-     * @param $uniquelyTags
-     * @param int $status
-     * @param int $grad
-     * @return array
+     * 生成工单
+     * @param $params
+     * @return array|bool[]
      */
-    public function interceptOrder($workOrderType, $uniquelyTags, int $grad = 1, int $status = 1): array
+    public function build($params): array
     {
-        app("OrderService")->syncOrderByCodes($uniquelyTags);  // 同步订单
-        $creator_id = Auth::user()['id'];  // 创建人
-        if (is_string($uniquelyTags)) $uniquelyTags = [$uniquelyTags];
-        if (!$uniquelyTags) return ['success' => false, 'message' => '订单号为空'];
-        $orders = Order::query()->whereIn('code', $uniquelyTags)->get();
-        $created_at = Carbon::now();
-        foreach ($uniquelyTags as $uniquelyTag) {
-            $order = $orders->where('code', $uniquelyTag)->first();
-            $params[] = [
+        $types = [];
+        $work_order_types = [];
+        $data = Carbon::now();
+        $creator_id = Auth::user()['id'];
+        $parent = WorkOrderType::query()->firstOrCreate(['name' => '订单','prent_id' => 0,'level' => 1]);
+        foreach ($params as $param) {
+            $order = Order::query()->where('code',$param['order_no'])->first();
+            $type_name = $param['order_issue_type'];
+            if (!$param['order_issue_type']) {
+                $order_issue_type_id = 0;
+                $work_order_type_id = 0;
+            } else {
+                if (!array_key_exists($type_name,$types)){
+                    $types[$type_name] = OrderIssueType::query()->where('name',$type_name)->first();
+                    $work_order_type_name = $this->work_type_relation[$type_name] ?? $type_name;
+                    $work_order_types[$type_name] =  WorkOrderType::query()->firstOrCreate(
+                        ['name' => $work_order_type_name],
+                        ['prent_id' =>$parent['id'],'table_name' => 'orders','level' => 2]
+                    );
+                }
+                $order_issue_type_id = $types[$type_name]['id'] ?? 0;
+                $work_order_type_id = $work_order_types[$type_name]['id'] ?? 0;
+            }
+            switch ($type_name) {
+                case '拦截':
+                    $remark = "拦截订单:".$order->client_code ?? '';
+                    break;
+                case '信息更改':
+                case '其他':
+                case '快递异常':
+                case '错漏发':
+                case '破损':
+                    $remark = $param['remark'] ?? '';
+                    break;
+                default:
+                    $work_order_type_id = 0;
+                    $remark = $param['remark'] ?? '';
+                    $order_issue_type_id = 0;
+                    break;
+            }
+            $inner_params[] = [
+                'order_id' => $order['id'],
                 'creator_id' => $creator_id,
-                'work_order_type_id' => $workOrderType->id,
-                'grad' => $grad,
-                'remark' => "{$workOrderType->name}:{$uniquelyTag}",
-                'outer_table_name' => $workOrderType->table_name ?? 'orders',
-                'order_id' => $order->id ?? '',
-                'uniquely_tag' => $uniquelyTag,
-                'status' => $status,
-                'created_at' => $created_at,
+                'work_order_type_id' => $work_order_type_id ?? 0,
+                'grad' => $param['grad'] ?? 1,
+                'remark' => $remark,
+                'outer_table_name' => 'orders',
+                'order_issue_type_id' => $order_issue_type_id ?? 0,
+                'uniquely_tag' => $order['code'] ?? null,
+                'status' => 1,
+                'created_at' =>  $data,
+                'updated_at' =>  $data,
             ];
         }
-        if (isset($params)) WorkOrder::query()->insert($params);
-        return ['success' => true];
-    }
-
-    /**
-     * 创建 信息更改 工单
-     * @param $workOrderType
-     * @param $uniquelyTag
-     * @param $remake
-     * @param int $grad
-     * @param int $status
-     * @return bool[]
-     */
-    public function editOrder($workOrderType, $uniquelyTag,$remake,int $grad = 1,int $status = 1) :array
-    {
-        app("OrderService")->syncOrderByCodes([$uniquelyTag]);  // 同步订单
-        $creator_id = Auth::user()['id'];  // 创建人
-        $order = Order::query()->where('code',$uniquelyTag)->first();
-
-        if (!$order) return ['success' => false,'message' => '对应订单未找到'];
-        WorkOrder::query()->create(
-            [
-                'creator_id' => $creator_id,
-                'work_order_type_id' => $workOrderType->id,
-                'grad' => $grad,
-                'remark' => $remake,
-                'outer_table_name' => $workOrderType->table_name ?? 'orders',
-                'order_id' => $order->id ?? '',
-                'uniquely_tag' => $uniquelyTag,
-                'status' => $status,
-                'created_at' => Carbon::now(),
-            ]
-        );
-        return ['success' => true];
+        if (isset($inner_params)){
+            WorkOrder::query()->insert($inner_params);
+            return ['success' => true];
+        }
+        return ['success' => false,'message' => '参数异常'];
     }
 
     /**
@@ -93,53 +105,48 @@ class WorkOrderService
         $wordOrder->update(['reviewer_id' => Auth::user()['id'], 'review_at' => Carbon::now(), 'status' => 2,]);
         $wordOrder = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
             /** @var $query Builder */
-            $query->with('packages', 'issue','logistic');
+            $query->with('packages', 'issue', 'logistic');
         }, 'reviewer'])->find($wordOrder['id']);
         return ['success' => true, 'data' => $wordOrder];
     }
 
     /**
-     * 拦截工单
-     * 生成问题件
-     * @param $work_orders
-     * @return array|bool[]
+     * 批量审核工单
+     * @param $workOrders
+     * @return array
      */
-    public function createOrderIssue($work_orders): array
+    public function batchReview($workOrders): array
     {
-        $order_ids = $work_orders->map(function ($item) {
-            return $item->order_id;
-        });
-
-        $order_issues = OrderIssue::query()->with('order')->whereIn('order_id', $order_ids)->get();
-
-        $codes = $order_issues->map(function ($item) {
-            return $item->order->code;
+        $ids = $workOrders->map(function ($item) {
+            return $item->id;
         })->toArray();
-        if (count($codes) > 0)
-            return ['success' => false, 'message' => '对应【' . join(',', $codes) . '】订单已有问题件'];
-
-        $orders = Order::query()->select('code')->whereIn('id', $order_ids)->get();
-
-        $order_headers = app(OracleDOCOrderHeaderService::class)->getQuery()->whereIn('orderNo', $orders)->get();       // 获取
-
-        $order_issue_type = OrderIssueType::query()->where('name', '拦截')->first();       // 问题件类型
-
-        $result = app('OrderIssueService')->createOrderIssueByWmsOrder($order_headers, $order_issue_type->id, '拦截工单');
-
-        if (!$result) return ['success' => false, 'message' => '生成对应问题件失败'];
+        WorkOrder::query()->whereIn('id', $ids)->update(['review_at' => Carbon::now(), 'reviewer_id' => Auth::user()['id']]);
+        $wordOrder = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
+            /** @var $query Builder */
+            $query->with('packages', 'issue', 'logistic');
+        }, 'reviewer'])->find($ids);
+        return ['success' => true, 'data' => $wordOrder];
+    }
 
-        $work_orders = WorkOrder::query()->with(['type', 'creator', 'order' => function ($query) {
-                /** @var $query Builder */
-            $query->with('packages', 'issue','logistic');
-            }, 'reviewer'])
-            ->where('outer_table_name', 'orders')
-            ->whereIn('order_id', $order_ids)
-            ->get();
 
-        return ['success' => true, 'data' => $work_orders];
+    /**
+     * 生成问题件
+     * @param $work_orders
+     * @return array
+     */
+    public function buildOrderIssue($work_orders): array
+    {
+        foreach ($work_orders as $work_order) {
+            $inner_params[] = [
+                'order_id' => $work_order->order_id,
+                'order_issue_type_id' => $work_order->order_issue_type_id,
+                'result_explain' => $work_order->remark,
+            ];
+        }
+        if (!isset($inner_params)) return ['success' => false,'message' => '创建问题件失败'];
+        return  app('OrderIssueService')->buildOrderIssue($inner_params);
     }
 
-
     /**
      * 按 指定工单类型 和 唯一标识 确认工单是否存在
      * @param $work_order_type_id
@@ -160,4 +167,24 @@ class WorkOrderService
         }
         return ['success' => false];
     }
+
+    /**
+     * 标记已有 问题件的工单
+     * @param $workOrders
+     */
+    public function tags(&$workOrders)
+    {
+        $order_ids = $workOrders->map(function($item){
+            return $item->order_id;
+        });
+        $order_issues = OrderIssue::query()->whereIn('order_id',$order_ids)->get();
+        foreach ($order_issues as $order_issue) {
+            $codes[$order_issue->order_id] = true;
+        }
+        if (!isset($codes))return;
+        foreach ($workOrders as &$workOrder) {
+            if (array_key_exists($workOrder->order_id,$codes))$workOrder->is_issue_order= true;
+            else  $workOrder->is_issue_order= false;
+        }
+    }
 }

+ 7 - 0
app/WorkOrder.php

@@ -20,6 +20,7 @@ class WorkOrder extends Model
         'status',           // 状态
         'creator_id',       // 创建人
         'reviewer_id',      // 审核人
+        'order_issue_type_id', // 问题件类型
         'work_order_type_id',  // 工单类型
         'grad',         // 紧急等级
         'remark',       // 工单信息描述
@@ -108,6 +109,12 @@ class WorkOrder extends Model
         return $this->BelongsTo(WorkOrderType::class,'work_order_type_id');
     }
 
+    // 生成问题件类型
+    public function issueType():BelongsTo
+    {
+        return $this->belongsTo(OrderIssueType::class,'order_issue_type_id');
+    }
+
     public function scopeFilter($query, $filters)
     {
         return $filters->apply($query);

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeWorkOrdersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->tinyInteger('order_issue_type_id')->index()->comment('问题件类型');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->dropColumn('order_issue_type_id');
+        });
+    }
+}

+ 0 - 75
resources/views/order/index/_workOrderModal.blade.php

@@ -1,75 +0,0 @@
-<div class="modal fade " id="intercept-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel" aria-hidden="true">
-    <div class="modal-dialog modal-dialog-centered">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title" id="checkModalLabel" v-if="workType === '拦截'">拦截工单</h5>
-                <h5 class="modal-title" id="checkModalLabel" v-if="workType === '修改'">修改工单</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"  >
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-                <div class="form-group">
-                    <label for="grad" class="">任务紧急程度</label>
-                    <div class="pl-1">
-                        <div v-for="(item,i) in grads">
-                            <input type="radio" :id="'grad'+i" name="grad" :value="item.value" v-model="grad">
-                            <label :for="'grad'+i">@{{ item.name }}</label>
-                        </div>
-                    </div>
-                </div>
-
-                <template v-if="workType === '修改'">
-                    <hr>
-                    <div class="form-group">
-                        <label for="contact">收货人</label>
-                        <div class="pl-1">
-                            <input class="form-control" v-model="remark.name" id="contact">
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <label for="phone">联系号码</label>
-                        <div class="pl-1">
-                            <input class="form-control" v-model="remark.phone" id="phone"></input>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <label for="province">省</label>
-                        <div class="pl-1">
-                            <input class="form-control" v-model="remark.province" id="province"></input>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <label for="city">市</label>
-                        <div class="pl-1">
-                            <input class="form-control" v-model="remark.city" id="city"></input>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <label for="istrict">区</label>
-                        <div class="pl-1">
-                            <input class="form-control" v-model="remark.district" id="district"></input>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <label for="adder">详细地址</label>
-                        <div class="pl-1">
-                            <input class="form-control" v-model="remark.adder" id="adder"></input>
-                        </div>
-                    </div>
-                </template>
-
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭
-                </button>
-                <button type="button" class="btn btn-outline-primary" @click="interceptOrder" v-if="workType === '拦截'">
-                    提交
-                </button>
-                <button type="button" class="btn btn-outline-primary" @click="changeReceiveInfo" v-if="workType === '修改'">
-                    提交
-                </button>
-            </div>
-        </div>
-    </div>
-</div>

+ 47 - 0
resources/views/order/index/_work_order_modal.blade.php

@@ -0,0 +1,47 @@
+<div class="modal fade " id="intercept-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel" aria-hidden="true">
+    <div class="modal-dialog modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="checkModalLabel" >创建工单</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                {{--工单类型--}}
+                <div class="form-group">
+                    <label for="order_issue_type">工单类型</label>
+                    <div class="pl-1">
+                        <select name="type" id="order_issue_type" class="form-control" v-model="workOrder.orderIssueType">
+                            <option value=""></option>
+                            <option v-for="type in workOrder.types" :value="type">@{{ type }}</option>
+                        </select>
+                    </div>
+                </div>
+                {{--其他--}}
+                <template v-if="['其他',null,'快递异常','错漏发','破损'].includes(workOrder.orderIssueType)">
+                    <hr>
+                    <label for="remake_info">问题描述</label>
+                    <div class="pl-1">
+                        <textarea class="form-control" name="" id="remake_info" cols="30" rows="5" v-model="workOrder.remark.info"></textarea>
+                    </div>
+                </template>
+                {{--信息更改--}}
+                <template v-else-if="workOrder.orderIssueType === '信息更改'">
+                    <hr>
+                    <label for="remake_info">新的收方信息</label>
+                    <div class="pl-1">
+                        <textarea class="form-control" name="" id="remake_info" cols="30" rows="5" v-model="workOrder.remark.info"></textarea>
+                    </div>
+                </template>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭
+                </button>
+                {{--生成问题件--}}
+                <button type="button" class="btn btn-outline-primary" @click="buildWorkOrder">提交
+                </button>
+            </div>
+        </div>
+    </div>
+</div>

+ 79 - 73
resources/views/order/index/delivering.blade.php

@@ -37,10 +37,7 @@
 
                     <button class="btn btn-sm ml-1 btn-primary" @click="copyLogisticNumber()">复制快递单号</button>
                     @can('订单管理-订单-生成工单')
-                    <button class="btn btn-sm ml-1 btn-outline-secondary" @click="showInterceptModel('拦截')">订单拦截</button>
-                    @endcan
-                    @can('订单管理-订单-生成工单')
-                        <button class="btn btn-sm ml-1 btn-outline-success" @click="showInterceptModel('修改')">订单修改</button>
+                        <button class="btn btn-sm ml-1 btn-outline-success" @click="showInterceptModel()">生成工单</button>
                     @endcan
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
@@ -65,7 +62,7 @@
                             <input class="checkItem" type="checkbox" :value="order.orderno">
                         </td>
                         <td class="text-nowrap">
-                            <span>@{{ i+1 }}</span><span v-if="orderIssueNos.includes(order.orderno)" class="badge badge-pill badge-danger">问题件</span>
+                            <span>@{{ i+1 }}</span><span v-show="order.is_order_issue" class="badge badge-pill badge-danger">问题件</span>
                         </td>
                         <td class="text-dark font-weight-bold text-nowrap"><span>@{{ order.orderno }}</span></td>
                         <td class="text-muted text-nowrap"><span>@{{ order.ordercodename }}</span></td>
@@ -227,7 +224,7 @@
                     </div>
                 </div>
                 @can('订单管理-订单-生成工单')
-                @include('order.index._workOrderModal')
+                @include('order.index._work_order_modal')
                 @endcan
                 <textarea  id="clipboardDiv" style="opacity:0"></textarea>
             </div>
@@ -275,23 +272,27 @@
                 message:{
                     checkOrderIssueMessage:'',
                 },
-                orderIssueNos:{!!  $orderIssueNos!!},
                 tagOrders:[],
                 tagOrder:{
                     logisticInfo:'',
                     merchantInfo:'',
                 },
                 upList:{},
-                grad:1,
-                remark:{
-                    name:null,     // 联系人
-                    phone:null,    // 联系号码
-                    province:null, // 省
-                    city:null,      // 市
-                    district:null,  // 区
-                    adder:null,     // 详细地址
-                },
-                workType:'',
+
+                workOrder:{
+                    types:['拦截','快递异常','信息更改','错漏发', '破损'],
+                    orderIssueType:0,
+                    grad:1,
+                    remark:{
+                        name:null,     // 联系人
+                        phone:null,    // 联系号码
+                        province:null, // 省
+                        city:null,      // 市
+                        district:null,  // 区
+                        adder:null,     // 详细地址
+                        info:null,
+                    },
+                },
                 grads:[
                     {name:'一般',value:'1'},
                     {name:'重要',value:'2'},
@@ -682,7 +683,7 @@
                         $("#exampleModal").modal('hide');
                     }
                     let _this = this;
-                    tempTip.setDuration(99999);
+                    tempTip.setDuration(1999);
                     tempTip.waitingTip('处理中,请稍候');
                     let data = {orderNos:checkData,typeId: this.typeId,result_explain:this.result_explain};
                     axios.post("{{url('apiLocal/order/issue/orderIssueTag')}}",data).then(function(res){
@@ -691,10 +692,9 @@
                         if(res.data.success){
                             tempTip.setDuration(3000);
                             tempTip.showSuccess('已标记为问题件');
-                            checkData.forEach(function(orderNo){
-                                _this.orderIssueNos.push(orderNo)
+                            _this.orders.forEach(item=>{
+                                if (checkData.includes(item.orderno))item.is_order_issue  = true;
                             });
-                            checkData = []
                         }else{
                             if(res.data.exitsOrderNos){
                                 _this.message.checkOrderIssueMessage = res.data.fail_info+res.data.exitsOrderNos;
@@ -937,70 +937,76 @@
                     }else {char+=order.soreference5}
                     return char;
                 },
-                showInterceptModel(type = '拦截'){
-                    this.grad = 1;
-                    if(checkData.length === 0){
-                        tempTip.show('选中订单在进行操作');
-                        return;
-                    }
-                    this.workType = type;
-                    if (type==='修改' && checkData.length > 1){
-                        window.tempTip.show('请选中一条订单来修改收货信息');
+                showInterceptModel(){
+                    this.workOrder.grad = 1;
+                    if (checkData.length < 1) {
+                        window.tempTip.show('未选中任何订单');
                         return;
                     }
-                    if (type ==='修改'){
-                        this.orders.forEach(order=>{
-                            if (order.orderno === checkData[0]){
-                                this.remark.name = order.c_contact
-                                this.remark.phone = order.c_tel2?order.c_tel2:order.c_tel1;
-                                this.remark.province = order.c_province;
-                                this.remark.city = order.c_city;
-                                this.remark.district = order.c_district
-                                this.remark.adder = order.c_address1;
-                            }
-                        });
-                    }
-
+                    this.workOrder.orderIssueType = null;
+                    this.workOrder.info = null;
                     $('#intercept-modal').modal('show');
                 },
-                interceptOrder(){    // 订单拦截
-                    let url = '{{url('apiLocal/workOrder/interceptOrder')}}';
-                    let data = {
-                        order_nos:checkData,
-                        grad:this.grad,
+                checkOrderIssue(name){  //
+                    let types = this.orderIssueType.filter(item=>{
+                        return item.name === name;
+                    });
+                    if (types.length === 0 ) return false;
+                    return this.workOrder.orderIssueType === types[0].id
+                },
+                buildWorkOrder(){  // 生成工单
+                    let url = '{{route('workOrder.storeApi')}}';
+                    let data = {};
+                    switch (this.workOrder.orderIssueType){
+                        case "信息更改":
+                            if (checkData.length === 1){
+                                data = [{
+                                    order_no:checkData[0],
+                                    order_issue_type:"信息更改",
+                                    grad:1,
+                                    remark: this.workOrder.remark.info,
+                                }];
+                                break;
+                            }
+                            window.tempTip.show('不能批量创建信息修改工单');
+                            return;
+                        case "拦截":
+                        case "快递异常":
+                        case "错漏发":
+                        case "破损":
+                            data = checkData.map(item=>{
+                                return {
+                                    order_no: item,
+                                    grad:1,
+                                    order_issue_type:this.workOrder.orderIssueType,
+                                    remark:this.workOrder.remark.info,
+                                };
+                            });
+                            break;
+                        default:
+                            data = checkData.map(item=>{
+                                return {
+                                    order_no: item,
+                                    grad:1,
+                                    order_issue_type:null,
+                                    remark:this.workOrder.remark.info,
+                                };
+                            });
+                            break;
                     }
+
                     window.tempTip.setIndex(1999);
-                    window.axios.post(url,data).then(res=>{
+                    window.axios.post(url,{params:data}).then(res=>{
                         if (res.data.success){
-                            window.tempTip.showSuccess('生成订单拦截成功');
+                            window.tempTip.showSuccess('工单生成成功');
                             $('#intercept-modal').modal('hide');
-                        }else{
-                            window.tempTip.show(res.data.message);
+                        } else {
+                            window.tempTip.show(res.data.message ? res.data.message : '工单创建异常');
                         }
                     }).catch(err=>{
-                        window.tempTip.show(err);
+                        window.tempTip.show(err)
                     });
                 },
-                changeReceiveInfo() {
-                    let url = '{{url('apiLocal/workOrder/editOrderReceiveInfo')}}';
-                    let data = {
-                        order_nos:checkData[0],
-                        grad:this.grad,
-                        remake:`${this.remark.name} ${this.remark.phone} ${this.remark.province} ${this.remark.city} ${this.remark.city} ${this.remark.district} ${this.remark.adder}`,
-                    };
-                    console.log(data);
-                    window.tempTip.setIndex('1999');
-                    window.axios.post(url,data).then(res=>{
-                        if (res.data.success){
-                            window.tempTip.showSuccess('生成修改工单成功');
-                            $('#intercept-modal').modal('hide');
-                        } else{
-                            window.tempTip.show(res.data.message);
-                        }
-                    }).catch(err=>{
-                        window.tempTip.show(err);
-                    });
-                }
             },
         });
     </script>

+ 140 - 60
resources/views/order/workOrder/index.blade.php

@@ -24,6 +24,15 @@
                                @click="modificationMessage()">信息修改导出</button>
                        </span>
                     @endcan
+
+                    @can('订单管理-工单处理-审核')
+                        <span class="ml-1">
+                        <button type="button" class="btn btn-outline-success btn-sm form-control-sm  tooltipTarget"
+                                @click="batchReview">
+                            批量审核
+                        </button>
+                        </span>
+                    @endcan
                 </div>
 
                 <div>
@@ -37,7 +46,7 @@
                                 </td>
                                 <td class="text-center">
                                     <span>@{{ i+1 }}</span>
-                                    <span v-if="item.order  && item.order.issue" class="badge badge-primary">问题件</span>
+                                    <span v-show="item.is_issue_order" class="badge badge-primary">问题件</span>
                                 </td>
                                 <td class="text-center">
                                     <template v-if="item.status === '已处理'">
@@ -55,6 +64,18 @@
                                                   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 ">
+                                            生成问题件
+                                        </button>
+                                    @endcan
+                                    @can('订单管理-工单处理-审核')
+                                        <button class="btn btn-sm btn-outline-success" v-show="item.status !== '已处理'" @click="review(item,i)">
+                                            审核
+                                        </button>
+                                    @endcan
+                                </td>
                                 <td>@{{item.type ? item.type.name : '' }}</td>
                                 <td>@{{item.order ? (item.order.logistic ? item.order.logistic.name : '') : '' }}</td>
                                 <td class="text-center">
@@ -71,17 +92,32 @@
                                             <template v-else>
                                                 <p>@{{ item.order.packages[0].logistic_number }}</p>
                                             </template>
-                                            <button class="btn btn-sm btn-outline-primary"
+                                            <button class="btn btn-sm btn-outline-primary" v-show="selectOrder === null"
                                                     @click="selectOrder = item.order.id">
                                                 展开
                                             </button>
-                                            <button class="btn btn-sm btn-outline-primary" @click="selectOrder = null">
+                                            <button class="btn btn-sm btn-outline-primary"
+                                                    v-show="selectOrder === item.order.id"
+                                                    @click="selectOrder = null">
                                                 收起
                                             </button>
                                         </template>
 
                                     </template>
                                 </td>
+                                <td class="text-center">
+                                    @can('订单管理-工单处理-审核')
+                                        <select class="form-control form-control-sm"
+                                                :disabled="item.review_at || item.is_issue_order"
+                                                :value="item.order_issue_type_id"
+                                                @change="changeIssueType(item,$event)" >
+                                            <option value="0"></option>
+                                            <option  v-for="type in orderIssueTypes" :value="type.name">@{{ type.value }}</option>
+                                        </select>
+                                    @else
+                                        @{{ item.issue_type ?  item.issue_type.name : '' }}
+                                    @endcan
+                                </td>
                                 <td class="text-center">@{{ item.remark }}</td>
                                 <td class="text-center">@{{ item.status }}</td>
                                 <td class="text-center">
@@ -118,26 +154,7 @@
                                 <td class="text-center">@{{ item.created_at }}</td>
                                 <td>@{{ item.reviewer ? item.reviewer.name : ''}}</td>
                                 <td>@{{ item.review_at }}</td>
-                                <td class="text-center">
-
-                                    @can('订单管理-订单问题件生成')
-                                        <template
-                                            v-if="item.type && item.type.name === '订单拦截' && item.status !== '已处理' ">
-                                            <button class="btn btn-sm btn-outline-primary"
-                                                    @click="createOrderIssue(item,true)"
-                                                    v-if="item.order && item.order.issue === null">
-                                                生成问题件
-                                            </button>
-                                        </template>
-                                    @endcan
 
-                                    @can('订单管理-工单处理-审核')
-                                        <button class="btn btn-sm btn-outline-success" v-if="item.status !== '已处理'"
-                                                @click="review(item,i)">
-                                            审核
-                                        </button>
-                                    @endcan
-                                </td>
                             </tr>
                         </template>
                         </tbody>
@@ -160,12 +177,17 @@
                 selectTr: null,
                 form: null,
                 logistics: [
-                    @foreach($logistics as $logistic)
+                        @foreach($logistics as $logistic)
                     {
                         name: {{$logistic->id}}, value: '{{$logistic->name}}'
                     },
                     @endforeach
                 ],
+                orderIssueTypes:[
+                    @foreach($orderIssueTypes as $type)
+                    {name:'{{$type->id}}',value:"{{$type->name}}"},
+                    @endforeach
+                ],
                 selectOrderPackage: null,
                 selectOrder: null,
             },
@@ -181,8 +203,25 @@
                         tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
                         placeholder: ['承运商', '定位或多选承运商']
                     },
+                    {name: 'logistic_number', type: 'input', placeholder: '快递单号'},
+                    {
+                        name: 'grad',
+                        type: 'select',
+                        placeholder: '工单等级',
+                        data: [{name: 1, value: '一般'}, {name: 2, value: '重要'}, {name: 3, value: '紧急'}, {
+                            name: 4,
+                            value: '重要且紧急'
+                        },]
+                    },
+                    {
+                        name: 'is_issue_order',
+                        type: 'select',
+                        placeholder: '问题件',
+                        data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}]
+                    },
                 ], [{name: 'review_at_start', type: 'time', tip: ['工单审核开始日期', '时间']},
                     {name: 'review_at_end', type: 'time', tip: ['工单审核结束日期', '时间']},
+                    {name: 'is_review', type: 'checkbox', tip: '是否审核', data: [{name: 'true', value: '已审核'}]},
                 ]];
                 this.form = new query({
                     el: '#form_div',
@@ -192,9 +231,11 @@
                 let column = [
                     {name: 'no', value: '序号', neglect: true},
                     {name: 'grad', value: '工单等级'},
+                    {name: 'operation', value: '操作', neglect: true},
                     {name: 'type', value: '相关类型'},
                     {name: 'logisticName', value: '承运商'},
                     {name: 'logisticNumber', value: '快递单号'},
+                    {name: 'orderIssueType', value: '问题件类型'},
                     {name: 'workOrderInfo', value: '问题描述'},
                     {name: 'status', value: '状态', neglect: true},
                     {name: 'Info', value: '物流跟踪信息', neglect: true},
@@ -202,7 +243,6 @@
                     {name: 'submit_at', value: '提交时间'},
                     {name: 'reviewer', value: '审核人'},
                     {name: 'review_at', value: '审核时间'},
-                    {name: 'operation', value: '操作', neglect: true},
                 ];
 
                 new Header({
@@ -243,10 +283,11 @@
                     });
                 },
                 review(item, i) {
-                    let url = '{{url('apiLocal/workOrder/review')}}';
+                    let url = '{{route('workOrder.reviewApi')}}';
                     let data = {id: item.id};
                     window.axios.post(url, data).then(res => {
                         if (res.data.success) {
+                            res.data.data.is_issue_order = item.is_issue_order;
                             this.$set(this.workOrders, i, res.data.data);
                             this.sortOrder(res.data.data);
                             window.tempTip.showSuccess("审核完成");
@@ -258,25 +299,22 @@
                     })
                 },
                 createOrderIssue(item, tag) { // 生成问题件
-                    let url = '{{url('apiLocal/workOrder/createOrderIssue')}}';
+                    let url = '{{route('workOrder.buildOrderIssueApi')}}';
                     let data = {};
-                    let _this = this;
                     if (tag) data.ids = [item.id];
                     else data.ids = checkData;
-
                     if (!confirm('是否生成对应的问题件')) return;
-
+                    let _this =this;
                     window.axios.post(url, data).then(res => {
                         if (res.data.success) {
-                            if (res.data.data) {
-                                $.each(res.data.data, (i, data) => {
-                                    $.each(_this.workOrders, (index, item) => {
-                                        if (item.id === data.id) {
-                                            _this.$set(this.workOrders, index, data);
-                                        }
-                                    });
+                            res.data.data.forEach(item=>{
+                                this.workOrders.forEach((workOrder,i)=>{
+                                    if (item.id === workOrder.id){
+                                        _this.sortOrder(item);
+                                        _this.$set(_this.workOrders,i,item);
+                                    }
                                 });
-                            }
+                            });
                             this.$forceUpdate();
                             window.tempTip.showSuccess('已生成对应的问题件');
                         } else {
@@ -286,34 +324,35 @@
                         window.tempTip.show(err)
                     });
                 },
-                getMessageWorkOrder(){
+                getMessageWorkOrder() {
                     let selected = checkData;
-                    if (!selected){
+                    if (!selected) {
                         window.tempTip.show('未选中任何信息');
                         return null;
                     }
-                    return this.workOrders.filter((item) =>{
-                        return selected.includes(item.id+'');
+                    return this.workOrders.filter((item) => {
+                        return selected.includes(item.id + '');
                     });
                 },
                 interceptMessage() {
                     let selectItems = this.getMessageWorkOrder();
-                    if (selectItems === null )return ;
+                    if (selectItems === null) return;
                     let zto_and_sf = '';
                     let rest_logistic = '';
-                    selectItems.forEach(item=>{
+                    selectItems.forEach(item => {
                         // 中通、顺丰
-                        if (item.order.logistic.code.includes('SF') ||item.order.logistic.code.includes('ZTO') ){
-                            item.order.packages.forEach(node=>{
+                        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{
+                        } 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';
+                                // + 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';
                             });
                         }
                     });
@@ -321,34 +360,34 @@
                     text += rest_logistic;
                     this.copyText(text);
                 },
-                modificationMessage(){
+                modificationMessage() {
                     let selectItems = this.getMessageWorkOrder();
-                    if (selectItems === null) return ;
+                    if (selectItems === null) return;
                     let zto = '';
                     let sf = '';
                     let rest_logistic = '';
-                    selectItems.forEach(item=>{
+                    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;
-                        item.order.packages.forEach(node=> {
+                        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';
+                                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';
+                                rest_logistic += node.logistic_number + ' ' + adder + ' ——改地址' + item.remark + '\n';
                             }
                         });
                     });
                     let text = sf + zto + rest_logistic;
                     this.copyText(text);
                 },
-                copyText(text){
+                copyText(text) {
                     let ele = document.querySelector('#copy_text');
-                    if (ele == null ){
+                    if (ele == null) {
                         ele = document.createElement("textarea");
-                        ele.setAttribute('id','copy_text')
+                        ele.setAttribute('id', 'copy_text')
                         ele.style.opacity = 0;
                         document.querySelector('body').append(ele);
                     }
@@ -359,6 +398,47 @@
                     } catch (e) {
                         tempTip.showSuccess('复制失败:' + e)
                     }
+                },
+                batchReview() {
+                    let url = '{{route('workOrder.batchReviewApi')}}';
+                    let data = {ids: checkData};
+                    let _this = this;
+                    window.tempTip.setIndex('1999');
+                    if (!confirm('是否对当前选中订单进行审核')) return;
+                    window.axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            $.each(res.data.data, (i, data) => {
+                                $.each(_this.workOrders, (index, item) => {
+                                    if (item.id === data.id) {
+                                        _this.$set(this.workOrders, index, data);
+                                    }
+                                });
+                            });
+                            this.$forceUpdate();
+                            window.tempTip.showSuccess('审核完成');
+                        } else {
+                            window.tempTip.show(res.data.message ? res.data.message : '审核出现异常');
+                        }
+                    }).catch(err => {
+                        window.tempTip.show(err);
+                    })
+                },
+                changeIssueType(item,e){
+                    let url = '{{route('workOrder.updateIssueTypeApi')}}';
+                    let data = {
+                        id:item.id,
+                        type_id: $(e.target).val()
+                    };
+                    window.axios.post(url,data).then(res=>{
+                        if (res.data.success){
+                            window.tempTip.showSuccess('修改成功');
+                            item.order_issue_type_id = data.type_id;
+                        }else{
+                            window.tempTip.show(res.data.message ? res.data.message : '修改异常');
+                        }
+                    }).catch(err=>{
+                        window.tempTip.show(err);
+                    });
                 }
             },
         });

+ 6 - 5
routes/apiLocal.php

@@ -230,8 +230,9 @@ Route::group(['prefix' => 'print'],function (){
 });
 
 Route::prefix('workOrder')->group(function(){
-    Route::post('interceptOrder','WorkOrderController@interceptOrderApi');
-    Route::post('editOrderReceiveInfo','WorkOrderController@editOrderReceiveInfoApi');
-    Route::post('review','WorkOrderController@reviewApi');
-    Route::post('createOrderIssue','WorkOrderController@createOrderIssueApi');
-});
+    Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
+    Route::post('review','WorkOrderController@reviewApi')->name('workOrder.reviewApi'); // 审核
+    Route::post('batchReview','WorkOrderController@batchReviewApi')->name('workOrder.batchReviewApi');  // 批量审核
+    Route::post('buildOrderIssue','WorkOrderController@buildOrderIssueApi')->name('workOrder.buildOrderIssueApi');  // 生成问题件
+    Route::post('updateIssueType','WorkOrderController@updateIssueTypeApi')->name('workOrder.updateIssueTypeApi'); // 修改问题类型
+ });