Jelajahi Sumber

工单修改

ajun 4 tahun lalu
induk
melakukan
3066e5c4cf
37 mengubah file dengan 2148 tambahan dan 1111 penghapusan
  1. 3 2
      app/Filters/WorkOrderFilters.php
  2. 1 1
      app/Http/Controllers/MeasureMonitorController.php
  3. 1 1
      app/Http/Controllers/OrderPackageCommoditiesController.php
  4. 5 0
      app/Http/Controllers/TestController.php
  5. 1 211
      app/Http/Controllers/WorkOrderController.php
  6. 65 0
      app/Http/Controllers/WorkOrderDamageController.php
  7. 57 0
      app/Http/Controllers/WorkOrderExpressAbnormalController.php
  8. 47 0
      app/Http/Controllers/WorkOrderInformationChangeController.php
  9. 46 0
      app/Http/Controllers/WorkOrderInterceptController.php
  10. 65 0
      app/Http/Controllers/WorkOrderLossController.php
  11. 60 0
      app/Http/Controllers/WorkOrderMistakeController.php
  12. 12 0
      app/Providers/AppServiceProvider.php
  13. 67 0
      app/Services/WorkOrderDamageService.php
  14. 23 10
      app/Services/WorkOrderDetailService.php
  15. 69 0
      app/Services/WorkOrderExpressAbnormalService.php
  16. 4 4
      app/Services/WorkOrderImageService.php
  17. 61 0
      app/Services/WorkOrderInformationChangeService.php
  18. 66 0
      app/Services/WorkOrderInterceptService.php
  19. 78 0
      app/Services/WorkOrderLossService.php
  20. 72 0
      app/Services/WorkOrderMistakeService.php
  21. 12 177
      app/Services/WorkOrderService.php
  22. 7 1
      app/WorkOrder.php
  23. 3 2
      app/WorkOrderCommodities.php
  24. 3 1
      app/WorkOrderDetail.php
  25. 7 6
      app/WorkOrderImage.php
  26. 1 1
      app/WorkOrderLog.php
  27. 16 12
      resources/views/order/index/_work_order_modal.blade.php
  28. 65 14
      resources/views/order/index/delivering.blade.php
  29. 0 102
      resources/views/order/workOrder/_bao_shi_fill_work_order_modal.blade.php
  30. 148 25
      resources/views/order/workOrder/_bao_shi_review_modal.blade.php
  31. 76 65
      resources/views/order/workOrder/_issue_logs.blade.php
  32. 17 9
      resources/views/order/workOrder/_logistic_fill_work_order_modal.blade.php
  33. 71 29
      resources/views/order/workOrder/_owner_fill_work_order_modal.blade.php
  34. 88 64
      resources/views/order/workOrder/_work_order_details.blade.php
  35. 37 0
      resources/views/order/workOrder/_work_order_log.blade.php
  36. 766 361
      resources/views/order/workOrder/index.blade.php
  37. 28 13
      routes/apiLocal.php

+ 3 - 2
app/Filters/WorkOrderFilters.php

@@ -79,6 +79,7 @@ class WorkOrderFilters
         }
 
         $this->afterFilter();
+
     }
 
     private function afterFilter()
@@ -106,7 +107,7 @@ class WorkOrderFilters
             array_push($status,1,4);
         }
         if (Gate::allows('订单管理-工单处理-承运商编辑')) {
-            array_push($status,3);
+            array_push($status,3,6);
         }
         if (Gate::allows('订单管理-工单处理-货主编辑')) {
             array_push($status,2);
@@ -278,7 +279,7 @@ class WorkOrderFilters
     public function status($status){
         $status_list = [];
         if ($status == '承运商处理'){
-            array_push($status_list,3);
+            array_push($status_list,3,6);
         } elseif ($status == '宝时处理') {
             array_push($status_list,4,1);
         } elseif ($status == '货主处理'){

+ 1 - 1
app/Http/Controllers/MeasureMonitorController.php

@@ -6,7 +6,7 @@ use App\MeasuringMachine;
 use App\OrderPackage;
 use App\Services\MeasureMonitorService;
 use Illuminate\Http\Request;
-require_once '../app/library/baidu-api-speech/AipSpeech.php';
+//require_once '../app/library/baidu-api-speech/AipSpeech.php';
 class MeasureMonitorController extends Controller
 {
 

+ 1 - 1
app/Http/Controllers/OrderPackageCommoditiesController.php

@@ -21,7 +21,7 @@ class OrderPackageCommoditiesController extends Controller
         $data = $commodities->map(function ($item) {
             return [
                 'sku' => $item->commodity->sku ?? '',
-                'commodity_id' => $item->id,
+                'commodity_id' => $item->commodity->id,
                 'amount' => $item->amount,
                 'name' => $item->commodity->name ?? '',
                 'logistic_number' => $item->package->logistic_number ?? '',

+ 5 - 0
app/Http/Controllers/TestController.php

@@ -94,6 +94,7 @@ use App\Services\StationService;
 use App\Services\StorageService;
 use App\Services\StoreService;
 use App\Services\SyriusTaskService;
+use App\Services\WorkOrderService;
 use App\SortingStation;
 use App\Station;
 use App\StationTask;
@@ -852,4 +853,8 @@ sql;
         }
         return $array;
     }
+
+    public function  workOrder(){
+        dd(route('workOrder.damage.storeApi'));
+    }
 }

+ 1 - 211
app/Http/Controllers/WorkOrderController.php

@@ -48,7 +48,7 @@ class WorkOrderController extends Controller
     {
         if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
 
-        $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderBy('created_at')->orderByDesc('status')->paginate($request['paginate'] ?? 50);
+        $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderByDesc('work_order_status')->orderBy('created_at')->paginate($request['paginate'] ?? 50);
 
         $logistics = Logistic::all();
 
@@ -92,177 +92,6 @@ class WorkOrderController extends Controller
         return ['success' => true, 'data' => $workOrders];
     }
 
-    /**
-     * 创建工单
-     * @param Request $request
-     * @return array
-     * @throws \Illuminate\Contracts\Container\BindingResolutionException
-     */
-    public function storeApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-订单-生成工单'))
-            return ['success' => false, 'message' => '没有对应权限'];
-        $params = $request->all();
-        if (count($params) == 0) return ['success' => false, 'message' => '参数异常'];
-        app('OrderService')->syncOrderByCodes(array_map(function ($param) {
-            return $param['order_no'];
-        }, $params));
-        return $this->service->build($params);
-    }
-
-    /**
-     * 拦截工单
-     * @param WorkOrderRequest $request
-     * @return array|bool[]
-     */
-    public function interceptApi(WorkOrderRequest $request):array
-    {
-        if (Gate::denies('订单管理-订单-生成工单'))
-            return ['success' => false, 'message' => '没有对应权限'];
-
-        $orderNos = $request->input('orderNos',[]);
-
-        $this->orderService->syncOrderByCodes($orderNos);
-
-        $remark = $request->input('remark','拦截工单');
-
-        foreach ($orderNos as $item) {
-            $this->service->createInterceptWorkOrder(['order_no'=>$item,'remark' => $remark]);
-        }
-        return ['success' => true];
-    }
-
-    /**
-     * 信息更改 工单
-     * @param WorkOrderRequest $request
-     * @return array|bool[]
-     */
-    public function informationChangeApi(WorkOrderRequest $request): array
-    {
-        if (Gate::denies('订单管理-订单-生成工单'))
-            return ['success' => false, 'message' => '没有对应权限'];
-        $orderNo = $request->input('order_no','');
-
-        $this->orderService->syncOrderByCodes([$orderNo]);
-
-        $this->service->createInformationChangeWorkOrder(['order_no'=>$orderNo,'remark' => $request->input('remark')]);
-        return ['success' => true];
-    }
-
-    /**
-     * 快递丢件 工单
-     * @param WorkOrderRequest $request
-     * @return array|bool[]
-     */
-    public function lossApi(WorkOrderRequest $request): array
-    {
-        if (Gate::denies('订单管理-订单-生成工单'))
-            return ['success' => false, 'message' => '没有对应权限'];
-
-        $orderNo = $request->input('order_no','');
-
-        $this->orderService->syncOrderByCodes([$orderNo]);
-
-        $this->service->createLossWorkOrder($request->all());
-
-        return ['success' => true];
-    }
-
-    /**
-     * 破损工单
-     * @param WorkOrderRequest $request
-     * @return array|bool[]|false[]
-     */
-    public function damagedApi(WorkOrderRequest $request): array
-    {
-        if (Gate::denies('订单管理-订单-生成工单'))
-            return ['success' => false, 'message' => '没有对应权限'];
-
-        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
-
-        $workOrder = $this->service->createDamagedWorkOrder($request->all());
-
-        if ($workOrder) return ['success' => true];
-        else return ['success' => false];
-    }
-
-    /**
-     * 快递异常
-     * @param Request $request
-     * @return array|bool[]
-     */
-    public function expressAbnormalApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-订单-生成工单'))
-            return ['success' => false, 'message' => '没有对应权限'];
-
-        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
-
-        $this->service->createExpressAbnormalWorkOrder($request->all());
-
-        return ['success' => true];
-    }
-
-    /**
-     * 错漏发
-     * @param Request $request
-     * @return array|bool[]
-     */
-    public function mistakeApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-订单-生成工单'))
-            return ['success' => false, 'message' => '没有对应权限'];
-
-        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
-
-        $this->service->createMistakeWorkOrder($request->all());
-
-        return ['success' => true];
-    }
-
-    /**
-     * 填充丢件
-     * @param Request $request
-     * @return array
-     */
-    public function fillLossApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-订单-宝时编辑') || Gate::denies('订单管理-订单-货主编辑')){
-            return ['success' => false, 'message' => '没有对应权限'];
-        }
-
-        $workOrder = $this->service->find($request->input('id'));
-        $detail = $this->detailService->find($request->input('detail_id'));
-
-        $this->service->fillLossWorkOrder($workOrder,$request->all());
-
-        $workOrder->loadDefaultWith();
-
-        return ['success' => true,'data' => $workOrder];
-    }
-
-    /**
-     * 商家填充丢件信息
-     * @param Request $request
-     * @return array
-     */
-    public function updateLossApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-工单处理-货主编辑'))
-            return ['success' => false, 'message' => '没有对应权限'];
-
-        $workOrder = $this->service->find($request->input('id'));
-        $detail = $this->detailService->find($request->input('detail_id'));
-
-        if (!$workOrder || !$detail) return ['success' => false, 'message' => '参数错误,刷新重试'];
-
-        $workOrder = $this->service->fillLossWorkOrder($workOrder, $detail,$request->all());
-
-        $workOrder->loadDefaultWith();
-
-        return ['success' => true, 'data' => $workOrder];
-    }
-
     public function updateIssueTypeApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-审核'))
@@ -303,45 +132,6 @@ class WorkOrderController extends Controller
         return ['success' => true];
     }
 
-    public function logisticEndApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-工单处理-承运商编辑')) {
-            return ['success' => false, 'message' => '没有对应权限'];
-        }
-
-        $workOrder = $this->service->find($request->input('id'));
-
-        $detail = $this->detailService->find($request->input('detail_id'));
-
-        if (!$workOrder || !$detail) return ['success' => false, 'message' => '参数错误,刷新重试'];
-
-        $this->service->logisticEnd($workOrder,$detail);
-
-        $workOrder->loadDefaultWith();
-
-        return ['success' => true, 'data' => $workOrder];
-    }
-
-    /**
-     * 宝时终审
-     * @param Request $request
-     * @return array
-     */
-    public function baoShiReviewApi(Request $request): array
-    {
-        if (Gate::denies('订单管理-工单处理-客服编辑')) {
-            return ['success' => false, 'message' => '没有对应权限'];
-        }
-        $workOrder = $this->service->find($request->input('id'));
-        $detail = $this->detailService->find($request->input('detail_id'));
-
-        if (!$workOrder || !$detail) return ['success' => false, 'message' => '参数异常'];
-
-        $this->service->baoShiReview($workOrder,$detail,$request->input('commodities'));
-        $workOrder->loadDefaultWith();
-
-        return ['success' => true,'data' => $workOrder];
-    }
 
     public function checkWorkOrderApi(Request $request): array
     {

+ 65 - 0
app/Http/Controllers/WorkOrderDamageController.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\OrderService;
+use App\Services\WorkOrderDamageService;
+use App\WorkOrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderDamageController extends Controller
+{
+    /**
+     *  处理 破损 工单
+     * @var WorkOrderDamageService $service
+     * @var OrderService $orderService
+     */
+    private $service;
+    private $orderService;
+
+    public function __construct()
+    {
+        $this->service = app('WorkOrderDamageService');
+        $this->orderService = app('OrderService');
+    }
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+        try {
+            $this->service->store($request->all());
+            return ['success' => true];
+        } catch (\Exception $e) {
+            return ['success' => false,'message' => $e->getMessage()];
+        }
+    }
+
+    public function logisticHandleApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->logisticHandle($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+
+    public function baoShiReviewApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->baoShiReviewDamage($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+
+
+}

+ 57 - 0
app/Http/Controllers/WorkOrderExpressAbnormalController.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\OrderService;
+use App\Services\WorkOrderExpressAbnormalService;
+use App\WorkOrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderExpressAbnormalController extends Controller
+{
+    /**
+     * @var WorkOrderExpressAbnormalService $service
+     * @var OrderService $orderService
+     */
+    private $service;
+    private $orderService;
+    public function __construct()
+    {
+        $this->service = app('WorkOrderExpressAbnormalService');
+        $this->orderService = app('OrderService');
+    }
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+        $this->service->store($request->all());
+        return ['success' => true];
+    }
+
+    public function logisticHandleApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->logisticHandle($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+
+    public function baoShiReviewApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->baoShiReviewDamage($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+}

+ 47 - 0
app/Http/Controllers/WorkOrderInformationChangeController.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\OrderService;
+use App\Services\WorkOrderInformationChangeService;
+use App\WorkOrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderInformationChangeController extends Controller
+{
+    /**
+     * @var WorkOrderInformationChangeService $service
+     * @var OrderService $orderService
+     */
+    private $service;
+    private $orderService;
+    public function __construct()
+    {
+        $this->service = app('WorkOrderInformationChangeService');
+        $this->orderService = app('OrderService');
+    }
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $orderNo = $request->input('order_no','');
+        $this->orderService->syncOrderByCodes([$orderNo]);
+        $this->service->store($request->all());
+        return ['success' => true];
+    }
+
+    public function logisticHandlerApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->find($request->input('detail_id'));
+        if (!$detail){
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $this->service->endInformationChange($detail);
+        $data = $this->service->getDefaultWith($detail->work_order_id);
+        return ['success' => true,'data' => $data];
+    }
+}

+ 46 - 0
app/Http/Controllers/WorkOrderInterceptController.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Controllers;
+
+
+use App\Services\OrderService;
+use App\Services\WorkOrderInterceptService;
+use App\WorkOrder;
+use App\WorkOrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderInterceptController extends Controller
+{
+    /**
+     * @var WorkOrderInterceptService $service
+     * @var OrderService orderService
+     */
+    private $service;
+    private $orderService;
+    public function __construct()
+    {
+        $this->service = app("WorkOrderInterceptService");
+        $this->orderService = app("OrderService");
+    }
+
+    public function storeApi(Request $request):array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $this->orderService->syncOrderByCodes([$request->input('orderNos')]);
+        $this->service->store($request->all());
+        return ['success' => true];
+    }
+
+    public function logisticHandlerApi(Request $request):array{
+        if (Gate::denies('订单管理-工单处理-承运商编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->find($request->input('detail_id'));
+        $this->service->endIntercept($detail);
+        $data = $this->service->getDefaultWith($detail->work_order_id);
+        return ['success' => true,'data' => $data];
+    }
+
+
+}

+ 65 - 0
app/Http/Controllers/WorkOrderLossController.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\OrderService;
+use App\Services\WorkOrderLossService;
+use App\WorkOrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderLossController extends Controller
+{
+
+    /**
+     * @var WorkOrderLossService $service
+     * @var OrderService $orderService
+     */
+    private $service;
+    private $orderService;
+    public function __construct()
+    {
+        $this->service = app('WorkOrderLossService');
+        $this->orderService = app('OrderService');
+    }
+
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $this->orderService->syncOrderByCodes([$request->input('order_no','')]);
+        $this->service->store($request->all());
+        return ['success' => true];
+    }
+
+    public function ownerFillDetailsApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-货主编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->find($request->input('detail_id'));
+        if (!$detail){
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        $this->service->ownerFillDetail($detail,$request->all());
+        $data = $this->service->getDefaultWith($detail->work_order_id);
+        return ['success' => true,'data'=>$data];
+    }
+
+    public function baoShiReviewApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail||!$workOrder) return ['success' => false, 'message' => '参数异常'];
+        $this->service->baoShiReviewLoss($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+
+
+
+
+}

+ 60 - 0
app/Http/Controllers/WorkOrderMistakeController.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\OrderService;
+use App\Services\WorkOrderMistakeService;
+use App\WorkOrderDetail;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class WorkOrderMistakeController extends Controller
+{
+    /**
+     * @var WorkOrderMistakeService $service
+     * @var OrderService $orderService
+     */
+    private $service;
+    private $orderService;
+    public function __construct()
+    {
+        $this->service = app('WorkOrderMistakeService');
+        $this->orderService = app('OrderService');
+    }
+
+    public function storeApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $this->orderService->syncOrderByCodes([$request->input('order_no')]);
+        $this->service->store($request->all());
+        return ['success' => true];
+    }
+
+    public function baoShiReviewApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->baoShiReview($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+
+    }
+
+    public function ownerReviewAndEndApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑'))
+            return ['success' => false, 'message' => '没有对应权限'];
+        $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
+        $workOrder = $detail->workOrder;
+        if (!$detail || !$workOrder) return ['success' => false,'message' => '参数异常'];
+        $this->service->ownerReviewAndEnd($detail,$request->all());
+        $workOrder->loadDefaultWith();
+        return ['success' => true,'data' => $workOrder];
+    }
+
+
+}

+ 12 - 0
app/Providers/AppServiceProvider.php

@@ -194,6 +194,12 @@ use App\Services\WorkOrderLogService;
 use App\Services\OrderIssueTypeService;
 use App\Services\ReplenishmentService;
 use App\Services\ObligationService;
+use App\Services\WorkOrderInterceptService;
+use App\Services\WorkOrderInformationChangeService;
+use App\Services\WorkOrderExpressAbnormalService;
+use App\Services\WorkOrderMistakeService;
+use App\Services\WorkOrderDamageService;
+use App\Services\WorkOrderLossService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -393,9 +399,15 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('WaybillService', WaybillService::class);
         app()->singleton('WeighExceptedService', WeighExceptedService::class);
         app()->singleton('WorkOrderCommoditiesService',WorkOrderCommoditiesService::class);
+        app()->singleton('WorkOrderDamageService',WorkOrderDamageService::class);
         app()->singleton('WorkOrderDetailService',WorkOrderDetailService::class);
+        app()->singleton('WorkOrderExpressAbnormalService',WorkOrderExpressAbnormalService::class);
         app()->singleton('WorkOrderImageService',WorkOrderImageService::class);
+        app()->singleton('WorkOrderInformationChangeService',WorkOrderInformationChangeService::class);
+        app()->singleton('WorkOrderInterceptService',WorkOrderInterceptService::class);
         app()->singleton('WorkOrderLogService',WorkOrderLogService::class);
+        app()->singleton('WorkOrderLossService',WorkOrderLossService::class);
+        app()->singleton('WorkOrderMistakeService',WorkOrderMistakeService::class);
         app()->singleton('WorkOrderProcessLogService',WorkOrderProcessLogService::class);
         app()->singleton('WorkOrderService',WorkOrderService::class);
         app()->singleton('WorkOrderTypeService',WorkOrderTypeService::class);

+ 67 - 0
app/Services/WorkOrderDamageService.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace App\Services;
+
+/**
+ * 处理 破损 工单
+ * Class WorkOrderDamageService
+ * @package App\Services
+ */
+class WorkOrderDamageService extends WorkOrderService
+{
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     * @var OrderService $orderService
+     */
+    private $logService;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+    public function __construct()
+    {
+        parent::__construct();
+        $this->logService = app('WorkOrderLogService');
+        $this->detailService = app('WorkOrderDetailService');
+        $this->issueTypeService = app('OrderIssueTypeService');
+        $this->orderService = app('OrderService');
+    }
+
+    /*
+     * 破损工单处理流程
+     * 1:创建工单
+     * 2:快递处理
+     * 3: 宝时终审
+     */
+
+    public function store($params){
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '破损']);
+        $order = $this->orderService->first(['code' => $params['order_no']]);
+        $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '');
+        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $this->logService->createLog($detail, '创建', '创建工单');
+        $workOrder->changeStatus('承运商处理');
+        $detail->changeStatus('宝时处理');
+    }
+
+    public function logisticHandle($detail,$params)
+    {
+        $this->detailService->updateDetail($detail,$params);
+        $detail->changeStatus('宝时终审');
+        $detail->workOrder->clearWorkOrderStatus();
+        $detail->workOrder->changeStatus('宝时终审');
+        $this->logService->createLog($detail, '处理', '承运商处理');
+    }
+
+    public function baoShiReviewDamage($detail,$params)
+    {
+        $this->detailService->updateDetail($detail,$params);
+        $this->logService->createLog($detail, '终审', '终审');
+        $this->logService->createLog($detail, '完结', '完结');
+        $detail->changeStatus('完成');
+        $detail->workOrder->changeStatus('完成');
+        $this->detailService->endDetail($detail);
+    }
+
+}

+ 23 - 10
app/Services/WorkOrderDetailService.php

@@ -30,16 +30,11 @@ class WorkOrderDetailService
     public function createWorkOrderDetail(WorkOrder $workOrder,$params): WorkOrderDetail
     {
         $param  = (new WorkOrderDetail($params))->getAttributes();
-
         $param['order_issue_type_id'] = $workOrder['order_issue_type_id'];
         $param['remark'] = $workOrder['remark'];
-
         $detail = $workOrder->details()->create($param);
-
         $this->commodityService->createWorkOrderCommoditiesByJsonArray($detail, $params['commodities'] ?? []);
-
         $this->imageService->createWorkOrderImages($detail,$params);
-
         return $detail;
     }
 
@@ -51,14 +46,28 @@ class WorkOrderDetailService
     public function fillLossDetail(WorkOrderDetail $detail,$params)
     {
         $param = (new WorkOrderDetail($params))->getAttributes();
-
         $detail->update($param);
-
         $this->imageService->createWorkOrderImages($detail, $params);                                                   // 图片信息
-
         $this->commodityService->createWorkOrderCommoditiesByJsonArray($detail, $params['commodities'] ?? []);          // 商品信息
+    }
+
+    /**
+     * 更新详情
+     * @param WorkOrderDetail $detail
+     * @param $params
+     */
+    public function updateLossDetail(WorkOrderDetail $detail,$params)
+    {
+        $param = (new WorkOrderDetail($params))->getAttributes();
+        $detail->update($param);
+        $this->commodityService->updateWorkOrderCommoditiesByJsonArray($detail,$params['commodities'] ?? []);
+    }
 
-        $this->logService->createLog($detail, '处理', '填充丢件信息');                                                    // 创建日志
+    public function updateDetail(WorkOrderDetail $detail,$params)
+    {
+        $param = (new WorkOrderDetail($params))->getAttributes();
+        $detail->update($param);
+        $this->commodityService->updateWorkOrderCommoditiesByJsonArray($detail,$params['commodities'] ?? []);
     }
 
     /**
@@ -96,13 +105,17 @@ class WorkOrderDetailService
         $this->logService->endDetail($detail);
     }
 
+
     /**
      * @param WorkOrder $workOrder
      */
     public function undoneTagsByWorkOrder(WorkOrder $workOrder)
     {
         foreach ($workOrder->details ?? [] as $detail){
-            if ($detail->tag !== '完成' && $detail->tag !== '标记'){
+            // 判断是否为完成
+            if($detail->status == '完成' || $detail->status == 5){
+                continue;
+            } else {
                 $this->undoneTag($detail);
             }
         }

+ 69 - 0
app/Services/WorkOrderExpressAbnormalService.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace App\Services;
+
+
+///**
+// * 处理 快递异常 工单
+// */
+class WorkOrderExpressAbnormalService
+{
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     * @var OrderService $orderService
+     * @var WorkOrderService $workOrderService
+     */
+    private $logService;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+    private $workOrderService;
+    public function __construct()
+    {
+        $this->logService = app('WorkOrderLogService');
+        $this->detailService = app('WorkOrderDetailService');
+        $this->issueTypeService = app('OrderIssueTypeService');
+        $this->orderService = app('OrderService');
+        $this->workOrderService = app('WorkOrderService');
+    }
+
+    /*
+     * 快递异常处理流程
+     * 1:创建
+     * 2:承运商处理
+     * 3: 完成
+     * */
+
+    public function store($params)
+    {
+        $order = $this->orderService->first(['code' => $params['order_no']]);
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递异常']);
+        $workOrder = $this->workOrderService->createOrResetWorkOrder($order, $issueType, $params['remark'] ?? '');
+        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $workOrder->changeStatus('承运商处理');
+        $detail->changeStatus('宝时处理');
+        $this->logService->createLog($detail, '创建', '创建工单');
+    }
+
+    public function logisticHandle($detail,$params)
+    {
+        $this->detailService->updateDetail($detail,$params);
+        $detail->changeStatus('宝时终审');
+        $detail->workOrder->clearWorkOrderStatus();
+        $detail->workOrder->changeStatus('宝时终审');
+        $this->logService->createLog($detail, '处理', '承运商处理');
+    }
+
+    public function end($detail,$params)
+    {
+        $this->detailService->updateDetail($detail,$params);
+        $this->logService->createLog($detail, '终审', '终审');
+        $this->logService->createLog($detail, '完结', '完结');
+        $detail->changeStatus('完成');
+        $detail->workOrder->changeStatus('完成');
+        $this->detailService->endDetail($detail);
+    }
+
+}

+ 4 - 4
app/Services/WorkOrderImageService.php

@@ -35,7 +35,7 @@ class WorkOrderImageService
         /** @var UploadedFile $image */
         $count = $detail->images()->where('type', 1)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $detail->images()->create(['type' => 1, 'number' => ++$count]);
+        $workOrderImage = $detail->images()->create(['type' => 1, 'number' => ++$count,'work_order_id'=> $detail->work_order_id]);
         $workOrderImage->saveFile($image);
     }
 
@@ -60,7 +60,7 @@ class WorkOrderImageService
         /** @var UploadedFile $image */
         $count = $detail->images()->where('type', 2)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $detail->images()->create(['type' => 2, 'number' => ++$count]);
+        $workOrderImage = $detail->images()->create(['type' => 2, 'number' => ++$count,'work_order_id'=> $detail->work_order_id]);
         $workOrderImage->saveFile($image);
     }
 
@@ -81,7 +81,7 @@ class WorkOrderImageService
         /** @var UploadedFile $image */
         $count = $detail->images()->where('type', 3)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $detail->images()->create(['type' => 3, 'number' => ++$count]);
+        $workOrderImage = $detail->images()->create(['type' => 3, 'number' => ++$count,'work_order_id'=> $detail->work_order_id]);
         $workOrderImage->saveFile($image);
     }
 
@@ -102,7 +102,7 @@ class WorkOrderImageService
         /** @var UploadedFile $image */
         $count = $detail->images()->where('type', 4)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $detail->images()->create(['type' => 4, 'number' => ++$count]);
+        $workOrderImage = $detail->images()->create(['type' => 4, 'number' => ++$count,'work_order_id'=> $detail->work_order_id]);
         $workOrderImage->saveFile($image);
     }
 

+ 61 - 0
app/Services/WorkOrderInformationChangeService.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Services;
+
+use App\WorkOrder;
+use App\WorkOrderDetail;
+
+/**
+ * 处理  信息修改 工单
+ * Class WorkOrderInformationChangeService
+ * @package App\Services
+ */
+class WorkOrderInformationChangeService extends WorkOrderService
+{
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     * @var OrderService $orderService
+     */
+    private $logService;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+    public function __construct()
+    {
+        parent::__construct();
+        $this->logService = app('WorkOrderLogService');
+        $this->detailService = app('WorkOrderDetailService');
+        $this->issueTypeService = app('OrderIssueTypeService');
+        $this->orderService = app('OrderService');
+    }
+
+    /*
+     * 处理流程:
+     * 1:创建
+     * 2:承运商处理
+     * 2:完结工单
+     */
+
+    public function store($params)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
+        $order = $this->orderService->first(['code' => $params['order_no']]);
+        $workOrder = $this->createAndNotification($order, $issueType, $params['remark'] ?? '');
+        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $workOrder->changeStatus('承运商处理');
+        $detail->changeStatus('承运商处理');
+        $this->logService->createLog($detail, '创建', '创建工单');
+    }
+
+    public function endInformationChange(WorkOrderDetail $detail)
+    {
+        $this->logService->createLog($detail, '完结', '运商完结');
+        $detail->changeStatus('完成');
+        $detail->workOrder->clearWorkOrderStatus();
+        $detail->workOrder->changeStatus('完成');
+        $this->detailService->endDetail($detail);
+
+    }
+}

+ 66 - 0
app/Services/WorkOrderInterceptService.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace App\Services;
+
+use App\WorkOrder;
+use App\WorkOrderDetail;
+
+/**
+ * 处理 拦截 工单
+ * Class WorkOrderInterceptService
+ * @package App\Services
+ */
+class WorkOrderInterceptService extends WorkOrderService
+{
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     * @var OrderService $orderService
+     */
+    private $logService;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+    private $workOrderService;
+
+    public function __construct()
+    {
+        parent::__construct();
+        $this->logService = app('WorkOrderLogService');
+        $this->detailService = app('WorkOrderDetailService');
+        $this->issueTypeService = app('OrderIssueTypeService');
+        $this->orderService = app('OrderService');
+        $this->workOrderService = app('WorkOrderService');
+    }
+
+    /*
+    * 拦截工单处理流程
+    * 1:创建
+    * 2:承运商处理完结
+    */
+
+
+    public function store($params)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '拦截']);
+        $order = $this->orderService->first(['code' => $params['orderNos']]);
+        $workOrder = $this->workOrderService->createAndNotification($order, $issueType, $param['remark'] ?? '');
+        $workOrder->changeStatus('承运商处理');
+        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $this->logService->createLog($detail, '创建', '创建');
+        $workOrder->changeStatus('承运商处理');
+    }
+
+
+    // 完结拦截工单
+    public function endIntercept(WorkOrderDetail $detail)
+    {
+        $this->logService->createLog($detail, '完结', '承运商完结');
+        $detail->changeStatus('完成');
+        $detail->workOrder->clearWorkOrderStatus();
+        $detail->workOrder->changeStatus('完成');
+        $this->detailService->endDetail($detail);
+    }
+
+}

+ 78 - 0
app/Services/WorkOrderLossService.php

@@ -0,0 +1,78 @@
+<?php
+
+namespace App\Services;
+
+
+use App\WorkOrder;
+use App\WorkOrderDetail;
+
+/**
+ * 处理 快递丢件 工单
+ * Class WorkOrderLossService
+ * @package App\Services
+ */
+class WorkOrderLossService extends WorkOrderService
+{
+
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     * @var OrderService $orderService
+     * @var WorkOrderService $workOrderService
+     */
+    private $logService;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+    private $workOrderService;
+
+    public function __construct()
+    {
+        parent::__construct();
+        $this->logService = app('WorkOrderLogService');
+        $this->detailService = app('WorkOrderDetailService');
+        $this->issueTypeService = app('OrderIssueTypeService');
+        $this->orderService = app('OrderService');
+        $this->workOrderService = app('WorkOrderService');
+    }
+
+   /*
+   * 快递丢件处理流程
+   * 1: 创建 (限定宝时创建)
+   * 2: 商家填充商品信息
+   * 3: 宝时终审
+   */
+
+    // 创建
+    public function store($params)
+    {
+        $orderIssueType = $this->issueTypeService->firstOrCreate(['name' => '快递丢件']);
+        $order = $this->orderService->first(['code' => $params['order_no']]);
+        $workOrder = $this->workOrderService->createAndNotification($order, $orderIssueType, $params['remark'] ?? '');
+        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $workOrder->changeStatus('货主处理');
+        $detail->changeStatus('货主处理');
+        $this->logService->createLog($detail, '创建', '创建工单');
+    }
+
+    // 商家填充商品信息
+    public function ownerFillDetail($detail,$params)
+    {
+        $this->detailService->fillLossDetail($detail, $params);
+        $detail->changeStatus('宝时终审');
+        $detail->workOrder->changeStatus('宝时终审');
+        $detail->workOrder->clearWorkOrderStatus();
+        $this->logService->createLog($detail, '处理', '填充丢件信息');
+    }
+
+    // 宝时审核
+    public function baoShiReviewLoss($detail,$params)
+    {
+        $this->logService->createLog($detail, '完结', '宝时完结');
+        $this->detailService->updateLossDetail($detail,$params);
+        $detail->changeStatus('完成');
+        $detail->workOrder->changeStatus('完成');
+        $this->detailService->endDetail($detail);
+    }
+}

+ 72 - 0
app/Services/WorkOrderMistakeService.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Services;
+
+use App\WorkOrder;
+use App\WorkOrderDetail;
+
+/**
+ * 处理 错漏发 工单
+ * Class WorkOrderMistakeService
+ * @package App\Services
+ */
+class WorkOrderMistakeService
+{
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     * @var OrderService $orderService
+     * @var WorkOrderService $workOrderService
+     */
+    private $logService;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+    private $workOrderService;
+    public function __construct()
+    {
+        $this->logService = app('WorkOrderLogService');
+        $this->detailService = app('WorkOrderDetailService');
+        $this->issueTypeService = app('OrderIssueTypeService');
+        $this->orderService = app('OrderService');
+        $this->workOrderService = app('WorkOrderService');
+    }
+    /*
+     * 错漏发处理流程
+     * 1:创建错漏发工单
+     * 2:宝时审核商品数量
+     * 3:商家进行处理结果填充
+     */
+
+    public function store($params)
+    {
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '错漏发']);
+        $order = $this->orderService->first(['code' => $params['order_no']]);
+        $workOrder = $this->workOrderService->createAndNotification($order, $issueType, $params['remark'] ?? '');
+        $detail = $this->detailService->createWorkOrderDetail($workOrder, $params);
+        $this->logService->createLog($detail, '创建', '创建');
+        $workOrder->changeStatus('宝时处理');
+        $detail->changeStatus('宝时处理');
+    }
+
+    public function baoShiReview(WorkOrderDetail $detail,$params)
+    {
+        $this->detailService->updateDetail($detail,$params);
+        $detail->changeStatus('待货主完结');
+        $detail->workOrder->clearWorkOrderStatus();
+        $detail->workOrder->changeStatus('待货主完结');
+        $this->logService->createLog($detail, '处理', '承运商处理');
+    }
+
+    public function ownerReviewAndEnd(WorkOrderDetail $detail,$params)
+    {
+        $this->detailService->updateDetail($detail,$params);
+        $this->logService->createLog($detail, '处理', '货主处理');
+        $this->logService->createLog($detail, '完结', '货主完结');
+        $detail->changeStatus('完成');
+        $detail->workOrder->changeStatus('完成');
+        $this->detailService->endDetail($detail);
+    }
+
+}

+ 12 - 177
app/Services/WorkOrderService.php

@@ -2,14 +2,12 @@
 
 namespace App\Services;
 
-use App\Order;
 use App\OrderIssue;
 use App\OrderIssueType;
 use App\OrderPackage;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
 use App\WorkOrderDetail;
-use App\WorkOrderProcessLog;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Carbon;
@@ -53,53 +51,29 @@ class WorkOrderService
      */
     public function getIssueType()
     {
-        if (Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')) {
+        if (Gate::allows('订单管理-工单处理-客服编辑')){
             return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get();
+        } else if (Gate::allows('订单管理-工单处理-货主编辑')) {
+            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损',])->get();
         } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
-            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '破损', '快递丢件', '快递异常'])->get();
+            return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '破损', '快递异常'])->get();
         }
         return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get();
     }
 
-    /**
-     * 生成工单
-     * @param $params
-     * @return array|bool[]
-     */
-    public function build($params): array
-    {
-        foreach ($params as $param) {
-            $type_name = $param['order_issue_type'];
-            if ('拦截' == $type_name) {
-                $this->createInterceptWorkOrder($param);
-            } else if ('信息更改' == $type_name) {
-                $this->createInformationChangeWorkOrder($param);
-            } else if ('快递异常' == $type_name) {
-                $this->createExpressAbnormalWorkOrder($param);
-            } else if ('错漏发' == $type_name) {
-                $this->createMistakeWorkOrder($param);
-            } else if ('破损' == $type_name) {
-                $this->createDamagedWorkOrder($param);
-            } else if ('快递丢件' == $type_name) {
-                $this->createLossWorkOrder($param);
-            }
-        }
-        return ['success' => true];
-    }
 
     public function createOrResetWorkOrder($order, $issueType, $remark)
     {
         $user = Auth::user();
         $workOrder = WorkOrder::query()->where('order_id', $order->id)->orderByDesc('created_at')->first();
         if ($workOrder) {
-
             $this->detailService->undoneTagsByWorkOrder($workOrder);
-
             $workOrder->update([
                 'remark' => $remark,
                 'order_issue_type_id' => $issueType->id,
                 'creator_id' => $user['id'] ?? '',
                 'status' => 0,
+                'work_order_status' => 1,
             ]);
             return $workOrder;
         }
@@ -113,6 +87,7 @@ class WorkOrderService
             'order_issue_type_id' => $issueType->id,
             'uniquely_tag' => $order->code,
             'status' => 0,
+            'work_order_status' => 1,
         ]);
     }
 
@@ -126,149 +101,6 @@ class WorkOrderService
         return $workOrder;
     }
 
-    /**
-     * 拦截
-     */
-    public function createInterceptWorkOrder($param): WorkOrder
-    {
-        $issueType = $this->issueTypeService->firstOrCreate(['name' => '拦截']);
-
-        $order = $this->orderService->first(['code' => $param['order_no']]);
-
-        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '拦截工单');
-
-        $detail = $this->detailService->createWorkOrderDetail($workOrder,$param);
-
-        $workOrder->changeStatus('承运商处理');
-
-        $this->logService->createLog($detail, '创建', '创建');
-
-        return $workOrder;
-    }
-
-    /**
-     * 错漏发
-     */
-    public function createMistakeWorkOrder($param): WorkOrder
-    {
-        $issueType = $this->issueTypeService->firstOrCreate(['name' => '错漏发']);
-
-        $order = $this->orderService->first(['code' => $param['order_no']]);
-
-        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
-
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $param);
-
-        $this->logService->createLog($detail, '创建', '创建');
-
-        $workOrder->changeStatus('宝时处理');
-
-        $detail->changeStatus('宝时处理');
-
-        return $workOrder;
-    }
-
-    /**
-     * 破损
-     */
-    public function createDamagedWorkOrder($param): WorkOrder
-    {
-        $issueType = $this->issueTypeService->firstOrCreate(['name' => '破损']);
-
-        $order = $this->orderService->first(['code' => $param['order_no']]);
-
-        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
-
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $param);
-
-        $this->logService->createLog($detail, '创建', '创建工单');
-
-        $workOrder->changeStatus('承运商处理');
-
-        $detail->changeStatus('宝时处理');
-
-        return $workOrder;
-    }
-
-    /***
-     * 快递异常
-     */
-    public function createExpressAbnormalWorkOrder($param): WorkOrder
-    {
-        $order = $this->orderService->first(['code' => $param['order_no']]);
-
-        $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递异常']);
-
-        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
-
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $param);
-
-        $workOrder->changeStatus('承运商处理');
-
-        $detail->changeStatus('宝时处理');
-
-        $this->logService->createLog($detail, '创建', '创建工单');
-
-        return $workOrder;
-    }
-
-    /***
-     * 信息更改
-     */
-    public function createInformationChangeWorkOrder($param): WorkOrder
-    {
-        $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
-
-        $order = $this->orderService->first(['code' => $param['order_no']]);
-
-        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
-
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $param);
-
-        $workOrder->changeStatus('承运商处理');
-
-        $detail->changeStatus('承运商处理');
-
-        $this->logService->createLog($detail, '创建', '创建工单');
-
-        return $workOrder;
-    }
-
-    /**
-     * 快递丢件
-     */
-    public function createLossWorkOrder($param): WorkOrder
-    {
-        $orderIssueType = $this->issueTypeService->firstOrCreate(['name' => '快递丢件']);
-
-        $order = $this->orderService->first(['code' => $param['order_no']]);
-
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $param['remark'] ?? '');
-
-        $detail = $this->detailService->createWorkOrderDetail($workOrder, $param);
-
-        $workOrder->changeStatus('货主处理');
-
-        $detail->changeStatus('货主处理');
-
-        $this->logService->createLog($detail, '创建', '创建工单');
-
-        return $workOrder;
-    }
-
-    /**
-     *  填充丢件信息
-     */
-    public function fillLossWorkOrder(WorkOrder $workOrder,WorkOrderDetail $detail, $params): WorkOrder
-    {
-        $this->detailService->fillLossDetail($detail,$params);
-
-        $detail->changeStatus('宝时终审');
-
-        $workOrder->changeStatus('宝时终审');
-
-        return $this->getDefaultWith($workOrder->id);
-    }
 
     /**
      * @param WorkOrder $workOrder
@@ -277,8 +109,9 @@ class WorkOrderService
     public function end(WorkOrder $workOrder, WorkOrderDetail $detail)
     {
         $this->detailService->endDetail($detail);
-        $this->logService->createLog('完结', '完结工单');
-        $workOrder->end();
+        $this->logService->createLog($detail,'完结', '完结工单');
+        $workOrder->clearWorkOrderStatus();
+        $workOrder->changeStatus('完成');
     }
 
     /**
@@ -289,6 +122,7 @@ class WorkOrderService
     {
         $this->logService->createLog($detail,'完结', '承运商完结工单');
         $this->detailService->endDetail($detail);
+        $workOrder->clearWorkOrderStatus();
         $workOrder->changeStatus('完成');
     }
 
@@ -438,6 +272,7 @@ class WorkOrderService
         $workOrders = WorkOrder::query()->with('order')->whereIn('order_id', function ($query) use ($orderNos) {
             $query->from('orders')->select('id')->whereIn('code', $orderNos);
         })->get();
+
         $tags = [];
         $workOrders->each(function ($workOrder) use (&$tags) {
             $order_code = $workOrder->order->code ?? null;
@@ -451,7 +286,7 @@ class WorkOrderService
     }
 
     /**
-     * 校验工单是否存在
+     * 校验工单是否存在c
      * @param $nos
      * @return mixed
      */

+ 7 - 1
app/WorkOrder.php

@@ -34,6 +34,7 @@ class WorkOrder extends Model
         'order_id',                 // 订单id
         'uniquely_tag',             // 唯一标识
         'remark',                   // 工单信息描述
+        'work_order_status',        // 1 为创建状态 0 为处理状态
     ];
 
     static public $enums = [
@@ -44,6 +45,7 @@ class WorkOrder extends Model
             '承运商处理' => 3,
             '宝时终审' => 4,
             '完成' => 5,
+            '待货主完结' => 6,
         ],
 
     ];
@@ -181,7 +183,7 @@ class WorkOrder extends Model
     // 工单完结
     public function end()
     {
-        $this->update(['status' => 4]);
+        $this->update(['status' => 5,'work_order_status' => 0]);
     }
 
     public function changeStatus($status)
@@ -189,4 +191,8 @@ class WorkOrder extends Model
         $this->status = $status;
         $this->update();
     }
+
+    public function clearWorkOrderStatus(){
+        $this->update(['work_order_status' => 0]);
+    }
 }

+ 3 - 2
app/WorkOrderCommodities.php

@@ -26,7 +26,7 @@ class WorkOrderCommodities extends Model
         'abnormal_type',        // 问题类型  (商品问题类型)
         'abnormal_amount',      // 异常数量  (默认为订单数量) 错漏发 (客户实收数量)
         'amount',               // 订单数量  (原订单商品数量)
-        'check_result',         // 核实结果  (核实)
+        'check_result',         // 核实结果  (核实 承运商
         'process_result',       // 处理结果  终审填充(破损:[赔偿,不赔偿] 错漏发:[少发,多发,’多发,客户退回‘,’少发,不补发‘,核实未错漏发])
         'process_result_info',  // 处理结果详情 -----------------------------------
                                 // (错漏发: string 为选项类型 与 process_result 相关
@@ -40,7 +40,7 @@ class WorkOrderCommodities extends Model
 
     static public $enums = [
         'tag' => [
-            '' => 0,
+            '创建' => 0,
             '完成' => 1,
             '标记' => 2, // 工单重新创建,未完成原始数据进行历史标记,完成原始数据不进行处理
         ],
@@ -56,6 +56,7 @@ class WorkOrderCommodities extends Model
 
     public function getTagAttribute($value)
     {
+        if (is_numeric($value)) return self::$enums['tag'][$value];
         if (!$value) return '';
         return self::$enums['tag'][$value];
     }

+ 3 - 1
app/WorkOrderDetail.php

@@ -36,9 +36,10 @@ class WorkOrderDetail extends Model
             '承运商处理' => 3,
             '宝时终审' => 4,
             '完成' => 5,
+            '待货主完结' => 6,
         ],
         'tag' => [
-            '' => 0,
+            '创建' => 0,
             '完成' => 1,
             '标记' => 2,
         ],
@@ -70,6 +71,7 @@ class WorkOrderDetail extends Model
 
     public function getTagAttribute($value)
     {
+        if (is_numeric($value)) return self::$enums['tag'][$value];
         if (!$value) return '';
         return self::$enums['tag'][$value];
     }

+ 7 - 6
app/WorkOrderImage.php

@@ -38,7 +38,7 @@ class WorkOrderImage extends Model
             '退款成功截图' => 4,
         ],
         'tag' => [
-            '' => 0,
+            '创建' => 0,
             '完成' => 1,
             '标记' => 2,
         ],
@@ -69,19 +69,20 @@ class WorkOrderImage extends Model
         }
     }
 
-    public function getStatusAttribute($value)
+    public function getTagAttribute($value)
     {
+        if($value == 0) return self::$enums['tag'][$value];
         if (!$value) return '';
-        return self::$enums['status'][$value];
+        return self::$enums['tag'][$value];
     }
 
-    public function setStatusAttribute($value)
+    public function setTagAttribute($value)
     {
         if (!$value) return;
         if (is_numeric($value)) {
-            $this->attributes['status'] = $value;
+            $this->attributes['tag'] = $value;
         } else {
-            $this->attributes['status'] = self::$enums['status'][$value];
+            $this->attributes['tag'] = self::$enums['tag'][$value];
         }
     }
 

+ 1 - 1
app/WorkOrderLog.php

@@ -30,7 +30,7 @@ class WorkOrderLog extends Model
             '完结' => 4,
         ],
         'tag' => [
-            '' => 0,
+            '创建' => 0,
             '完结' => 1,
             '标记' => 2,
         ],

+ 16 - 12
resources/views/order/index/_work_order_modal.blade.php

@@ -137,13 +137,13 @@
                         <table class="table table-sm table-active table-grid-row">
                             <thead>
                             <tr>
-                                <td class="text-center">快递单号</td>
-                                <td class="text-center">商品条码</td>
-                                <td class="text-center" v-if="['破损',].includes(workOrder.orderIssueType)">异常类型</td>
-                                <td class="text-center">商品名称</td>
-                                <td class="text-center">订单数量</td>
-                                <td class="text-center" v-if="'破损' === workOrder.orderIssueType">破损商品价值</td>
-                                <td v-if="'错漏发' === workOrder.orderIssueType">异常类型</td>
+                                <td>快递单号</td>
+                                <td>商品条码</td>
+                                <td v-if="['破损',].includes(workOrder.orderIssueType)">异常类型</td>
+                                <td>商品名称</td>
+                                <td>订单数量</td>
+                                <td v-if="'破损' === workOrder.orderIssueType" class="text-right">破损商品价值</td>
+                                <td v-if="'错漏发' === workOrder.orderIssueType" class="text-right">异常类型</td>
                                 <td class="text-center"><span
                                         v-text="workOrder.orderIssueType === '错漏发' ? '客户实收数量' : '异常数量'"></span></td>
                                 <td></td>
@@ -151,7 +151,8 @@
                             </thead>
                             <tbody>
                             <tr v-for="(commodity,i) in workOrder.commodities" class="text-center">
-                                <td v-text="commodity.logistic_number"></td>
+                                <td v-if="commodity.count" v-text="commodity.logistic_number" class="align-middle border border-left border-bottom" :rowspan="commodity.count">
+                                </td>
                                 <td v-text="commodity.sku"></td>
                                 <td v-if="['破损',].includes(workOrder.orderIssueType)">
                                     <span v-if="workOrder.orderIssueType === '破损'"
@@ -159,23 +160,25 @@
                                 </td>
                                 <td v-text="commodity.name"></td>
                                 <td v-text="commodity.amount"></td>
-                                <td class="text-center" v-if="'破损' === workOrder.orderIssueType">
+                                <td  v-if="'破损' === workOrder.orderIssueType">
                                     <input type="number" class="form-control form-control-sm" v-model="commodity.price"
                                            v-show="commodity.abnormal_amount !== '0'"
                                            @input="sunPrice">
                                 </td>
                                 <td v-if="'错漏发' === workOrder.orderIssueType" v-text="commodity.abnormal_type">
                                 </td>
-                                <td>
+                                <td class="text-right">
                                     <input type="number" class="form-control form-control-sm"
                                            v-model="commodity.abnormal_amount"
                                            @input="computeAbnormalType(commodity)">
                                 </td>
-                                <td>
-                                    <button type="button" class="close" @click="workOrder.commodities.splice(i,1)">
+                                <td class="text-right">
+                                    <button type="button" class="close" @click="workOrder.commodities.splice(i,1),sunPrice">
                                         <span aria-hidden="true" class="text-danger">&times;</span>
                                     </button>
                                 </td>
+                                <td>
+                                </td>
                             </tr>
                             </tbody>
                         </table>
@@ -204,6 +207,7 @@
                             </table>
                         </div>
                     </div>
+
                 </div>
             </div>
             <hr v-if="'破损' === workOrder.orderIssueType">

+ 65 - 14
resources/views/order/index/delivering.blade.php

@@ -1313,7 +1313,7 @@
                     images.splice(i, 1);
                 },
                 buildWorkOrder() {  // 生成工单
-                    if (['信息更改', '错漏发', '破损',].includes(this.workOrder.orderIssueType) && checkData.length !== 1) {
+                    if (['信息更改', '错漏发', '破损','拦截'].includes(this.workOrder.orderIssueType) && checkData.length !== 1) {
                         window.tempTip.show('该类型不能批量操作');
                         return;
                     }
@@ -1335,11 +1335,9 @@
                 },
                 createInterceptWorkOrder() {        // 拦截
                     let formData = new FormData();
-                    checkData.forEach(e=>{
-                        formData.append('orderNos[]',e);
-                    });
+                    formData.append('orderNos',checkData[0]);
                     formData.append('remark',this.workOrder ? (this.workOrder.remark ? this.workOrder.remark.info : '') : '');
-                    let url = "{{route('workOrder.interceptApi')}}";
+                    let url = "{{route('workOrder.intercept.storeApi')}}";
                     this.createWorkOrder(formData,url);
                 },
                 createInformationChangeWorkOrder() { // 信息修改
@@ -1348,7 +1346,7 @@
                         window.tempTip.setIndex(1999);
                         window.tempTip.show('信息修改仅支持单个订单修改');
                     }
-                    let url = "{{route('workOrder.informationChangeApi')}}";
+                    let url = "{{route('workOrder.informationChange.storeApi')}}";
                     this.createWorkOrder(data[0],url);
                 },
                 createLossWorkOrder(){  // 快递丢件
@@ -1356,12 +1354,11 @@
                     let formData = new FormData();
                     formData.append('order_no', data[0]['order_no']);
                     formData.append('remark', this.workOrder.remark.info);
-                    let url = "{{route('workOrder.lossApi')}}";
+                    let url = "{{route('workOrder.loss.storeApi')}}";
                     this.createWorkOrder(formData,url);
                 },
                 createExpressAbnormalWorkOrder(){ // 快递异常
                     if (!this.checkExpressAbnormalWorkOrder()) return;
-                    let url = "{{route('workOrder.expressAbnormalApi')}}";
                     let data = this.getCreateWorkOrderData();
                     let formData = new FormData();
                     formData.append('order_no', data[0]['order_no']);
@@ -1369,10 +1366,10 @@
                     let dealImages = this.getImages(this.workOrder.dealImages);
                     this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
                     this.setFormDataCommodities(formData);
+                    let url = "{{route('workOrder.expressAbnormal.storeApi')}}";
                     this.createWorkOrder(formData, url);
                 },
                 createMistakeWorkOrder() { // 错漏发
-                    let url = "{{route('workOrder.mistakeApi')}}";
                     let data = this.getCreateWorkOrderData();
                     let formData = new FormData();
                     formData.append('order_no', data[0]['order_no']);
@@ -1381,6 +1378,7 @@
                     let dealImages = this.getImages(this.workOrder.dealImages);
                     this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
                     this.setFormDataCommodities(formData);
+                    let url = "{{route('workOrder.mistake.storeApi')}}";
                     this.createWorkOrder(formData, url);
                 },
                 createDefaultWorkOrder() {              // 其他
@@ -1393,7 +1391,7 @@
                     let dealImages = this.getImages(this.workOrder.dealImages);                         // 交易截图
                     if (!this.checkDamagedWorkOrder(packageImages,commodityImages,dealImages)) return;
                     let formData = this.getDamagedFormData(packageImages,commodityImages,dealImages);
-                    let url = "{{route('workOrder.damagedApi')}}";
+                    let url = "{{route('workOrder.damage.storeApi')}}";
                     this.createWorkOrder(formData, url);
                 },
                 checkWorkOrderImage(packageImages,commodityImages,dealImages) {
@@ -1453,6 +1451,12 @@
                     if (!message){
                         message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages);
                     }
+                    let filter = this.workOrder.commodities.filter(e=>{
+                        return Number(e.price) <=0 || Number(e.abnormal_amount) <= 0;
+                    })
+                    if (filter.length > 0){
+                        message = '破损商品的数量和价格不能为0';
+                    }
                     if (message){
                         window.tempTip.setIndex(1999);
                         window.tempTip.show(message);
@@ -1628,12 +1632,34 @@
                     let data = {orderNo:checkData[0]};
                     window.axios.post(url,data).then(res=>{
                         if (res.data.success){
-                            this.workOrder.commodities =  res.data.data.map(item=>{
+                            let commodities =  res.data.data.map(item=>{
                                 item.abnormal_amount = item.amount;
-                                item.abnormal_type = this.workOrder.orderIssueType === '错漏发' ? '未错漏发' :'';
+                                item.abnormal_type = this.workOrder.orderIssueType === '错漏发' ? '未错漏发' : '';
                                 item.price = 0;
                                 return item;
                             });
+                            let index = 0;
+                            let logistic_number = commodities[0]['logistic_number'];
+                            let count = 0;
+                            for(let i = 0; i < commodities.length;i++){
+                                let cur_logistic_number = commodities[i]['logistic_number'];
+                                if (i === commodities.length - 1 && cur_logistic_number === logistic_number){
+                                    count ++;
+                                    commodities[index]['count'] = count;
+                                    break;
+                                }
+                                if (logistic_number === cur_logistic_number){
+                                    count++;
+                                } else if (logistic_number !== cur_logistic_number){
+                                    commodities[index]['count'] = count;
+                                    index = i;
+                                    count = 1;
+                                }
+                                if (i === commodities.length - 1){
+                                    commodities[index]['count'] = count;
+                                }
+                            }
+                            this.workOrder.commodities = commodities;
                         } else {
                         }
                     }).catch(err=>{
@@ -1764,7 +1790,7 @@
                         window.tempTip.show('填写快递单号');
                         return ;
                     }
-                    let {customerid} = this.orders.find(item=>{
+                    let {customerid} = this.orders.find((item)=>{
                         return item.orderno === checkData[0];
                     });
                     this.getCommodity(customerid,sku).then(res => {
@@ -1780,6 +1806,7 @@
                                 sku:this.$refs['add-commodity-sku'].value,
                                 abnormal_amount:this.$refs['add-commodity-number'].value,
                             });
+                            this.countByCommodities(this.workOrder.commodities);
                             this.$refs['add-commodity-logistic-number'].value = "";
                             this.$refs['add-commodity-sku'].value = "";
                             this.$refs['add-commodity-number'].value = "";
@@ -1830,7 +1857,31 @@
                         return false;
                     }
                     return true;
-                }
+                },
+                countByCommodities(commodities){
+                    if (commodities.length === 0) return;
+                    let index = 0;
+                    let logistic_number = commodities[0]['logistic_number'];
+                    let count = 0;
+                    for(let i = 0; i < commodities.length;i++){
+                        let cur_logistic_number = commodities[i]['logistic_number'];
+                        if (i === commodities.length - 1 && cur_logistic_number === logistic_number){
+                            count ++;
+                            commodities[index]['count'] = count;
+                            break;
+                        }
+                        if (logistic_number === cur_logistic_number){
+                            count++;
+                        } else if (logistic_number !== cur_logistic_number){
+                            commodities[index]['count'] = count;
+                            index = i;
+                            count = 1;
+                        }
+                        if (i === commodities.length - 1){
+                            commodities[index]['count'] = count;
+                        }
+                    }
+                },
             },
         });
     </script>

+ 0 - 102
resources/views/order/workOrder/_bao_shi_fill_work_order_modal.blade.php

@@ -1,102 +0,0 @@
-{{--快递处理丢件工单--}}
-<div class="modal fade " id="bao-shi-fill-work-order-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
-     aria-hidden="true">
-    <div class="modal-dialog modal-xl modal-dialog-centered">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title" id="baoshi-work-order-modal">错漏发处理(宝时)</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body p-0">
-                <div>
-                    <table class="table text-center">
-                        <thead>
-                        <tr class="text-center">
-                            <td>快递单号</td>
-                            <td>商品</td>
-                            <td>商品条码</td>
-                            <td>订单数量</td>
-                            <td>异常数量</td>
-                            <td>宝时核实数量</td>
-                            <td>核实结果</td>
-                            <td>处理结果</td>
-                            <td v-if="'错漏发' === fillWorkOrder.issue_type_name "></td>
-                        </tr>
-                        </thead>
-                        <tbody v-if="fillWorkOrder">
-                        <tr v-for="(item) in (fillWorkOrder ? fillWorkOrder.commodities : [])   " class="text-center">
-                            <td v-text="item.logistic_number">
-                            </td>
-                            <td>
-                                <span v-text="item.commodity ? item.commodity.name : ''"></span>
-                            </td>
-                            <td>
-                                <span v-text="item.commodity? item.commodity.sku : ''"></span>
-                            </td>
-                            <td v-text="item.amount">
-                            </td>
-                            <td v-text="item.abnormal_amount">
-                            </td>
-                            <td>
-                                <input type="number" class="form-control form-control-sm"
-                                       v-model="item.bao_shi_check_amount"
-                                       @input="computeBaoShiCheckResult(item)">
-                            </td>
-                            <td>
-                                <select class="form-control form-control-sm"
-                                        v-if="fillWorkOrder.issue_type_name === '破损'"
-                                        v-model="item.check_result">
-                                    <option v-for="type in damagedResults" :value="type" v-text="type"></option>
-                                </select>
-
-                                <select class="form-control form-control-sm"
-                                        v-if="['快递异常','快递丢件'].includes(fillWorkOrder.issue_type_name)"
-                                        v-model="item.check_result">
-                                    <option v-for="type in ['已拦截']" :value="type" v-text="type"></option>
-                                </select>
-
-                                <select class="form-control form-control-sm"
-                                        v-if="'错漏发' === fillWorkOrder.issue_type_name"
-                                        v-model="item.check_result">
-                                    <option v-for="type in mistakeResults"
-                                            :value="type" v-text="type"></option>
-                                </select>
-                            </td>
-
-                            <td>
-                                <select class="form-control form-control-sm"
-                                        v-if="'错漏发' === fillWorkOrder.issue_type_name"
-                                        v-model="item.process_result">
-                                    <option v-for="type in mistakeProcessResults"
-                                            :value="type" v-text="type"></option>
-                                </select>
-
-                                <select class="form-control form-control-sm"
-                                        v-else
-                                        v-model="item.process_result">
-                                    <option
-                                        v-for="type in processResults"
-                                        :value="type" v-text="type"></option>
-                                </select>
-                            </td>
-
-                            <td v-if="'错漏发' === fillWorkOrder.issue_type_name">
-                                <select class="form-control form-control-sm" v-model="item.process_result_info">
-                                    <option v-for="item in processResultInfo[item.process_result]" :value="item"
-                                            v-text="item"></option>
-                                </select>
-                            </td>
-                        </tr>
-                        </tbody>
-                    </table>
-                </div>
-            </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="baoShiUpdateCommodities">提交</button>
-            </div>
-        </div>
-    </div>
-</div>

+ 148 - 25
resources/views/order/workOrder/_bao_shi_review_modal.blade.php

@@ -4,60 +4,183 @@
     <div class="modal-dialog modal-xl modal-dialog-centered">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title" id="bao-shi-work-order-modal">终审(宝时)<span v-text="reviewWorkOrder ? reviewWorkOrder.issue_type_name :'' "></span></h5>
+                <h5 class="modal-title" id="bao-shi-work-order-modal">终审(宝时)<span
+                        v-text="baoShiEditWorkOrder ? baoShiEditWorkOrder.issue_type_name :'' "></span></h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
             </div>
-            <div class="modal-body p-0">
+            <div class="modal-body p-0" v-if="baoShiEditWorkOrder && baoShiEditWorkOrder.issue_type_name === '快递丢件'">
                 <div>
                     <table class="table text-center">
                         <thead>
-                        <tr >
+                        <tr>
                             <td>快递单号</td>
                             <td>商品</td>
                             <td>商品条码</td>
                             <td>订单数量</td>
                             <td>异常数量</td>
-                            <td v-if="reviewWorkOrder.issue_type_name !== '快递丢件'">核实数量</td>
                             <td>宝时审核数量</td>
-                            <td v-if="reviewWorkOrder.issue_type_name !== '快递丢件'">核实结果</td>
                             <td>处理结果</td>
                         </tr>
                         </thead>
-                        <tbody v-if="reviewWorkOrder">
-                        <tr v-for="(item) in (reviewWorkOrder ? reviewWorkOrder.commodities :  []) " >
-                            <td v-text="item.logistic_number">
+                        <tbody>
+                        <tr v-for="(item) in (baoShiEditWorkOrder ? baoShiEditWorkOrder.commodities :  []) " class="border border-bottom">
+                            <td v-if="item.count" v-text="item.logistic_number" class="align-middle border border-left border-bottom" :rowspan="item.count">
                             </td>
-                            <td>
-                                <span v-text="item.commodity? item.commodity.name : ''"></span>
+                            <td v-text="item.commodity? item.commodity.name : ''">
+                                <span></span>
                             </td>
-                            <td>
-                                <span v-text="item.commodity? item.commodity.sku : ''"></span>
+                            <td v-text="item.commodity? item.commodity.sku : ''">
                             </td>
                             <td v-text="item.amount">
                             </td>
                             <td v-text="item.abnormal_amount">
                             </td>
-                            <td v-if="reviewWorkOrder.issue_type_name !== '快递丢件'" v-text="item.check_amount">
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="item.bao_shi_check_amount">
                             </td>
                             <td>
-                                <input type="number" class="form-control form-control-sm" v-model="item.bao_shi_check_amount">
+                                <select class="form-control form-control-sm"
+                                        v-if="'快递丢件' === baoShiEditWorkOrder.issue_type_name"
+                                        v-model="item.process_result">
+                                    <option
+                                        v-for="type in lossProcessResults"
+                                        :value="type" v-text="type"></option>
+                                </select>
                             </td>
-                            <td v-if="reviewWorkOrder.issue_type_name !== '快递丢件'" v-text="item.check_result">
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+
+            <div class="modal-body p-0" v-if="baoShiEditWorkOrder &&  '破损' === baoShiEditWorkOrder.issue_type_name" >
+                <div>
+                    <table class="table text-center">
+                        <thead>
+                        <tr>
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>破损商品价值</td>
+                            <td>承运商核实数量</td>
+                            <td>宝时审核数量</td>
+                            <td>处理结果</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(item) in (baoShiEditWorkOrder ? baoShiEditWorkOrder.commodities :  [])" class="border border-bottom">
+                            <td v-if="item.count" v-text="item.logistic_number" class="align-middle border border-left border-bottom" :rowspan="item.count">
+                            </td>
+                            <td v-text="item.commodity? item.commodity.name : ''"></td>
+                            <td v-text="item.commodity? item.commodity.sku : ''"></td>
+                            <td v-text="item.amount"></td>
+                            <td v-text="item.abnormal_amount"></td>
+                            <td v-text="item.price"></td>
+                            <td v-text="item.check_amount"></td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="item.bao_shi_check_amount">
                             </td>
                             <td>
-                                 <select class="form-control form-control-sm"
-                                         v-if="['破损','快递异常','快递丢件'].includes(reviewWorkOrder.issue_type_name)"
-                                         v-model="item.process_result">
-                                    <option v-for="type in damagedProcessResults"
-                                            :value="type" v-text="type"></option>
+                                <select class="form-control form-control-sm" v-model="item.process_result">
+                                    <option
+                                        v-for="type in damagedProcessResults"
+                                        :value="type" v-text="type"></option>
                                 </select>
-                                <select class="form-control form-control-sm"
-                                        v-else-if="'错漏发' === reviewWorkOrder.issue_type_name "
-                                        v-model="item.process_result" >
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+
+
+            <div class="modal-body p-0" v-if="baoShiEditWorkOrder &&  '快递异常' === baoShiEditWorkOrder.issue_type_name">
+                <div>
+                    <table class="table text-center">
+                        <thead>
+                        <tr>
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>承运商核实数量</td>
+                            <td>宝时审核数量</td>
+                            <td>处理结果</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(item) in (baoShiEditWorkOrder ? baoShiEditWorkOrder.commodities :  [])" class="border border-bottom">
+                            <td v-if="item.count" v-text="item.logistic_number" class="align-middle border border-left border-bottom" :rowspan="item.count">
+                            </td>
+                            <td v-text="item.commodity? item.commodity.name : ''"></td>
+                            <td v-text="item.commodity? item.commodity.sku : ''"></td>
+                            <td v-text="item.amount"></td>
+                            <td v-text="item.abnormal_amount"></td>
+                            <td v-text="item.check_amount">
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="item.bao_shi_check_amount">
+                            </td>
+                            <td>
+                                <select class="form-control form-control-sm" v-model="item.process_result">
+                                    <option
+                                        v-for="type in expressAbnormalProcessResults"
+                                        :value="type" v-text="type"></option>
+                                </select>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+
+
+
+
+            <div class="modal-body p-0" v-if="baoShiEditWorkOrder &&  '错漏发' === baoShiEditWorkOrder.issue_type_name">
+                <div>
+                    <table class="table text-center">
+                        <thead>
+                        <tr>
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>宝时审核数量</td>
+                            <td>审核结果</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(item) in (baoShiEditWorkOrder ? baoShiEditWorkOrder.commodities :  [])" class="border border-bottom">
+                            <td v-if="item.count" v-text="item.logistic_number" class="align-middle border border-left border-bottom" :rowspan="item.count">
+                            </td>
+                            <td v-text="item.commodity? item.commodity.name : ''">
+                                <span></span>
+                            </td>
+                            <td v-text="item.commodity? item.commodity.sku : ''">
+                            </td>
+                            <td v-text="item.amount">
+                            </td>
+                            <td v-text="item.abnormal_amount">
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="item.bao_shi_check_amount"
+                                       @input="computeBaoShiCheckResult(item)">
+                            </td>
+                            <td>
+                                <select class="form-control form-control-sm" v-model="item.check_result" disabled>
                                     <option
-                                        v-for="type in mistakeProcessResults"
+                                        v-for="type in mistakeResults"
                                         :value="type" v-text="type"></option>
                                 </select>
                             </td>
@@ -68,7 +191,7 @@
             </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="review">终审</button>
+                <button type="button" class="btn btn-outline-primary" @click="baoShiEdit">终审</button>
             </div>
         </div>
     </div>

+ 76 - 65
resources/views/order/workOrder/_issue_logs.blade.php

@@ -1,70 +1,81 @@
-<div class="alert alert-light m-0">
+<div v-if="item.order_issue">
     @can('订单管理-问题件-处理结果添加')
-    <div class="card-body border form-inline pl-0 mb-2"
-         v-if="item.order_issue"
-         v-show="selectCreateOrderIssueLog === item.id" >
-        <input type="text" class="form-control" :id="item.order_issue.id+'_log_text'">
-        <input type="checkbox" class="form-control form-control-sm float-right ml-1" value="true"
-               :id="item.order_issue.id + '_log_check'">
-        @cannot('订单管理-问题件-客户不可见')
-        <label :for="item.order_issue.id + '_log_check'" class="float-right ml-1">标</label>
-        @endcan
-        <button class="btn btn-sm btn-primary float-right ml-1" type="button"
-                @click="createOrderIssueLog(item.order_issue.id,item)">添加
-        </button>
-    </div>
-    <div class="header-alert" v-if="item.order_issue">
-        <button class="float-right btn btn-sm btn-primary"
-                @click="selectCreateOrderIssueLog === item.id ? selectCreateOrderIssueLog = null : selectCreateOrderIssueLog = item.id">新
-        </button>
-    </div>
-    @endcan
-    <div class="header-alert">
-        <span class="text-monospace">处理结果</span>
-        <button type="button" class="btn btn-sm btn-outline-primary float-right "
-                v-show="selectOrderIssueLog !== item.id"
-                v-if="item.issue_logs && item.issue_logs.length > 0"
-                @click="selectOrderIssueLog = item.id">显示
-        </button>
-        <button type="button" class="btn btn-sm btn-outline-primary float-right"
-                v-show="selectOrderIssueLog === item.id"
-                @click="selectOrderIssueLog = null">隐藏
-        </button>
-    </div>
-</div>
-<transition name="fade">
-    <div class="alert alert-light m-0 border-top p-0"
-         v-show="selectOrderIssueLog === item.id"
-         v-if="item.issue_logs && item.issue_logs.length > 0">
-        <div class="alert alert-light mb-0 border-top"
-             v-for="(log,logIndex) in item.issue_logs">
-            @can('订单管理-问题件-处理结果删除')
-            <div class="float-right">
-                <button class="btn btn-sm btn-outline-danger" @click="destroyLog(log,logIndex,i)">删</button>
-                <button class="btn btn-sm btn-outline-primary" @click="tagIssueLog(log)" v-show="log.tag === 0">标</button>
-            </div>
-            @endcan
-            <div>
-                <span class="mr-3">处理人:</span>
-                <span class="text-truncate"
-                      v-text="log.user ? log.user.name : ''"></span>
-            </div>
-            <div>
-                <span class="mr-3">类型:</span>
-                <span class="text-truncate"
-                      v-text="log.type"></span>
-            </div>
-            <div v-if="log.content">
-                <span class="mr-3">内容:</span>
-                <span class="text-truncate"
-                      v-text="log.content"></span>
-            </div>
-            <div>
-                <span class="mr-3">处理时间:</span>
-                <span class="text-truncate"
-                      v-text="log.created_at"></span>
+        <div class="add-btn"
+             style="position: absolute;display: none;margin-top: -35px;z-index: 51"
+             :id="'AddBtn'+item.order_issue.id">
+            <button type="button" class="btn btn-primary"
+                    @click="showAddDiv('AddLog_'+item.order_issue.id)">新
+            </button>
+        </div>
+
+        <div class="addLogDiv row m-0 p-0 form-group" style="display: none;"
+             :id="'AddLog_'+item.order_issue.id">
+            <input type="hidden" name="id" :value="item.order_issue.id">
+            <div style="width: 45px"></div>
+            <div class="form-inline m-2">
+                <input type="text" name="content" class="form-control m-0 p-0"
+                       style="width: 275px"
+                       required>
+                @cannot('订单管理-问题件-客户不可见')
+                    <input type="checkbox" class="form-control"
+                           value="true"
+                           :name="item.order_issue.id + '_log_check'"
+                           :id="item.order_issue.id + '_log_check'">
+                    <label :for="item.order_issue.id + '_log_check'">标</label>
+                @endcannot
+                <button type="button"
+                        class="btn btn-primary ml-2 m-0 p-0"
+                        style="width: 50px"
+                        @click="orderIssueVue.addOrderIssueLog('AddLog_'+item.order_issue.id,item.order_issue.id,item.issue_logs)">添加
+                </button>
             </div>
         </div>
+
+    @endcan
+    <template class="p-0 m-0" v-if="item.issue_logs && item.issue_logs.length > 0">
+        <table class="table table-sm p-0 m-0 " :id="'logs'+item.order_issue.id">
+            <tr class="align-center position-static"
+                v-for="(log,logIndex) in item.issue_logs"
+                @click="removeFocusing($event)" v-on:mouseover="showDelBtn($event)"
+                v-on:mouseleave="hideDelBtn($event)">
+                <template v-if="logIndex < 2|| item.order_issue.log_is_show === true">
+                    <td style="max-width: 175px;min-width: 175px;">
+                        <span v-text="log.content"></span>
+                    </td>
+                    <td class="text-muted" style="max-width: 55px;min-width: 55px;">
+                        <span v-if="log.user" v-text="log.user.name"></span>
+                    </td>
+                    <td class="text-muted" style="max-width: 95px;min-width: 95px;">
+                        <span v-text="log.created_at"></span>
+                    </td>
+                    @can('订单管理-问题件-处理结果删除')
+                        <td style="" class="m-0 p-0 border-0">
+                            <button type="button"
+                                    class="btn btn-sm btn-outline-danger m-0 del-btn invisible"
+                                    @click="orderIssueVue.destroyLog(log,item.issue_logs,logIndex)">
+                                删
+                            </button>
+                        </td>
+                        <td class="m-0 p-0 border-0">
+                            <button type="button"
+                                    class="btn btn-sm btn-outline-primary m-0 del-btn invisible"
+                                    v-show="Number(log.tag) !== 1"
+                                    @click="orderIssueVue.tagIssueLog(log)">标
+                            </button>
+                        </td>
+                    @endcan
+                </template>
+            </tr>
+        </table>
+        <div class="d-flex justify-content-center">
+            <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1 center-block"
+                    v-if="item.issue_logs.length > 2"
+                    @click="toggleLogs(item.order_issue,$event)">记录共@{{ item.issue_logs.length }}条,点击展开
+            </button>
+        </div>
+
+    </template>
+    <div v-else class="w-auto h-50">
     </div>
-</transition>
+</div>
 

+ 17 - 9
resources/views/order/workOrder/_logistic_fill_work_order_modal.blade.php

@@ -5,15 +5,15 @@
     <div class="modal-dialog modal-xl modal-dialog-centered">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title" id="logistic-work-order-modal" v-if="fillWorkOrder">
-                    <span v-text="fillWorkOrder.issue_type_name + '工单'+'(承运商)'">
+                <h5 class="modal-title" id="logistic-work-order-modal" v-if="logisticEditWorkOrder">
+                    <span v-text="logisticEditWorkOrder.issue_type_name + '工单'+'(承运商)'">
                     </span>
                 </h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
             </div>
-            <div class="modal-body p-0">
+            <div class="modal-body p-0" v-if="logisticEditWorkOrder">
                 <div>
                     <table class="table">
                         <thead>
@@ -27,9 +27,9 @@
                             <td>核实结果</td>
                         </tr>
                         </thead>
-                        <tbody v-if="fillWorkOrder" class="text-center">
-                        <tr v-for="(item) in (fillWorkOrder.commodities ?  fillWorkOrder.commodities : []) ">
-                            <td v-text="item.logistic_number">
+                        <tbody v-if="logisticEditWorkOrder" class="text-center">
+                        <tr v-for="(item) in (logisticEditWorkOrder.commodities ?  logisticEditWorkOrder.commodities : []) " class="border border-bottom">
+                            <td v-if="item.count" v-text="item.logistic_number" class="align-middle border border-left border-bottom" :rowspan="item.count">
                             </td>
                             <td>
                                 <span v-text="item.commodity ? item.commodity.name : ''"></span>
@@ -46,17 +46,25 @@
                             </td>
                             <td>
                                 <select class="form-control form-control-sm"
-                                        v-if="'破损' === fillWorkOrder.issue_type_name"
+                                        v-if="'破损' === logisticEditWorkOrder.issue_type_name"
                                         v-model="item.check_result">
                                     <option v-for="type in ['核实破损','核实未破损']"
                                             :value="type" v-text="type"></option>
                                 </select>
                                 <select class="form-control form-control-sm"
-                                        v-if="'快递异常' === fillWorkOrder.issue_type_name"
+                                        v-if="'快递异常' === logisticEditWorkOrder.issue_type_name"
                                         v-model="item.check_result">
                                     <option v-for="type in expressAbnormalLogisticProcessResults" :value="type"
                                             v-text="type"></option>
                                 </select>
+
+                                <select class="form-control form-control-sm"
+                                        v-if="'快递丢件' === logisticEditWorkOrder.issue_type_name"
+                                        v-model="item.check_result">
+                                    <option
+                                        v-for="type in (['赔偿','不赔偿'])"
+                                        :value="type" v-text="type"></option>
+                                </select>
                             </td>
                         </tr>
                         </tbody>
@@ -65,7 +73,7 @@
             </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="logisticUpdateCommodities">提交</button>
+                <button type="button" class="btn btn-outline-primary" @click="logisticEdit">提交</button>
             </div>
         </div>
     </div>

+ 71 - 29
resources/views/order/workOrder/_owner_fill_work_order_modal.blade.php

@@ -1,15 +1,18 @@
-{{--快递处理丢件工单--}}
+{{--快递丢件 处理--}}
 <div class="modal fade " id="owner-fill-work-order-modal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
      aria-hidden="true">
     <div class="modal-dialog modal-xl modal-dialog-centered">
-        <div class="modal-content" v-if="fillWorkOrder">
+        <div class="modal-content" v-if="ownerEditWorKOrder">
             <div class="modal-header">
-                <h5 class="modal-title" id="checkModalLabel">信息填写(货主)</h5>
+                <h5 class="modal-title" id="checkModalLabel">
+                    <span v-if="'快递丢件' === ownerEditWorKOrder.issue_type_name ">信息填写(货主)</span>
+                    <span v-else-if="'错漏发' === ownerEditWorKOrder.issue_type_name">错漏发填写(货主)</span>
+                </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="modal-body" v-if="'货主处理' === ownerEditWorKOrder.status && '快递丢件' === ownerEditWorKOrder.issue_type_name">
                 <div class="modal-body">
                     <div class="form-group row">
                         <div class="col-sm-2"></div>
@@ -23,7 +26,7 @@
                                class="col-sm-2 col-form-label text-right text-primary">丢件商品总价值</label>
                         <div class="col-sm-10">
                             <input type="number" id="work-order-price" class="form-control"
-                                   v-model="fillWorkOrder.price"
+                                   v-model="ownerEditWorKOrder.price"
                                    disabled
                                    placeholder="填写丢件商品价值后自动计算">
                         </div>
@@ -34,17 +37,17 @@
                                class="col-sm-2 col-form-label text-right">丢件快递单号</label>
                         <div class="col-sm-10">
                             <input type="text" id="work-order-logistic-number" class="form-control"
-                                   v-model="fillWorkOrder['logistic_number']" placeholder="快递单号">
+                                   v-model="ownerEditWorKOrder['logistic_number']" placeholder="快递单号">
                         </div>
                     </div>
                     {{--补发快递--}}
                     <div class="form-group row"
-                         v-show="fillWorkOrder.dealImages && fillWorkOrder.dealImages.length === 0">
+                         v-show="ownerEditWorKOrder.dealImages && ownerEditWorKOrder.dealImages.length === 0">
                         <label for="work-order-reissue-logistic-number"
                                class="col-sm-2 col-form-label text-right">补发快递单号</label>
                         <div class="col-sm-10">
                             <input type="text" id="work-order-reissue-logistic-number" class="form-control"
-                                   v-model="fillWorkOrder['reissue_logistic_number']" placeholder="快递单号">
+                                   v-model="ownerEditWorKOrder['reissue_logistic_number']" placeholder="快递单号">
                         </div>
                     </div>
                     {{--信息更改--}}
@@ -53,7 +56,7 @@
                         <label for="order_issue_type" class="col-sm-2 col-form-label text-right">收方信息</label>
                         <div class="col-sm-10">
                         <textarea class="form-control" name="" id="remake_info" cols="30" rows="2"
-                                  v-model="fillWorkOrder.remake"></textarea>
+                                  v-model="ownerEditWorKOrder.remake"></textarea>
                         </div>
                     </div>
 
@@ -64,14 +67,14 @@
                             <div><span class="text-primary">需带有付款时间,快递单号,内物详情和实付款的交易截图</span></div>
                             <div class="border border-secondary h-auto" id="deal-image" style="min-height: 75px"
                                  contenteditable="true"
-                                 @paste="pasteImage($event,fillWorkOrder.dealImages)">
-                                <div v-for="(image,i) in fillWorkOrder.dealImages"
+                                 @paste="pasteImage($event,ownerEditWorKOrder.dealImages)">
+                                <div v-for="(image,i) in ownerEditWorKOrder.dealImages"
                                      class="d-inline-block col-4 position-relative card">
                                     <div class="card-body">
                                         <img :src="image.src" class="card-img-top" :alt="image.file.name">
                                         <div class="float-right position-relative">
                                             <button type="button" class="btn btn-sm btn-outline-danger"
-                                                    @click="spliceImage(i,fillWorkOrder.dealImages)">取消
+                                                    @click="spliceImage(i,ownerEditWorKOrder.dealImages)">取消
                                             </button>
                                         </div>
                                     </div>
@@ -80,19 +83,19 @@
                         </div>
                     </div>
                     <hr>
-                    <div class="form-group row" v-show="!fillWorkOrder['reissue_logistic_number']">
+                    <div class="form-group row" v-show="!ownerEditWorKOrder['reissue_logistic_number']">
                         <label for="refund-image" class="col-sm-2 col-form-label text-right text-primary">退款成功截图</label>
                         <div class="col-sm-10">
                             <div class="border border-secondary h-auto" id="refund-image" style="min-height: 75px"
                                  contenteditable="true"
-                                 @paste="pasteImage($event,fillWorkOrder.refundImages)">
-                                <div v-for="(image,i) in fillWorkOrder.refundImages"
+                                 @paste="pasteImage($event,ownerEditWorKOrder.refundImages)">
+                                <div v-for="(image,i) in ownerEditWorKOrder.refundImages"
                                      class="d-inline-block col-4 position-relative card">
                                     <div class="card-body">
                                         <img :src="image.src" class="card-img-top" :alt="image.file.name">
                                         <div class="float-right position-relative">
                                             <button type="button" class="btn btn-sm btn-outline-danger"
-                                                    @click="spliceImage(i,fillWorkOrder.refundImages)">取消
+                                                    @click="spliceImage(i,ownerEditWorKOrder.refundImages)">取消
                                             </button>
                                         </div>
                                     </div>
@@ -114,8 +117,8 @@
                             </tr>
                             </thead>
                             <tbody>
-                            <tr v-for="(item,i) in  fillWorkOrder.commodities">
-                                <td v-text="item.logistic_number">
+                            <tr v-for="(item,i) in  ownerEditWorKOrder.commodities" class="border border-bottom">
+                                <td v-if="item.count" v-text="item.logistic_number" class="align-middle border border-left border-bottom" :rowspan="item.count">
                                 </td>
                                 <td v-text="item.name">
                                 </td>
@@ -124,13 +127,13 @@
                                 <td v-text="item.amount">
                                 </td>
                                 <td>
-                                    <input type="number" class="form-control form-control-sm" v-model="item.price" @input="sumPrice(fillWorkOrder)">
+                                    <input type="number" class="form-control form-control-sm" v-model="item.price" @input="sumPrice(ownerEditWorKOrder)">
                                 </td>
                                 <td>
-                                    <input type="number" class="form-control form-control-sm" v-model="item.abnormal_amount">
+                                    <input type="number" class="form-control form-control-sm" v-model="item.abnormal_amount" >
                                 </td>
-                                <td>
-                                    <button type="button" class="close" @click="fillWorkOrder.commodities.splice(i,1)">
+                                <td >
+                                    <button type="button" class="close" @click="ownerEditWorKOrder.commodities.splice(i,1),sumPrice(ownerEditWorKOrder),countByCommodities(ownerEditWorKOrder.commodities)">
                                         <span aria-hidden="true" class="text-danger">&times;</span>
                                     </button>
                                 </td>
@@ -139,13 +142,52 @@
                         </table>
                     </div>
                 </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="ownerUpdateWorkOrder">提交
-                    </button>
-                </div>
+            </div>
+            <div class="modal-body" v-if="'待货主完结' === ownerEditWorKOrder.status && '错漏发' === ownerEditWorKOrder.issue_type_name">
+                <table class="table text-center">
+                    <thead>
+                    <tr>
+                        <td>快递单号</td>
+                        <td>商品</td>
+                        <td>商品条码</td>
+                        <td>订单数量</td>
+                        <td>异常数量</td>
+                        <td>宝时复核数量</td>
+                        <td>复核结果</td>
+                        <td>处理</td>
+                        <td>处理详情</td>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr v-for="(item,i) in  ownerEditWorKOrder.commodities" class="border border-bottom">
+                        <td v-if="item.count" v-text="item.logistic_number" class="align-middle border border-left border-bottom" :rowspan="item.count">
+                        </td>
+                        <td v-text="item.name"></td>
+                        <td v-text="item.sku"></td>
+                        <td v-text="item.amount"></td>
+                        <td v-text="item.abnormal_amount"></td>
+                        <td v-text="item.bao_shi_check_amount"></td>
+                        <td v-text="item.check_result"></td>
+                        <td>
+                            <select class="form-control form-control-sm" v-model="item.process_result">
+                                <option v-for="item in getProcessResult(item.check_result,item)" :value="item" v-text="item"></option>
+                            </select>
+                        </td>
+                        <td>
+                            <select class="form-control form-control-sm" v-model="item.process_result_info">
+                                <option v-for="item in getProcessResultInfo(item.process_result,item)" :value="item" v-text="item"></option>
+                            </select>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </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="ownerEdit">提交
+
+                </button>
             </div>
         </div>
     </div>

+ 88 - 64
resources/views/order/workOrder/_work_order_details.blade.php

@@ -1,7 +1,7 @@
 <div class="alert alert-light mb-0">
     <div class="header-alert">
         <span class="text-monospace">工单详情</span>
-        <button type="button" class="btn  btn-outline-primary float-right"
+        <button type="button" class="btn btn-sm btn-outline-primary float-right"
                 v-show="selectDetailId !== item.id"
                 v-if="(item.images && item.images.length > 0) || (item.commodities && item.commodities.length>0) || item.pending_detail"
                 @click="selectDetailId = item.id">显示
@@ -13,18 +13,17 @@
     </div>
 </div>
 <transition name="fade">
-    <div class="alert alert-light mb-0 border border-top"
+    <div class="alert alert-light mb-0 border"
          v-show="selectDetailId === item.id"
          v-if="item.details && item.details.length > 0">
-        <div class="card-body row col-12 mb-0 pb-0"
-             v-for="(detail) in item.details" >
-            <div class="col-12">
-                <span v-text="'工单类型:'+(item.issue_type ? item.issue_type.name : '')"></span>
-            </div>
-            <div v-if="Number(detail.price) !== 0" class="col-12">
-                <span class="text-monospace" v-text="'商品价值'"></span>
-            </div>
-            <div class="col-12" v-if="!['完成','未完成历史标记'].includes(detail.status) && Number(detail.price) !== 0">
+        <div class="card-body row col-12 mb-0 pb-0 "
+             v-for="(detail) in item.details">
+            <div v-if="Number(detail.price) !== 0" class="col-12 border-bottom">
+                <span
+                    class="badge float-right"
+                    :class="getBadgeColor(detail.tag)"
+                    v-text="detail.issue_type ? detail.issue_type.name : ''"></span>
+                <span class="text-monospace">商品价值:</span>
                 <span v-text="detail.price"></span>
             </div>
         </div>
@@ -38,19 +37,23 @@
             <span class="text-monospace" v-text="'交易截图'"></span>
         </div>
         <div class="card-group">
-        <div class="col-sm-6"
-             v-for="dealImage in item.deal_images">
-            <div class="card-body">
-                <a  target="_blank"
-                    v-if="dealImage.upload_file"
-                    :href="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type">
-                    <img class="image-w"
-                         :src="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type"
-                         alt="交易截图">
-                </a>
+            <div class="card-body col-sm-6 p-0"
+                 v-for="dealImage in item.deal_images">
+                <div class="card-body">
+                   <span class="badge float-right"
+                         v-text="dealImage.issue_type_name"
+                         :class="getBadgeColor(dealImage.tag)"
+                   ></span>
+                    <a target="_blank"
+                       v-if="dealImage.upload_file"
+                       :href="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type">
+                        <img class="image-w border"
+                             :src="filePrefix+dealImage.upload_file.url + '.'+dealImage.upload_file.type"
+                             alt="交易截图">
+                    </a>
+                </div>
             </div>
         </div>
-        </div>
 
     </div>
 </transition>
@@ -61,18 +64,23 @@
          v-show="selectDetailId === item.id"
          v-if="item.refund_images && item.refund_images.length > 0">
         <div class="col-12">
-           <span class="text-monospace" v-text="'退款截图'"></span>
+            <span class="text-monospace" v-text="'退款截图'"></span>
         </div>
-        <div class="card-body col-sm-6"
-             v-for="(refundImage,i) in item.refund_images">
-            <div class="">
-                <a  target="_blank"
-                    v-if="refundImage.upload_file"
-                    :href="filePrefix+refundImage.upload_file.url + '.'+refundImage.upload_file.type">
-                    <img class="image-w"
-                         :src="filePrefix+refundImage.upload_file.url + '.'+refundImage.upload_file.type"
-                         alt="交易截图">
-                </a>
+        <div class="card-group">
+            <div class="card-body col-sm-6 p-0"
+                 v-for="(refundImage,i) in item.refund_images">
+                <div class="">
+                       <span class="badge float-right"
+                             v-text="refundImage.issue_type_name+refundImage.tag"
+                             :class="getBadgeColor(refundImage.tag)"></span>
+                    <a target="_blank"
+                       v-if="refundImage.upload_file"
+                       :href="filePrefix+refundImage.upload_file.url + '.'+refundImage.upload_file.type">
+                        <img class="image-w border"
+                             :src="filePrefix+refundImage.upload_file.url + '.'+refundImage.upload_file.type"
+                             alt="退款截图">
+                    </a>
+                </div>
             </div>
         </div>
     </div>
@@ -83,17 +91,22 @@
          v-show="selectDetailId === item.id"
          v-if="item['package_images'] && item['package_images'].length > 0">
         <div class="col-12">
-           <span class="text-monospace" v-text="'外包装截图'"></span>
+            <span class="text-monospace" v-text="'外包装截图'"></span>
         </div>
-        <div class="card-body col-sm-6"
-             v-for="(packageImage,i) in item['package_images']">
-            <a target="_blank"
-               v-if="packageImage.upload_file"
-               :href="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type">
-                <img class="image-w"
-                     :src="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type"
-                     alt="外包装截图">
-            </a>
+        <div class="card-group">
+            <div class="card-body col-sm-6 p-0"
+                 v-for="(packageImage,i) in item['package_images']">
+            <span class="badge float-right"
+                  v-text="packageImage.issue_type_name"
+                  :class="getBadgeColor(packageImage.tag)"></span>
+                <a target="_blank"
+                   v-if="packageImage.upload_file"
+                   :href="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type">
+                    <img class="image-w border"
+                         :src="filePrefix+packageImage.upload_file.url + '.'+packageImage.upload_file.type"
+                         alt="外包装截图">
+                </a>
+            </div>
         </div>
     </div>
 </transition>
@@ -101,32 +114,39 @@
 <transition name="fade">
     <div class="alert alert-light mb-0 border border-top"
          v-show="selectDetailId === item.id"
-         v-if="item['commodity_images'] && item['commodity_images'].length > 0">
+         v-if="item.commodity_images && item.commodity_images.length > 0">
         <div class="col-12">
-           <span class="text-monospace" v-text="'内物破损图片'"></span>
+            <span class="text-monospace" v-text="'内物破损图片'"></span>
         </div>
-        <div class="card-body col-sm-6"
-             v-for="(commodityImage,i) in item['commodity_images']">
-            <a target="_blank"
-               v-if="commodityImage.upload_file"
-               :href="filePrefix+commodityImage.upload_file.url  + '.'+commodityImage.upload_file.type">
-                <img class="image-w"
-                     :src="filePrefix+commodityImage.upload_file.url + '.'+commodityImage.upload_file.type"
-                     alt="内物破损图片">
-            </a>
+        <div class="card-group">
+            <div class="card-body col-sm-6 p-0"
+                 v-for="(commodityImage,i) in item['commodity_images']">
+            <span class="badge float-right"
+                  v-text="commodityImage.issue_type_name"
+                  :class="getBadgeColor(commodityImage.tag)"></span>
+                <a target="_blank"
+                   v-if="commodityImage.upload_file"
+                   :href="filePrefix+commodityImage.upload_file.url  + '.'+commodityImage.upload_file.type">
+                    <img class="image-w border"
+                         :src="filePrefix+commodityImage.upload_file.url + '.'+commodityImage.upload_file.type"
+                         alt="内物破损图片">
+                </a>
+            </div>
         </div>
     </div>
 </transition>
 <transition name="fade">
-    <div class="alert alert-light mb-0  border border-top"
-        v-show="selectDetailId === item.id"
-        v-if="item.commodities && item.commodities.length > 0">
-
+    <div class="alert alert-light mb-0  border "
+         v-show="selectDetailId === item.id"
+         v-if="item.commodities && item.commodities.length > 0">
         <div class="col-12">
-           <div class="text-monospace">商品详情</div>
+            <div class="text-monospace">商品详情</div>
         </div>
-        <div class="card-body col-12 pb-0"
+        <div class="card-body col-12 pb-0 border-top"
              v-for="(commodity,i) in item.commodities">
+           <span class="badge float-right"
+                 v-text="commodity.issue_type_name"
+                 :class="getBadgeColor(commodity.tag)"></span>
             <div>
                 <span class="mr-3">SKU:</span>
                 <span class="text-truncate" v-text="commodity.sku"></span>
@@ -185,14 +205,18 @@
     </div>
 </transition>
 <transition name="fade">
-    <div class="alert alert-light mb-0  border border-top"
+    <div class="alert alert-light mb-0 border-top border "
          v-show="selectDetailId === item.id"
          v-if="item.pending_detail && item.pending_detail.commodities.length > 0">
         <div class="col-12">
-            <div class="text-monospace">商品详情</div>
+            <div class="text-monospace">当前待处理商品详情</div>
         </div>
-        <div class="card-body col-12 pb-0"
+        <div class="card-body col-12 pb-0 border-top"
              v-for="(commodity,i) in item.pending_detail.commodities">
+            <span class="badge float-right"
+                  v-text="commodity.issue_type_name"
+                  :class="getBadgeColor(commodity.tag)"
+            ></span>
             <div>
                 <span class="mr-3">SKU:</span>
                 <span class="text-truncate" v-text="commodity.sku"></span>
@@ -242,7 +266,7 @@
                 <span class="text-truncate"
                       v-text="commodity.process_result"></span>
             </div>
-            <div v-if="'错漏发' === commodity.issue_type && commodity.process_result_info">
+            <div v-if="commodity.process_result_info">
                 <span class="mr-3">处理详情:</span>
                 <span class="text-truncate"
                       v-text="commodity.process_result_info"></span>

+ 37 - 0
resources/views/order/workOrder/_work_order_log.blade.php

@@ -0,0 +1,37 @@
+<div class="alert alert-light mb-0">
+    <button type="button" class="btn btn-sm btn-outline-primary float-left"
+            v-show="selectLog !== item.id && item.logs && item.logs.length > 0"
+            @click="selectLog=item.id">
+        显示
+    </button>
+    <button type="button" class="btn btn-sm btn-outline-primary float-left"
+            v-show="selectLog === item.id && item.logs && item.logs.length > 0"
+            @click="selectLog=null">
+        收起
+    </button>
+    <span>&nbsp;</span>
+</div>
+<transition-group name="fade">
+    <div class="alert alert-light mb-0  border-top"
+         v-show="selectLog === item.id"
+         v-for="(log,index) in item.logs" v-bind:key="item.id+':'+index">
+        <div class="card-body col-12 p-0">
+            <span class="badge badge-pill float-right"
+                  :class="getBadgeColor(log.tag)"
+                  v-text="log.issue_type"></span>
+            <div>
+                <span class="text-monospace">创建人:</span>
+                <span v-text="log.creator? log.creator.name : ''"></span>
+
+            </div>
+            <div>
+                <span class="text-monospace">创建时间:</span>
+                <span v-text="log.created_at"></span>
+            </div>
+            <div>
+                <span class="text-monospace">内容:</span>
+                <span v-text="log.content"></span>
+            </div>
+        </div>
+    </div>
+</transition-group>

+ 766 - 361
resources/views/order/workOrder/index.blade.php

@@ -46,6 +46,9 @@
                                        target="order/issue/index?addtime=15">
                                         <span v-show="item.is_issue_order" class="badge badge-primary">问题件</span>
                                     </a>
+                                    <span v-if="item.work_order_status === 1" class="badge badge-dark">
+                                        新
+                                    </span>
                                 </td>
                                 <td>
                                     @can('订单管理-订单问题件生成')
@@ -57,36 +60,31 @@
                                     @can('订单管理-工单处理-货主编辑')
                                         <button class="btn btn-sm"
                                                 style="background-color: #42a887;color: #FFFFFF;border-color: #378d72"
-                                                v-if="item.issue_type_name === '快递丢件' && item.status === '货主处理'"
-                                                @click="ownerFillWorkOrder(item,i)">
-                                            商家处理
+                                                v-if="isOwnerDispose(item)"
+                                                @click="ownerShowEdit(item,i)">
+                                            <span v-if="item.stats==='待货主完结'">商家完结</span>
+                                            <span v-else>商家处理</span>
                                         </button>
                                     @endcan
                                     @can('订单管理-工单处理-承运商编辑')
                                         <button class="btn btn-sm"
                                                 style="background-color:#e06538;color: #FFFFFF;border-color: #9a3d23"
-                                                v-if="['破损','快递异常'].includes(item.issue_type_name) && item.status ==='承运商处理'"
-                                                @click="logisticFillWorkOrder(item,i)">
-                                            快递处理
-                                        </button>
-                                        <button class="btn btn-sm"
-                                                style="background-color:#e06538;color: #FFFFFF;border-color: #9a3d23"
-                                                v-if="['拦截','信息更改'].includes(item.issue_type_name) && item.status ==='承运商处理'"
-                                                @click="logisticEndWorkOrder(item,i)">
+                                                v-if="isLogisticDispose(item)"
+                                                @click="logisticShowEdit(item,i)">
                                             快递处理
                                         </button>
                                     @endcan
                                     @can('订单管理-工单处理-宝时编辑')
                                         <button class="btn btn-sm"
                                                 style="background-color: #38b1e0;color: #FFFFFF;border-color:#90acb6;"
-                                                v-if="['错漏发','快递丢件','破损'].includes(item.issue_type_name) && item.status ==='宝时处理'"
-                                                @click="baoShiFillWorkOrder(item,i)">
+                                                v-if="isBaoShiHandler(item)"
+                                                @click="baoShiShowEdit(item,i)">
                                             宝时处理
                                         </button>
                                         <button class="btn btn-sm "
                                                 style="background-color: #54c337;color: #FFFFFF;border-color:#90acb6;"
-                                                v-if="'宝时终审' === item.status"
-                                                @click="baoShiReview(item,i)">
+                                                v-if="isBaoShiReview(item)"
+                                                @click="baoShiShowEdit(item,i)">
                                             终审
                                         </button>
                                     @endcan
@@ -134,7 +132,9 @@
                                 <td>
                                     <span v-text="item.result_explain ? item.result_explain: item.remark"></span>
                                 </td>
-                                <td>
+                                <td class="log-td" colspan=""
+                                    v-on:mouseover="showAddBtn($event)"
+                                    v-on:mouseleave="hideAddBtn($event)">
                                     @include('order.workOrder._issue_logs')
                                 </td>
                                 <td class="container">
@@ -155,39 +155,7 @@
                                         </div>
                                         <div @can('订单管理-工单处理-删除') class="col-5 m-0"
                                              @else class="col-6 p-0" @endcan>
-                                            <div class="alert alert-light mb-0">
-                                                <button type="button" class="btn btn-sm btn-outline-primary float-left"
-                                                        v-show="selectLog !== item.id && item.logs && item.logs.length > 0"
-                                                        @click="selectLog=item.id">
-                                                    显示
-                                                </button>
-                                                <button type="button" class="btn btn-sm btn-outline-primary float-left"
-                                                        v-show="selectLog === item.id && item.logs && item.logs.length > 0"
-                                                        @click="selectLog=null">
-                                                    收起
-                                                </button>
-                                                <span>&nbsp;</span>
-                                            </div>
-                                            <transition-group name="fade">
-                                                <div class="alert alert-light mb-0  border-top"
-                                                     v-show="selectLog === item.id"
-                                                     v-for="(log,index) in item.logs" v-bind:key="item.id+':'+index">
-                                                    <div class="card-body col-12 p-0">
-                                                        <div>
-                                                            <span class="text-monospace">创建人:</span>
-                                                            <span v-text="log.creator? log.creator.name : ''"></span>
-                                                        </div>
-                                                        <div>
-                                                            <span class="text-monospace">创建时间:</span>
-                                                            <span v-text="log.created_at"></span>
-                                                        </div>
-                                                        <div>
-                                                            <span class="text-monospace">内容:</span>
-                                                            <span v-text="log.content"></span>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </transition-group>
+                                            @include('order.workOrder._work_order_log')
                                         </div>
                                     </div>
 
@@ -199,7 +167,7 @@
                 </div>
             </div>
             @can('订单管理-工单处理-审核')
-{{--                @include('order.workOrder._edit_issue_type')--}}
+                {{--                @include('order.workOrder._edit_issue_type')--}}
             @endcan
             @include('order.workOrder._bao_shi_review_modal')
             @include('order.workOrder._bao_shi_fill_work_order_modal')
@@ -216,6 +184,7 @@
         .fade-enter-active {
             transition: opacity .3s;
         }
+
         .fade-leave-active {
             transition: opacity .1s;
         }
@@ -232,9 +201,83 @@
         }
     </style>
     <script>
-        let list = new Vue({
+
+
+        const orderIssueVue = new Vue({
+            methods:{
+                tagIssueLog(log) {   // 标记问题件log不可见
+                    let url = '{{route('order.issue.log.tagApi')}}';
+                    let data = {id: log.id};
+                    if (!confirm('是否标记当前记录客户不可见')) return;
+                    window.axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            window.tempTip.showSuccess('标记成功');
+                            log.tag = 1;
+                        } else {
+                            window.tempTip.show(res.data.message ? res.data.message : '标记出现异常');
+                        }
+                    }).catch(err => {
+                        window.tempTip.show(err);
+                    });
+                },
+                addOrderIssueLog(id,order_issue_id, logs){
+                    let idInput = $('#' + id + ' :input[name="id"]');
+                    let contentInput = $('#' + id + ' :input[name="content"]');
+                    if (!contentInput.val()) {
+                        contentInput.addClass('is-invalid').focus();
+                        return;
+                    }
+                    contentInput.removeClass('is-invalid');
+                    let tag = document.getElementById(order_issue_id + '_log_check').checked;
+                    let url = '{{route('order.issue.log.storeApi')}}';
+                    let data = {id: idInput.val(), content: contentInput.val(), tag: tag ? 1 : 0};
+                    window.tempTip.waitingTip("处理中");
+                    window.axios.post(url, data).then(function (res) {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            logs.unshift(res.data.data);
+                            contentInput.val('');
+                            $('#' + id).hide();
+                            vue.successTempTip('添加成功');
+                            return;
+                        }
+                        vue.errorTempTip(res.data.fail_info);
+                    }).catch(function (err) {
+                        window.tempTip.cancelWaitingTip();
+                        vue.errorTempTip('网络异常:' + err);
+                    });
+                },
+                destroyLog(log,issue_logs,logIndex) {    // 删除处理日志
+                    if (!confirm('是否删除当前记录')) return;
+                    if (log.type === '创建') {
+                        tempTip.show('创建记录不能删除');
+                        return;
+                    }
+                    let url = "{{route("order.issue.log.destroyApi")}}";
+                    let data = {id: log.id};
+                    window.tempTip.setIndex('1999');
+                    window.axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            issue_logs.splice(logIndex,1);
+                            tempTip.setDuration(1500);
+                            tempTip.showSuccess('删除成功');
+                        } else {
+                            tempTip.setDuration(2000);
+                            tempTip.show('删除失败:' + res.data.fail_info);
+                        }
+                    }).catch(err => {
+                        tempTip.setDuration(2500);
+                        tempTip.show('网络异常:' + err);
+                    });
+                },
+            }
+        });
+
+
+        let vue = new Vue({
             el: "#list",
             data: {
+                orderIssueVue:orderIssueVue,
                 workOrders: {!! $workOrders->toJson() !!}['data'],
                 form: null,
                 logistics: [
@@ -260,15 +303,43 @@
                 ],
                 workOrder: {
                     id: null,
-                    detail_id:null,
+                    detail_id: null,
+                    reissue_logistic_number: null, // 补发单号
+                    logistic_number: null, // 丢件快递单号
+                    refundImages: [], // 退款图
+                    dealImages: [], // 交易图
+                },
+                logisticEditWorkOrder: {
+                    id: null,
+                    issue_type_name: null,
+                    detail_id: null,
+                    reissue_logistic_number: null, // 补发单号
+                    logistic_number: null, // 丢件快递单号
+                    commodities: [],
+                },
+                baoShiEditWorkOrder: {
+                    id: null,
+                    issue_type_name: null,
+                    detail_id: null,
+                    reissue_logistic_number: null,  // 补发单号
+                    logistic_number: null,          // 丢件快递单号
+                    commodities: [],
+                },
+                ownerEditWorKOrder: {
+                    id: null,
+                    issue_type_name: null,
+                    detail_id: null,
+                    price: null,
                     reissue_logistic_number: null, // 补发单号
                     logistic_number: null, // 丢件快递单号
                     refundImages: [], // 退款图
                     dealImages: [], // 交易图
+                    commodities: [],
                 },
                 fillWorkOrder: {
                     id: null,
-                    detail_id:null,
+                    issue_type_name: null,
+                    detail_id: null,
                     reissue_logistic_number: null, // 补发单号
                     logistic_number: null, // 丢件快递单号
                     refundImages: [], // 退款图
@@ -278,9 +349,9 @@
                 workOrderStatus: ['创建', '信息已填写', '快递已处理', '工单完成'],
                 reviewWorkOrder: {
                     id: null,
-                    detail_id:null,
-                    commodities: [],
                     issue_type_name: null,
+                    detail_id: null,
+                    commodities: [],
                 },
                 selectTr: null,                 // table 行
                 selectDetailId: null,           // 详情
@@ -296,6 +367,8 @@
                 processResults: ['核实破损', '核实未破损'],
                 mistakeProcessResults: ['少发', '多发,客户买下', '多发,客户退回', '少发,不补发', '核实未错漏发'],
                 damagedProcessResults: ['赔偿', '不赔偿'],
+                expressAbnormalProcessResults: ['赔偿', '不赔偿'],
+                lossProcessResults: ['赔偿', '不赔偿'],
                 expressAbnormalLogisticProcessResults: ['已拦截', '已催件'],
                 processResultInfo: {
                     "少发": {'0': '宝时补发(商家不做单)'},
@@ -394,9 +467,9 @@
             },
             created() {
                 this.workOrders.forEach(item => {
+                    this.sortOrder(item);
                     if (!item.order) return;
                     if (!item.order.packages) return;
-                    this.sortOrder(item);
                 });
             },
             filters: {
@@ -418,40 +491,44 @@
                     workOrder.logs = this.groupLogs(workOrder);                                    // 工单日志
                     workOrder.commodities = this.groupCommodities(workOrder);
                     workOrder.issue_type_name = workOrder.issue_type ? workOrder.issue_type.name : '';  // 工单类型
-                    workOrder.pending_detail =this.groupPendingDetail(workOrder);
+                    workOrder.pending_detail = this.groupPendingDetail(workOrder);
+                    workOrder.order_issue ? (workOrder.order_issue.log_is_show = false ): '';
                 },
-                groupPendingDetail(workOrder){
-                    let detail = workOrder.details.find(item=>{
-                        return !['完成','标记'].includes(item.tag);
+                groupPendingDetail(workOrder) {
+                    let detail = workOrder.details.find(item => {
+                        return !['完成', '标记'].includes(item.tag);
                     });
                     if (!detail) return null;
                     return {
-                        id:workOrder.id,
-                        detail_id:detail.id,
-                        commodities:detail.commodities,
-                        issue_type_name:detail.issue_type ? detail.issue_type.name : '',
-                        status:detail.status,
-                        reissue_logistic_number:detail.reissue_logistic_number,
-                        logistic_number:detail.logistic_number,
-                        price:detail.price,
-                        return_logistic_number:detail.return_logistic_number,
-                        remark:detail.remark,
-                        tag:detail.tag,
+                        id: workOrder.id,
+                        detail_id: detail.id,
+                        commodities: detail.commodities,
+                        issue_type_name: detail.issue_type ? detail.issue_type.name : '',
+                        status: detail.status,
+                        reissue_logistic_number: detail.reissue_logistic_number,
+                        logistic_number: detail.logistic_number,
+                        price: detail.price,
+                        return_logistic_number: detail.return_logistic_number,
+                        remark: detail.remark,
+                        tag: detail.tag,
                     };
                 },
-                groupCommodities(workOrder,isCurrent = true){
+                groupCommodities(workOrder, isCurrent = true) {
                     let commodities = [];
-                    workOrder.details.forEach(detail=>{
-                        commodities.push(...(detail.commodities ?? []))
+                    workOrder.details.forEach(detail => {
+                        let commoditiy_itmes = detail.commodities.map(item => {
+                            item.issue_type_name = detail.issue_type ? detail.issue_type.name : '';
+                            return item;
+                        });
+                        commodities.push(...(commoditiy_itmes ?? []))
                     });
-                    commodities = commodities.filter(item=>{
-                        if (!isCurrent){
-                            return !['完成','标记'].includes(item.tag);
+                    return commodities.filter(item => {
+                        if (!isCurrent) {
+                            return !['完成', '标记'].includes(item.tag);
                         } else {
-                            return ['完成','标记'].includes(item.tag);
+                            return ['完成', '标记'].includes(item.tag);
                         }
                     })
-                    return commodities;
                 },
                 groupOrderIssueLogs(workOrder) {
                     workOrder.current_issue_type = workOrder.issue_type ? workOrder.issue_type.name : '';
@@ -478,6 +555,7 @@
                             logistic_number: item.logistic_number,                      // 快递单号
                             status: item.status,                                        // 工单状态
                             created_at: item.created_at,                                // 创建时间
+                            tag: item.tag,                                              // 标记
                         };
                     });
                 },
@@ -490,7 +568,10 @@
                 groupImages(workOrder, type) {
                     let images = [];
                     workOrder.details.forEach(detail => {
-                        let imageList = detail.images.filter(item => {
+                        let imageList = detail.images.map(item => {
+                            item.issue_type_name = detail.issue_type ? detail.issue_type.name : '';
+                            return item;
+                        }).filter(item => {
                             return item.type === type;
                         })
                         images.push(...imageList);
@@ -503,7 +584,9 @@
                         let logList = detail.logs.map(item => {
                             return {
                                 id: item.id,                     // id
+                                tag: detail.tag,                  // 标记
                                 created_at: item.created_at,     // 创建时间
+                                issue_type: detail.issue_type ? detail.issue_type.name : '',     // 创建时间
                                 creator: item.creator,           // 创建人
                                 type: item.type,                 // 类型
                                 content: item.content,           // 内容
@@ -513,17 +596,6 @@
                     });
                     return logs;
                 },
-                sortTransfer(item) {
-                    if (!("transfer_status" in item)) return;
-                    if (item.transfer_status == null || !(item.transfer_status instanceof Array)) return;
-                    item.transfer_status.sort(function (item1, item2) {
-                        let date1 = new Date(item1['accept_time']);
-                        let date2 = new Date(item2['accept_time']);
-                        if (date1 - date2 > 0) return -1;
-                        if (date1 - date2 < 0) return 1;
-                        return 0;
-                    });
-                },
                 createOrderIssue(item, tag) { // 生成问题件
                     let url = '{{route('workOrder.buildOrderIssueApi')}}';
                     let data = {};
@@ -665,27 +737,6 @@
                         tempTip.showSuccess('复制失败:' + e)
                     }
                 },
-                batchReview() {
-                    let url = '{{route('workOrder.batchReviewApi')}}';
-                    let data = {ids: checkData};
-                    window.tempTip.setIndex('1999');
-                    if (!confirm('是否对当前选中订单进行审核')) return;
-                    window.tempTip.waitingTip('审核中........');
-                    window.axios.post(url, data).then(res => {
-                        if (res.data.success) {
-                            this.replaceWorkOrder(res.data.data);
-                            this.$forceUpdate();
-                            window.tempTip.cancelWaitingTip();
-                            window.tempTip.showSuccess('审核完成');
-                        } else {
-                            window.tempTip.cancelWaitingTip();
-                            window.tempTip.show(res.data.message ? res.data.message : '审核出现异常');
-                        }
-                    }).catch(err => {
-                        window.tempTip.cancelWaitingTip();
-                        window.tempTip.show(err);
-                    })
-                },
                 changeIssueType(item, e) {
                     let url = '{{route('workOrder.updateIssueTypeApi')}}';
                     let data = {
@@ -762,16 +813,6 @@
                         images.splice(i, 1);
                     });
                 },
-                clearWorkOrder(item = null, index = null) {
-                    this.fillWorkOrder.id = item ? item.id : null;
-                    this.fillWorkOrder.detail_id = item ? this.getCurrentWorkOrderDetailId(item) : null;
-                    this.selectIndex = index ? index : null;
-                    this.fillWorkOrder.reissue_logistic_number = null;      // 补发单号
-                    this.fillWorkOrder.logistic_number = null;              // 补发单号
-                    this.fillWorkOrder.dealImages = [];                     // 交易图
-                    this.fillWorkOrder.refundImages = [];                   // 退款图
-                    this.fillWorkOrder.commodities = [];
-                },
                 setFormDataImagePrefix(formData, prefix, images) {
                     images.forEach((item, i) => {
                         formData.append(`${prefix}[]`, item);
@@ -810,209 +851,56 @@
                         };
                     });
                 },
-                logisticFillWorkOrder(item, index) {
-                    this.fillWorkOrder = JSON.parse(JSON.stringify(item.pending_detail));
-                    this.selectIndex = index;
-                    $("#logistic-fill-work-order-modal").modal('show');
-                },
-                logisticUpdateCommodities() {
-                    let url = "{{route("workOrder.commodity.logisticUpdateApi")}}";
-                    let formData = new FormData();
-                    formData.append('id', this.fillWorkOrder.id);
-                    formData.append('detail_id', this.fillWorkOrder.detail_id);
-                    this.fillWorkOrderCommodity(formData);
-                    window.tempTip.setIndex(1999);
-                    window.axios.post(url, formData, {'Content-Type': 'multipart/form-data'})
-                        .then(res => {
-                            if (res.data.success) {
-                                this.sortOrder(res.data.data);
-                                this.$set(this.workOrders, this.selectIndex, res.data.data);
-                                window.tempTip.showSuccess('修改成功');
-                                $("#logistic-fill-work-order-modal").modal('hide');
-
-                            } else {
-                                window.tempTip.show(res.data.message ? res.data.message : '修改异常');
-                            }
-                        }).catch(err => {
-                        window.tempTip.show(err);
-                    });
-                },
-                logisticEndWorkOrder(item, index) {
-                    let url = "{{route("workOrder.logistic.endApi")}}";
-                    let data = {
-                        id:item.id,
-                        detail_id:this.getCurrentWorkOrderDetailId(item),
-                    };
-                    window.axios.post(url, data).then(res => {
-                        if (res.data.success) {
-                            window.tempTip.showSuccess('工单已处理');
-                            this.sortOrder(res.data.data);
-                            this.$set(this.workOrders, index, res.data.data);
-                        } else {
-                            window.tempTip.show(res.data.message ? res.data.message : '工单处理异常刷新后重试');
-                        }
-                    }).catch(err => {
-                        window.tempTip.show(err || '工单处理异常刷新后重试');
-                    });
-                },
-                baoShiFillWorkOrder(item, index) {
-                    this.fillWorkOrder = JSON.parse(JSON.stringify(item.pending_detail));
-                    this.selectIndex = index;
-                    $('#bao-shi-fill-work-order-modal').modal('show');
-                },
-                baoShiUpdateCommodities() {
-                    let url = "{{route("workOrder.commodity.baoShiUpdateApi")}}";
-                    let formData = new FormData();
-                    formData.append('id', this.fillWorkOrder.id);
-                    formData.append('detail_id', this.fillWorkOrder.detail_id);
-                    this.fillWorkOrderCommodity(formData)
-                    window.tempTip.setIndex(1999);
-                    window.axios.post(url, formData, {'Content-Type': 'multipart/form-data'})
-                        .then(res => {
-                            if (res.data.success) {
-                                this.sortOrder(res.data.data);
-                                this.$set(this.workOrders, this.selectIndex, res.data.data);
-                                window.tempTip.showSuccess('修改成功');
-                                $("#bao-shi-fill-work-order-modal").modal('hide');
-                            } else {
-                                window.tempTip.show(res.data.message ? res.data.message : '修改异常');
-                            }
-                        }).catch(err => {
-                        window.tempTip.show(err);
-                    })
-                },
-                ownerFillWorkOrder(item, index) {
-                    window.tempTip.waitingTip('获取数据中');
-                    this.getOrderCommodity(item).then(res => {
-                        window.tempTip.cancelWaitingTip();
-                        this.clearWorkOrderWith(item, index);
-                        this.fillWorkOrder.commodities = res.map(item => {
-                            item.abnormal_amount = item.amount;
-                            item.tag = 0;
-                            return item;
-                        });
-                        $("#owner-fill-work-order-modal").modal('show');
-                    }).catch(err => {
-                        window.tempTip.cancelWaitingTip();
-                        window.tempTip.show('获取数据异常');
-                    });
-                },
-                clearWorkOrderWith(item, index) {
-                    this.fillWorkOrder.id = item.id;
-                    this.fillWorkOrder.detail_id = this.getCurrentWorkOrderDetailId(item);
-                    this.selectIndex = index;
-                    this.fillWorkOrder.reissue_logistic_number = null; // 补发单号
-                    this.fillWorkOrder.logistic_number = null; // 补发单号
-                    this.fillWorkOrder.dealImages = []; // 交易图
-                    this.fillWorkOrder.refundImages = []; // 退款图
-                },
                 getOrderCommodity(item) {
                     return new Promise((resolve, reject) => {
                         let url = '{{route('order.commodity.getCommoditiesApi')}}';
                         let data = {orderNo: item ? (item.order ? item.order.code : '') : ''};
                         window.axios.post(url, data).then(res => {
                             if (res.data.success) {
+                                this.countCommoditiesByLogisticNumber(res.data.data);
                                 resolve(res.data.data);
                             }
                         }).catch(err => {
                         });
                     });
                 },
-                ownerUpdateWorkOrder() {
-                    if (!this.checkFillLossWorkOrder()) return;
-                    let formData = new FormData();
-                    formData.append('id', this.fillWorkOrder.id);
-                    formData.append('detail_id', this.fillWorkOrder.detail_id);
-                    formData.append('reissue_logistic_number', this.fillWorkOrder.reissue_logistic_number);
-                    formData.append('logistic_number', this.fillWorkOrder.logistic_number);
-                    formData.append('price', this.fillWorkOrder.price);
-                    let dealImages = this.getImages(this.fillWorkOrder.dealImages);
-                    let refundImages = this.getImages(this.fillWorkOrder.refundImages);
-                    this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
-                    this.setFormDataImagePrefix(formData, 'refundImages', refundImages);
-                    this.fillWorkOrderCommodity(formData);
-                    this.ownerFillLossWorkOrder(formData);
-                },
-                checkFillLossWorkOrder() {
-                    window.tempTip.setIndex(2000);
-                    window.tempTip.setDuration(1500);
-                    let message = null;
-                    let abnormal_amount_is_null = this.fillWorkOrder.commodities.filter(item => {
-                        return Number(item.abnormal_amount) === 0;
-                    }).length > 0;
-                    if (abnormal_amount_is_null) message = '异常数量不能为空';
-                    if (this.fillWorkOrder.refundImages.length === 0) message = '退款截图为必需项!';
-                    if (this.fillWorkOrder.reissue_logistic_number !== null) {
-                    } else if (this.fillWorkOrder.dealImages.length === 0) {
-                        message = '交易截图为必需项!';
-                    }
-                    if (message) {
-                        window.tempTip.show(message);
-                        return false;
-                    }
-                    return true;
-                },
-                fillWorkOrderCommodity(formData) {
-                    this.fillWorkOrder.commodities.forEach(e => {
-                        formData.append("commodities[]", JSON.stringify(e));
-                    });
-                },
-                ownerFillLossWorkOrder(data) {
-                    let url = "{{route('workOrder.updateLossApi')}}";
-                    window.tempTip.setIndex(1999);
-                    window.axios.post(url, data, {'Content-Type': 'multipart/form-data'}).then(res => {
-                        if (res.data.success) {
-                            this.sortOrder(res.data.data);
-                            this.$set(this.workOrders, this.selectIndex, res.data.data);
-                            window.tempTip.showSuccess('工单信息填充成功');
-                            this.clearWorkOrder();
-                            $("#owner-fill-work-order-modal").modal('hide');
-                        } else {
-                            window.tempTip.show(res.data.message);
+                countCommoditiesByLogisticNumber(commodities){
+                    let index = 0;
+                    let logistic_number = commodities[0]['logistic_number'];
+                    let count = 0;
+                    for(let i = 0; i < commodities.length;i++){
+                        let cur_logistic_number = commodities[i]['logistic_number'];
+                        if (i === commodities.length - 1 && cur_logistic_number === logistic_number){
+                            count ++;
+                            commodities[index]['count'] = count;
+                            break;
                         }
-                    }).catch(err => {
-                        window.tempTip.show(err);
-                    });
+                        if (logistic_number === cur_logistic_number){
+                            count++;
+                        } else if (logistic_number !== cur_logistic_number){
+                            commodities[index]['count'] = count;
+                            index = i;
+                            count = 1;
+                        }
+                        if (i === commodities.length - 1){
+                            commodities[index]['count'] = count;
+                        }
+                    }
+                    return commodities;
                 },
                 baoShiReview(item, i) { // 宝时终审
                     this.reviewWorkOrder = JSON.parse(JSON.stringify(item.pending_detail));
                     this.selectIndex = i;
                     $('#bao-shi-review-modal').modal('show');
                 },
-                getCurrentWorkOrderDetailId(workOrder){
-                    let items = workOrder.details.filter(item=>{
-                        return !['标记','完成'].includes(item.tag);
+                getCurrentWorkOrderDetailId(workOrder) {
+                    let items = workOrder.details.filter(item => {
+                        return !['标记', '完成'].includes(item.tag);
                     });
                     if (items.length === 0) return null;
                     let item = items.shift();
                     return item.id;
                 },
-                review() {
-                    let formData = new FormData();
-                    formData.append('id', this.reviewWorkOrder.id);
-                    formData.append('detail_id', this.reviewWorkOrder.detail_id);
-                    this.reviewWorkOrderCommodity(formData);
-                    let url = "{{route('workOrder.baoShi.reviewApi')}}";
-                    window.tempTip.setIndex(1999);
-                    window.tempTip.waitingTip('审核中');
-                    window.axios.post(url, formData).then(res => {
-                        window.tempTip.cancelWaitingTip();
-                        if (res.data.success) {
-                            this.sortOrder(res.data.data);
-                            this.$set(this.workOrders, this.selectIndex, res.data.data);
-                            window.tempTip.setIndex(1999);
-                            window.tempTip.showSuccess('审核完成');
-                        } else {
-                            window.tempTip.setIndex(1999);
-                            window.tempTip.show(res.data.message ? res.data.message : '审核异常刷新后重试');
-                        }
-                        $('#bao-shi-review-modal').modal('hide');
-                    }).catch(err => {
-                        window.tempTip.cancelWaitingTip();
-                        window.tempTip.setIndex(1999);
-                        window.tempTip.show(err);
-                    })
-                },
                 reviewWorkOrderCommodity(formData) {
                     this.reviewWorkOrder.commodities.forEach(e => {
                         formData.append("commodities[]", JSON.stringify(e));
@@ -1028,73 +916,590 @@
                         return Number(prev) + Number(cur.price);
                     }, 0);
                 },
-                createOrderIssueLog(orderIssueId,item){
-                    let log_text = document.getElementById(orderIssueId+'_log_text');
-                    let log_check = document.getElementById(orderIssueId+'_log_check');
-                    let data = {
-                        id:item.order_issue.id,
-                        order_issue_id:orderIssueId,
-                        content:log_text.value,
-                        tag:log_check.checked ? 1 : 0,
-                    };
-                    let url = "{{route("order.issue.log.storeApi")}}";
-                    window.tempTip.waitingTip("创建中");
-                    window.tempTip.setDuration(1500);
-                    window.axios.post(url,data).then(res=>{
-                        window.tempTip.cancelWaitingTip();
-                        if (res.data.success){
-                            item.issue_logs.unshift(res.data.data);
-                            window.tempTip.showSuccess('添加成功');
-                            this.selectCreateOrderIssueLog = null;
-                            log_text.value = null;
-                            log_check.checked = false;
-                        } else {
-                            window.tempTip.setDuration(2000);
-                            window.tempTip.show(res.data.fail_info);
+                getBadgeColor(tag) { // 标记 返回徽章标记
+                    if (tag === '完成') return 'badge-success';
+                    if (tag === '创建') return 'badge-primary';
+                    return '';
+                },
+                // 宝时处理
+                isBaoShiHandler(item){
+                    return '错漏发' === item.issue_type_name  && item.status === '宝时处理';
+                },
+                isBaoShiReview(item){
+                    return item.status === '宝时终审';
+                },
+                baoShiShowEdit(item,index) {
+                    let {status} = item;
+                    let {issue_type_name, detail_id,commodities} = item.pending_detail;
+                    if ("快递丢件" === issue_type_name){
+                        this.selectIndex = index;
+                        this.baoShiEditWorkOrder.issue_type_name = item.issue_type_name;
+                        this.baoShiEditWorkOrder.status = status;
+                        this.baoShiEditWorkOrder.detail_id = detail_id;
+                        commodities.forEach(e=>{
+                            e.bao_shi_check_amount = e.abnormal_amount;
+                        });
+                        this.baoShiEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);
+                        $("#bao-shi-review-modal").modal('show');
+                    } else if('破损' === issue_type_name){
+                        this.selectIndex = index;
+                        this.baoShiEditWorkOrder.issue_type_name = issue_type_name;
+                        this.baoShiEditWorkOrder.detail_id = detail_id;
+                        this.baoShiEditWorkOrder.status = status;
+                        commodities.forEach(e=>{
+                            e.bao_shi_check_amount = e.check_amount;
+                        });
+                        this.baoShiEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);;
+                        $("#bao-shi-review-modal").modal('show');
+                    } else if ('快递异常' === issue_type_name){
+                        this.selectIndex = index;
+                        this.baoShiEditWorkOrder.issue_type_name = issue_type_name;
+                        this.baoShiEditWorkOrder.detail_id = detail_id;
+                        this.baoShiEditWorkOrder.status = status;
+                        commodities.forEach(e=>{
+                            e.bao_shi_check_amount = e.check_amount;
+                        });
+                        this.baoShiEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);;
+                        $("#bao-shi-review-modal").modal('show');
+                    } else if ('错漏发' === issue_type_name){
+                        this.selectIndex = index;
+                        this.baoShiEditWorkOrder.issue_type_name = issue_type_name;
+                        this.baoShiEditWorkOrder.detail_id = detail_id;
+                        this.baoShiEditWorkOrder.status = status;
+                        commodities.forEach(e=>{
+                            e.bao_shi_check_amount = e.check_amount;
+                            e.check_result = null;
+                        });
+                        this.baoShiEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);;
+                        $("#bao-shi-review-modal").modal('show');
+                    }
+                },
+                baoShiEdit() {
+                    let {status,commodities,issue_type_name} = this.baoShiEditWorkOrder;
+                    if ('快递丢件' === issue_type_name ){
+                        let url = '{{route('workOrder.loss.baoShi.reviewApi')}}';
+                        let formData = new FormData();
+                        formData.append('detail_id',this.baoShiEditWorkOrder.detail_id);
+                        commodities.forEach(e => {
+                            formData.append("commodities[]", JSON.stringify(e));
+                        });
+                        window.tempTip.setIndex(2000);
+                        window.tempTip.waitingTip('处理中');
+                        window.axios.post(url,formData).then(res=>{
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success){
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders,this.selectIndex,res.data.data);
+                                $("#bao-shi-review-modal").modal('hide');
+                                this.successTempTip('处理完成')
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理工单出现异常,刷新后重试');
+                            }
+                        }).catch(err=>{
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        });
+                    } else if('破损' === issue_type_name){
+                        let res = this.checkBaoShiEditWorkOrder();
+                        if (!res.success){
+                            this.errorTempTip(res.message);
+                            return;
                         }
-                    }).catch(err=>{
-                        window.tempTip.cancelWaitingTip();
-                        tempTip.setDuration(4000);
-                        tempTip.show('网络异常:' + err);
-                    });
+                        let url = '{{route('workOrder.damage.baoShi.reviewApi')}}';
+                        let formData = new FormData();
+                        formData.append('detail_id',this.baoShiEditWorkOrder.detail_id);
+                        commodities.forEach(e => {
+                            formData.append("commodities[]", JSON.stringify(e));
+                        });
+                        window.tempTip.setIndex(2000);
+                        window.tempTip.waitingTip('处理中');
+                        window.axios.post(url,formData).then(res=>{
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success){
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders,this.selectIndex,res.data.data);
+                                this.successTempTip('处理完成');
+                                $("#bao-shi-review-modal").modal('hide');
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新页面重试');
+                            }
+                        }).catch(err=>{
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        });
+                    } else if ('快递异常' === issue_type_name){
+                        let res = this.checkBaoShiEditWorkOrder();
+                        if (!res.success){
+                            this.errorTempTip(res.message);
+                            return;
+                        }
+                        let url = '{{route('workOrder.damage.baoShi.reviewApi')}}';
+                        let formData = new FormData();
+                        formData.append('detail_id',this.baoShiEditWorkOrder.detail_id);
+                        commodities.forEach(e => {
+                            formData.append("commodities[]", JSON.stringify(e));
+                        });
+                        window.tempTip.setIndex(2000);
+                        window.tempTip.waitingTip('处理中');
+                        window.axios.post(url,formData).then(res=>{
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success){
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders,this.selectIndex,res.data.data);
+                                this.successTempTip('处理完成');
+                                $("#bao-shi-review-modal").modal('hide');
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新页面重试');
+                            }
+                        }).catch(err=>{
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        });
+                    } else if ('错漏发' === issue_type_name){
+                        let res = this.checkBaoShiEditWorkOrder();
+                        if (!res.success){
+                            this.errorTempTip(res.message);
+                            return;
+                        }
+                        let url = '{{route('workOrder.mistake.baoShi.reviewApi')}}';
+                        let formData = new FormData();
+                        formData.append('detail_id',this.baoShiEditWorkOrder.detail_id);
+                        commodities.forEach(e => {
+                            formData.append("commodities[]", JSON.stringify(e));
+                        });
+                        window.tempTip.setIndex(2000);
+                        window.tempTip.waitingTip('处理中');
+                        window.axios.post(url,formData).then(res=>{
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success){
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders,this.selectIndex,res.data.data);
+                                this.successTempTip('处理完成');
+                                $("#bao-shi-review-modal").modal('hide');
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新页面重试');
+                            }
+                        }).catch(err=>{
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        });
+                    }
                 },
-                destroyLog(log,index,i){
-                    if (!confirm('是否删除当前记录')) return;
-                    if (log.type === '创建') {
-                        tempTip.show('创建记录不能删除');
-                        return;
+                // 承运商相关
+                isLogisticDispose(item) {
+                    return ['拦截', '信息更改', '快递异常', '破损','快递丢件'].includes(item.issue_type_name) && item.status === '承运商处理';
+                },
+                logisticShowEdit(item, index) {
+                    let {status} = item.issue_type_name;
+                    let {issue_type_name,detail_id,commodities} = item.pending_detail;
+                    if (issue_type_name === '拦截') {
+                        window.tempTip.waitingTip('处理中');
+                        let url = "{{route('workOrder.intercept.logistic.handlerApi')}}";
+                        let data = {detail_id: detail_id};
+                        window.axios.post(url, data).then(res => {
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success) {
+                                this.successTempTip("处理完成");
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders, index, res.data.data);
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理出现异常!刷新页面重试');
+                            }
+                        }).catch(err => {
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err)
+                        });
+                    } else if (issue_type_name === '信息更改') {
+                        window.tempTip.waitingTip('处理中');
+                        let url = "{{route('workOrder.informationChange.logistic.handlerApi')}}";
+                        let data = {detail_id: item.pending_detail.detail_id};
+                        window.axios.post(url, data).then(res => {
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success) {
+                                this.successTempTip("处理完成");
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders, index, res.data.data);
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理出现异常!刷新页面重试');
+                            }
+                        }).catch(err => {
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err)
+                        });
+                    } else if ('快递丢件' === issue_type_name  ){
+                        this.selectIndex = index;
+                        this.logisticEditWorkOrder.detail_id = item.pending_detail.detail_id;
+                        this.logisticEditWorkOrder.issue_type_name = issue_type_name;
+                        this.logisticEditWorkOrder.status = status;
+                        let commodities = item.pending_detail.commodities;
+                        commodities.forEach(e=>{
+                            e.check_amount = e.abnormal_amount;
+                        });
+                        this.logisticEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);
+                        $("#logistic-fill-work-order-modal").modal('show');
+                    } else if ('破损' === issue_type_name){
+                        this.selectIndex = index;
+                        this.logisticEditWorkOrder.detail_id = item.pending_detail.detail_id;
+                        this.logisticEditWorkOrder.issue_type_name = issue_type_name;
+                        this.logisticEditWorkOrder.status = status;
+                        let commodities = item.pending_detail.commodities;
+                        commodities.forEach(e=>{
+                            e.check_amount = e.abnormal_amount;
+                        });
+                        this.logisticEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);
+                        $("#logistic-fill-work-order-modal").modal('show');
+                    } else if ('快递异常' === issue_type_name){
+                        this.selectIndex = index;
+                        this.logisticEditWorkOrder.detail_id = detail_id;
+                        this.logisticEditWorkOrder.issue_type_name = issue_type_name;
+                        this.logisticEditWorkOrder.status = status;
+                        let commodities = item.pending_detail.commodities;
+                        commodities.forEach(e=>{
+                            e.check_amount = e.abnormal_amount;
+                        });
+                        this.logisticEditWorkOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);
+                        $("#logistic-fill-work-order-modal").modal('show');
                     }
-                    let url = "{{route("order.issue.log.destroyApi")}}";
-                    let data = {id:log.id};
-                    window.tempTip.setIndex('1999');
-                    window.axios.post(url,data).then(res=>{
-                        if (res.data.success){
-                            this.$delete(this.workOrders[i].issue_logs,index);
-                            tempTip.setDuration(1500);
-                            tempTip.showSuccess('删除成功');
-                        } else {
-                            tempTip.setDuration(2000);
-                            tempTip.show('删除失败:' + res.data.fail_info);
+                },
+                logisticEdit() {
+                    let {issue_type_name,commodities,detail_id} = this.logisticEditWorkOrder;
+                    if (issue_type_name ==='破损'){
+                        let res = this.checkLogisticEditWorkOrder();
+                        if (!res.success){
+                            this.errorTempTip(res.message);
+                            return;
                         }
-                    }).catch(err=>{
-                        tempTip.setDuration(2500);
-                        tempTip.show('网络异常:' + err);
-                    });
+                        let url = '{{route('workOrder.damage.logistic.handlerApi')}}';
+                        let formData= new FormData();
+                        formData.append('detail_id',detail_id);
+                        commodities.forEach(e=>{
+                            formData.append('commodities[]',JSON.stringify(e));
+                        });
+                        window.tempTip.setIndex(2000);
+                        window.tempTip.waitingTip('处理中');
+                        window.axios.post(url,formData).then(res=>{
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success){
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders,this.selectIndex,res.data.data);
+                                this.successTempTip('处理完成');
+                                $("#logistic-fill-work-order-modal").modal('hide');
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新当前页面重试');
+                            }
+                        }).catch(err=>{
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        })
+                    } else if ('快递异常' === issue_type_name){
+                        let res = this.checkLogisticEditWorkOrder();
+                        if (!res.success){
+                            this.errorTempTip(res.message);
+                            return;
+                        }
+                        let url = '{{route('workOrder.expressAbnormal.logistic.handlerApi')}}';
+                        let formData= new FormData();
+                        formData.append('detail_id',detail_id);
+                        commodities.forEach(e=>{
+                            formData.append('commodities[]',JSON.stringify(e));
+                        });
+                        window.tempTip.setIndex(2000);
+                        window.tempTip.waitingTip('处理中');
+                        window.axios.post(url,formData).then(res=>{
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success){
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders,this.selectIndex,res.data.data);
+                                this.successTempTip('处理完成');
+                                $("#logistic-fill-work-order-modal").modal('hide');
+                            } else {
+                                this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新当前页面重试');
+                            }
+                        }).catch(err=>{
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        })
+                    }
                 },
-                tagIssueLog(log){
-                    let url = '{{route('order.issue.log.tagApi')}}';
-                    let data = {id: log.id};
-                    if (!confirm('是否标记当前记录客户不可见')) return;
-                    window.axios.post(url, data).then(res => {
-                        if (res.data.success) {
-                            window.tempTip.showSuccess('标记成功');
-                            log.tag = 1;
-                        } else {
-                            window.tempTip.show(res.data.message ? res.data.message : '标记出现异常');
+                // 商家相关
+                isOwnerDispose(item) {
+                    if (item.issue_type_name === '快递丢件' && item.status === '货主处理') return true;
+                    else if (item.issue_type_name === '错漏发' && item.status === '待货主完结') return true;
+                    return false;
+                },
+                ownerShowEdit(item, index) {
+                    let issue_type_name = item.issue_type_name;
+                    if (issue_type_name === '快递丢件' && item.status === '货主处理') {
+                        window.tempTip.waitingTip('获取数据中');
+                        this.getOrderCommodity(item).then(res => {
+                            window.tempTip.cancelWaitingTip();
+                            this.selectIndex = index;
+                            this.ownerEditWorKOrder.pirce = null;
+                            this.ownerEditWorKOrder.status = item.status;
+                            this.ownerEditWorKOrder.issue_type_name = issue_type_name;
+                            this.ownerEditWorKOrder.commodities = res.map(item => {
+                                item.abnormal_amount = item.amount;
+                                item.tag = 0;
+                                item.price = 0;
+                                return item;
+                            }); //商品详情
+                            this.ownerEditWorKOrder.id = item.id;                                   // 工单id
+                            this.ownerEditWorKOrder.detail_id = item.pending_detail.detail_id;      // 工单详情id
+                            this.ownerEditWorKOrder.reissue_logistic_number = null;                 //
+                            this.ownerEditWorKOrder.logistic_number = null;                         //
+                            this.ownerEditWorKOrder.refundImages = [];                              // 退款截图
+                            this.ownerEditWorKOrder.dealImages = [];                                // 交易截图
+                            $("#owner-fill-work-order-modal").modal('show');
+                        }).catch(err => {
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip('获取数据异常')
+                        });
+                    } else if (issue_type_name === '错漏发' && item.status === '待货主完结') {
+                        this.selectIndex = index;
+                        this.ownerEditWorKOrder.detail_id = item.pending_detail.detail_id;
+                        let commodities = item.pending_detail.commodities;
+                        commodities.forEach(e=>{
+                            e.check_amount = e.abnormal_amount;
+                        });
+                        this.ownerEditWorKOrder.commodities = this.countCommoditiesByLogisticNumber(commodities);
+                        this.ownerEditWorKOrder.status = item.status;
+                        this.ownerEditWorKOrder.issue_type_name = issue_type_name;
+                        $("#owner-fill-work-order-modal").modal('show');
+                    }
+                },
+                ownerEdit() {
+                    let {issue_type_name, status} = this.ownerEditWorKOrder;
+                    if (issue_type_name === '快递丢件' && status === '货主处理') {
+                        let res = this.checkOwnerEditWorkOrder();
+                        if (!res.success) {
+                            this.errorTempTip(res.message);
+                            return;
                         }
-                    }).catch(err => {
-                        window.tempTip.show(err);
+                        let formData = new FormData();
+                        let {detail_id, reissue_logistic_number, logistic_number, price, dealImages, refundImages,commodities} = this.ownerEditWorKOrder;
+                        formData.append('detail_id', detail_id);
+                        formData.append('reissue_logistic_number', reissue_logistic_number);
+                        formData.append('logistic_number', logistic_number);
+                        formData.append('price', price);
+                        dealImages = this.getImages(dealImages);
+                        refundImages = this.getImages(refundImages);
+                        this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
+                        this.setFormDataImagePrefix(formData, 'refundImages', refundImages);
+                        commodities.forEach(e => {
+                            formData.append("commodities[]", JSON.stringify(e));
+                        });
+                        window.tempTip.waitingTip('处理中');
+                        let url = '{{route('workOrder.loss.owner.fillDetailApi')}}';
+                        window.axios.post(url, formData,{'Content-Type': 'multipart/form-data'}).then(res => {
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success) {
+                                this.successTempTip('处理完成');
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders, this.selectIndex, res.data.data);
+                                this.selectIndex = null;
+                                $("#owner-fill-work-order-modal").modal('hide');
+                            } else if (res.data.message) {
+                                this.errorTempTip(res.data.message);
+                            } else {
+                                this.errorTempTip('处理出现异常');
+                            }
+                        }).catch(err => {
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        })
+                    } else if (issue_type_name === '错漏发' && this.ownerEditWorKOrder.status === '待货主完结') {
+                        let res = this.checkOwnerEditWorkOrder();
+                        if (!res.success) {
+                            this.errorTempTip(res.message);
+                            return;
+                        }
+                        let url = '{{route('workOrder.mistake.owner.handlerAndEndApi')}}';
+                        let formData = new FormData();
+                        let {detail_id, commodities} = this.ownerEditWorKOrder;
+                        formData.append('detail_id', detail_id);
+                        commodities.forEach(e => {
+                            formData.append("commodities[]", JSON.stringify(e));
+                        });
+                        window.tempTip.waitingTip('处理中');
+                        window.axios.post(url, formData,{'Content-Type': 'multipart/form-data'}).then(res => {
+                            window.tempTip.cancelWaitingTip();
+                            if (res.data.success) {
+                                this.successTempTip('处理完成');
+                                this.sortOrder(res.data.data);
+                                this.$set(this.workOrders, this.selectIndex, res.data.data);
+                                this.selectIndex = null;
+                                $("#owner-fill-work-order-modal").modal('hide');
+                            } else if (res.data.message) {
+                                this.errorTempTip(res.data.message);
+                            } else {
+                                this.errorTempTip('处理出现异常');
+                            }
+                        }).catch(err => {
+                            window.tempTip.cancelWaitingTip();
+                            this.errorTempTip(err);
+                        })
+                    }
+                },
+                checkBaoShiEditWorkOrder(){
+                    if (  ['破损','快递异常'].includes(this.baoShiEditWorkOrder.issue_type_name)){
+                        let filers = this.baoShiEditWorkOrder.commodities.filter(e => {
+                            return  e.process_result === null || e.process_result.length <= 0;
+                        });
+                        if (filers.length > 0){
+                            return {success: false, message: '商品详情中处理结果不能为空'};
+                        }
+                    } else if ('错漏发' === this.baoShiEditWorkOrder.issue_type_name){
+                        let filers = this.baoShiEditWorkOrder.commodities.filter(e => {
+                            return  e.check_result === null || e.check_result.length <= 0;
+                        });
+                        if (filers.length > 0){
+                            return {success: false, message: '商品详情中处理结果不能为空'};
+                        }
+                    }
+                    return {success:true};
+                },
+                checkOwnerEditWorkOrder() {
+                    if (this.ownerEditWorKOrder.issue_type_name === '快递丢件'){
+                        if (this.ownerEditWorKOrder.reissue_logistic_number) {
+                        } else if (this.ownerEditWorKOrder.dealImages.length === 0) {
+                            return {success: false, message: '交易截图和补发单号 二选一'};
+                        }
+                        if (this.ownerEditWorKOrder.commodities.length === 0) {
+                            return {success: false, message: '丢件商品为必填项'};
+                        }
+                        let filers = this.ownerEditWorKOrder.commodities.filter(item => {
+                            return Number(item.price) <= 0 || Number(item.abnormal_amount) <= 0;
+                        });
+                        if (filers.length > 0) {
+                            return {success: false, message: '商品详情中价格为异常数量为必填项,且不为0'};
+                        }
+                    } else if (this.ownerEditWorKOrder.issue_type_name === '错漏发'){
+                        let filters = this.ownerEditWorKOrder.commodities.filter(e=>{
+                            if (e.check_result!== '核实未错漏发' &&( e.process_result === '' || e.process_result_info === ''))return true;
+                            else return e.check_result === '核实未错漏发' && e.process_result === '';
+                        });
+                        if (filters.length > 0 ){
+                            return {success: false, message: '商品详情中的处理项,和处理子项 未必选项'};
+                        }
+                    }
+                    return {success: true};
+                },
+                checkLogisticEditWorkOrder(){
+                    let filers = this.logisticEditWorkOrder.commodities.filter(item => {
+                        return item.check_result.length  === 0;
                     });
+                    if (filers.length > 0){
+                        return {success:false,message:'商品详情的核实结果不能为空'}
+                    }
+                    return {success:true};
+                },
+                successTempTip(message) {
+                    window.tempTip.setDuration(1500);
+                    window.tempTip.setIndex(2000);
+                    window.tempTip.showSuccess(message);
+                },
+                errorTempTip(message) {
+                    window.tempTip.setDuration(2000);
+                    window.tempTip.setIndex(2000);
+                    window.tempTip.show(message);
+                },
+                getProcessResult(check_result,item){
+                    let results = null;
+                    if (check_result === '核实少发'){
+                        results = ['少发','少发,不补发'];
+                    }else if (check_result === '核实多发'){
+                        results = ['多发,客户买下','多发,客户退回'];
+                    }else if (check_result === '核实未错漏发'){
+                        results = ['核实未错漏发'];
+                        item.process_result = '核实未错漏发';
+                    }
+                    return results;
+                },
+                getProcessResultInfo(process_result,item){
+                    let processResultInfos =  {
+                        "少发": ['宝时补发(商家不做单)'],
+                        "多发,客户买下": ['商家做出库单(物流选自提,宝时不发货)'],
+                        "多发,客户退回": ['客户自行退回(提供退回单号)','宝时上门取件(提供寄件信息,地址,联系人,电话)'],
+                        '少发,不补发': ['商家做入库单,选择明细和数量'],
+                        '核实未错漏发': [''],
+                    };
+                    let infos = processResultInfos[process_result];
+                    if (typeof(infos) === 'undefined') return [];
+                    if (infos.length === 0){
+                        item.process_result_info = infos[0];
+                    }
+                    return infos;
+                },
+                showAddBtn(e) {
+                    let domObj = $(e.target).parents('.log-td');
+                    if (domObj.hasClass('log-td')) {
+                        domObj.find('.add-btn').show();
+                    } else {
+                        let obj = $(e.target);
+                        if (obj.hasClass('log-td')) {
+                            obj.find('.add-btn').show();
+                        }
+                    }
+                },
+                hideAddBtn(e) {
+                    let domObj = $(e.target);
+                    if (domObj.hasClass('log-td')) {
+                        domObj.find('.add-btn').hide();
+                    }
+                },
+                showAddDiv(id) {
+                    let div = $('#' + id);
+                    if (div.is(":hidden")) {
+                        div.show();
+                        div.find('input[type=text]').focus();
+                    } else {
+                        div.hide();
+                    }
+                },
+                removeFocusing(e) {
+                    $(e.target).parent('tr').removeClass('focusing')
+                },
+                showDelBtn(e) {
+                    let domObj = $(e.target).parent();
+                    domObj.find('.del-btn').addClass('visible').removeClass('invisible');
+
+                },
+                hideDelBtn(e) {
+                    let domObj = $(e.target);
+                    domObj.find('.del-btn').addClass('invisible').removeClass('visible');
+                },
+                toggleLogs(orderIssue, e, index) {
+                    if (orderIssue.log_is_show === false) {
+                        orderIssue.log_is_show = true;
+                        $(e.target).text('点击收起');
+                    } else {
+                        orderIssue.log_is_show = false;
+                        $(e.target).text("记录共" + orderIssue.logs.length + "条,点击展开");
+                    }
+                },
+                countByCommodities(commodities){
+                    if (commodities.length === 0) return;
+                    let index = 0;
+                    let logistic_number = commodities[0]['logistic_number'];
+                    let count = 0;
+                    for(let i = 0; i < commodities.length;i++){
+                        let cur_logistic_number = commodities[i]['logistic_number'];
+                        if (i === commodities.length - 1 && cur_logistic_number === logistic_number){
+                            count ++;
+                            commodities[index]['count'] = count;
+                            break;
+                        }
+                        if (logistic_number === cur_logistic_number){
+                            count++;
+                        } else if (logistic_number !== cur_logistic_number){
+                            commodities[index]['count'] = count;
+                            index = i;
+                            count = 1;
+                        }
+                        if (i === commodities.length - 1){
+                            commodities[index]['count'] = count;
+                        }
+                    }
                 }
             },
         });

+ 28 - 13
routes/apiLocal.php

@@ -274,27 +274,42 @@ Route::group(['prefix' => 'print'],function (){
 });
 
 Route::prefix('workOrder')->group(function(){
-    Route::post('intercept','WorkOrderController@interceptApi')->name('workOrder.interceptApi');                            // 拦截
-    Route::post('informationChange','WorkOrderController@informationChangeApi')->name('workOrder.informationChangeApi');    // 改信息
-    Route::post('loss','WorkOrderController@lossApi')->name('workOrder.lossApi');                                           // 快递丢件
-    Route::post('fillLoss','WorkOrderController@fillLossApi')->name('workOrder.fillLossApi');                               // 快递丢件填充
-    Route::post('damaged','WorkOrderController@damagedApi')->name('workOrder.damagedApi');                                  // 快递破损
-    Route::post('expressAbnormal','WorkOrderController@expressAbnormalApi')->name('workOrder.expressAbnormalApi');          // 快递异常
-    Route::post('mistake','WorkOrderController@mistakeApi')->name('workOrder.mistakeApi');                                  // 错漏发
+    Route::prefix('intercept')->group(function(){           // 拦截
+        Route::post('store','WorkOrderInterceptController@storeApi')->name('workOrder.intercept.storeApi');                                     // 拦截订单创建
+        Route::post('logistic/header','WorkOrderInterceptController@logisticHandlerApi')->name('workOrder.intercept.logistic.handlerApi');        // 承运商处理
+    });
+    Route::prefix('informationChange')->group(function(){   // 信息修改
+        Route::post('store','WorkOrderInformationChangeController@storeApi')->name('workOrder.informationChange.storeApi');                         // 创建
+        Route::post('logistic/header','WorkOrderInformationChangeController@logisticHandlerApi')->name('workOrder.informationChange.logistic.handlerApi');     // 信息修改
+    });
+    Route::prefix('loss')->group(function(){                // 快递丢件
+        Route::post('store','WorkOrderLossController@storeApi')->name('workOrder.loss.storeApi');                                       // 创建(宝时)
+        Route::post('owner/fill','WorkOrderLossController@ownerFillDetailsApi')->name('workOrder.loss.owner.fillDetailApi');            // 货主填充信息
+        Route::post('baoShi/review','WorkOrderLossController@baoShiReviewApi')->name('workOrder.loss.baoShi.reviewApi');                // 宝时终审
+    });
+    Route::prefix('damage')->group(function(){             // 破损
+        Route::post('store','WorkOrderDamageController@storeApi')->name('workOrder.damage.storeApi');                                   // 创建
+        Route::post('handler/logistic','WorkOrderDamageController@logisticHandleApi')->name('workOrder.damage.logistic.handlerApi');      // 承运商处理
+        Route::post('review/baoShi','WorkOrderDamageController@baoShiReviewApi')->name('workOrder.damage.baoShi.reviewApi');             // 宝时终审
+    });
+    Route::prefix('expressAbnormal')->group(function(){     // 快递异常
+        Route::post('store','WorkOrderExpressAbnormalController@storeApi')->name('workOrder.expressAbnormal.storeApi');                         // 创建
+        Route::post('handler/logistic','WorkOrderExpressAbnormalController@logisticHandleApi')->name('workOrder.expressAbnormal.logistic.handlerApi');   // 承运商处理
+        Route::post('review/baoShi','WorkOrderDamageController@baoShiReviewApi')->name('workOrder.damage.baoShi.reviewApi');                    // 宝时终审
 
-    Route::post('updateLoss','WorkOrderController@updateLossApi')->name('workOrder.updateLossApi');                         // 商家提供丢件信息
+    });
+    Route::prefix('mistake')->group(function(){             // 错漏发
+        Route::post('store','WorkOrderMistakeController@storeApi')->name('workOrder.mistake.storeApi');
+        Route::post('review/baoShi','WorkOrderMistakeController@baoShiReviewApi')->name('workOrder.mistake.baoShi.reviewApi');                  // 宝时审核
+        Route::post('owner/handler','WorkOrderMistakeController@ownerReviewAndEndApi')->name('workOrder.mistake.owner.handlerAndEndApi');       // 商家处理并完结订单
+    });
 
-    Route::post('review/baoShi','WorkOrderController@baoShiReviewApi')->name('workOrder.baoShi.reviewApi');                 // 宝时审核
 
     Route::post('updateIssueType','WorkOrderController@updateIssueTypeApi')->name('workOrder.updateIssueTypeApi');          // 修改问题类型
     Route::post('batchUpdateIssueType','WorkOrderController@batchUpdateIssueTypeApi')->name('workOrder.batchUpdateIssueTypeApi'); // 修改问题类型
-
-    Route::post('batchReview','WorkOrderController@batchReviewApi')->name('workOrder.batchReviewApi');                      // 批量审核
     Route::post('buildOrderIssue','WorkOrderController@buildOrderIssueApi')->name('workOrder.buildOrderIssueApi');          // 生成问题件
     Route::delete('/{id}','WorkOrderController@destroyApi')->name('workOrder.destroyApi');                                  // 工单删除
-
     Route::post('check','WorkOrderController@checkWorkOrderApi')->name('workOrder.checkApi');                               // 检查订单是否存在工单
-    Route::post('logistic/end',"WorkOrderController@logisticEndApi")->name('workOrder.logistic.endApi');                    // 承运商 完结工单
     Route::prefix('commodity')->group(function(){
         Route::post("/owner","WorkOrderCommoditiesController@ownerUpdateCommoditiesApi")->name("workOrder.commodity.ownerUpdateApi");                  // 货主填充商品信息
         Route::post("/logistic","WorkOrderCommoditiesController@logisticUpdateCommoditiesApi")->name("workOrder.commodity.logisticUpdateApi");         // 承运商 更新商品 处理信息