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

Merge branch 'zengjun'

# Conflicts:
#	app/Providers/AppServiceProvider.php
zhouzhendong пре 4 година
родитељ
комит
7351e5450a
36 измењених фајлова са 2613 додато и 1179 уклоњено
  1. 96 78
      app/Filters/WorkOrderFilters.php
  2. 18 2
      app/Http/Controllers/OrderPackageCommoditiesController.php
  3. 29 0
      app/Http/Controllers/TestController.php
  4. 319 67
      app/Http/Controllers/WorkOrderController.php
  5. 85 0
      app/Http/Controllers/WorkOrderLogController.php
  6. 21 3
      app/Http/Requests/WorkOrder/WorkOrderRequest.php
  7. 4 0
      app/Providers/AppServiceProvider.php
  8. 12 0
      app/Services/OrderIssueTypeService.php
  9. 5 3
      app/Services/OrderPackageCommoditiesService.php
  10. 39 47
      app/Services/OrderPackageService.php
  11. 30 4
      app/Services/WorkOrderCommoditiesService.php
  12. 34 24
      app/Services/WorkOrderImageService.php
  13. 28 0
      app/Services/WorkOrderLogService.php
  14. 174 51
      app/Services/WorkOrderService.php
  15. 125 156
      app/WorkOrder.php
  16. 7 2
      app/WorkOrderCommodities.php
  17. 1 1
      app/WorkOrderImage.php
  18. 60 0
      app/WorkOrderLog.php
  19. 12 0
      database/factories/WorkOrderLogFactory.php
  20. 32 0
      database/migrations/2021_10_26_132735_work_orders_add_colunms_logistic_id.php
  21. 43 0
      database/migrations/2021_10_26_132927_add_colunms_to_work_order_commodities.php
  22. 35 0
      database/migrations/2021_10_28_090804_create_work_order_logs_table.php
  23. 32 0
      database/migrations/2021_11_05_095410_work_order_commodities__add_columns_bao_shi_check_amount.php
  24. 16 0
      database/seeds/WorkOrderLogSeeder.php
  25. 172 0
      resources/views/order/index/_workOrkerInfoModal.blade.php
  26. 33 19
      resources/views/order/index/_work_order_modal.blade.php
  27. 218 65
      resources/views/order/index/delivering.blade.php
  28. 80 0
      resources/views/order/workOrder/_bao_shi_review.blade.php
  29. 94 0
      resources/views/order/workOrder/_baoshi_fill_work_order.blade.php
  30. 1 1
      resources/views/order/workOrder/_edit_issue_type.blade.php
  31. 1 1
      resources/views/order/workOrder/_fill_loss_work_order.blade.php
  32. 82 0
      resources/views/order/workOrder/_logistic_fill_work_order.blade.php
  33. 150 0
      resources/views/order/workOrder/_owner_fill_work_order.blade.php
  34. 170 148
      resources/views/order/workOrder/_work_order_details.blade.php
  35. 330 502
      resources/views/order/workOrder/index.blade.php
  36. 25 5
      routes/apiLocal.php

+ 96 - 78
app/Filters/WorkOrderFilters.php

@@ -5,8 +5,8 @@ namespace App\Filters;
 
 use App\Order;
 use App\OrderIssue;
+use App\OrderIssueType;
 use App\OrderPackage;
-use App\Services\OwnerService;
 use App\Traits\ModelSearchWay;
 use App\User;
 use App\WorkOrder;
@@ -19,14 +19,15 @@ class WorkOrderFilters
 {
     use ModelSearchWay;
 
+    /** @var Builder $queryBuilder */
     protected $request;
     protected $queryBuilder;
     protected $filters = [
         'ids',
         'creator',
         'remake',
-        'created_at_start','created_at_end',
-        'review_at_start','review_at_end',
+        'created_at_start', 'created_at_end',
+        'review_at_start', 'review_at_end',
         'reviewer',
         'word_order_types',
         'word_order_child_types',
@@ -35,9 +36,9 @@ class WorkOrderFilters
         'logistic_number',
         'is_issue_order',
         'order_issue_type',
-        'grad',
         'owner',
         'client_code',
+        'is_end'
     ];
     protected $array_filter;
     protected $params = [];
@@ -45,6 +46,7 @@ class WorkOrderFilters
     protected $workOrderTypeQuery;
     protected $orderQuery;
     protected $orderPackageQuery;
+    protected $issueTypeQuery;
 
     public function __construct(Request $request)
     {
@@ -68,25 +70,18 @@ class WorkOrderFilters
 
     public function afterApply()
     {
-        if(isset($this->params['data']))
-            $this->id(explode(',',$this->params['data']));
+        if (isset($this->params['data']))
+            $this->id(explode(',', $this->params['data']));
 
-        if (!isset($this->params['owner'])){
-            $this->getOrderQuery()->whereIn('owner_id', app('UserService')->getPermittingOwnerIds(Auth::user())??[]);
+        if (Gate::allows('订单管理-工单处理-货主编辑') || Gate::allows('订单管理-工单处理-客服编辑')) {
+            $this->queryBuilder->whereIn('owner_id', app('UserService')->getPermittingOwnerIds(Auth::user()) ?? []);
         }
 
-//        $user = Auth::user();
-//        $logistic_ids = App('LogisticService')->getPermittingLogisticIds($user);
-//        $owner_id = app('UserService')->getPermittingOwnerIds($user);
-//
-//        $this->getOrderQuery()->where(function($query)use ($owner_id,$logistic_ids){
-//            $query->whereIn('owner_id',$owner_id)->orWhereIn('logistic_id',$logistic_ids);
-//        });
         $this->afterFilter();
     }
 
-    private function afterFilter(){
-        $orderQuery = $this->getOrderQuery();
+    private function afterFilter()
+    {
 
         $user = Auth::user();
 
@@ -94,57 +89,73 @@ class WorkOrderFilters
 
         $owner_ids = app('UserService')->getPermittingOwnerIds($user);
 
-        $this->afterFilterLogistic($orderQuery,$owner_ids,$logistic_ids);
+        $this->afterFilterLogistic($logistic_ids);
+
+        $this->afterFilterOwner($owner_ids);
 
-        $this->afterFilterOwner($orderQuery,$owner_ids);
+        $this->afterFileIssueType();
+
+        $this->filterWorkOrderStatus();
     }
 
-    // 可见货主过滤
-    private function afterFilterOwner($orderQuery,$owner_ids)
+    private function filterWorkOrderStatus()
     {
-        $orderQuery->whereIn('owner_id',$owner_ids);
-//        if(Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-承运商编辑')){
-//
-//        }else if(Gate::allows('订单管理-工单处理-货主编辑')){
-//            $orderQuery->whereIn('owner_id',$owner_ids);
-//        }
+        if (isset($this->params['is_end'])) return;
+        $this->queryBuilder->where('status', '!=', 5);      // 过滤已完成
+        $status = [];
+        if (Gate::allows('订单管理-工单处理-客服编辑')) {
+            $status[]=  4;
+        }
+        if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            $status[]=  3;
+        }
+        if (Gate::allows('订单管理-工单处理-货主编辑')) {
+            $status[]=  1;
+        }
+        $this->queryBuilder->whereIn('status',$status);
     }
 
-    // 可见承运商过滤
-    private function afterFilterLogistic($orderQuery,$owner_ids,$logistic_ids)
+    private function afterFilterOwner($owner_ids)
     {
-        if(Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')){
-            if (!isset($this->params['owner'])){
-                $this->getOrderQuery()->whereIn('owner_id', $owner_ids);
-            }
-        } else if (Gate::allows('订单管理-工单处理-承运商编辑')){
-            $orderQuery->whereIn('logistic_id',array_values($logistic_ids));
+        if (Gate::allows('订单管理-工单处理-货主编辑') || Gate::allows('订单管理-工单处理-客服编辑')) {
+            $this->queryBuilder->whereIn('owner_id', $owner_ids);
+        }
+    }
+
+    private function afterFilterLogistic($logistic_ids)
+    {
+        if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            $this->queryBuilder->whereIn('logistic_id', array_values($logistic_ids));
+        }
+    }
+
+    public function afterFileIssueType()
+    {
+        if (Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')) {
+            $this->getOrderIssueQuery()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件']);
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            $this->getOrderIssueQuery()->whereIn('name', ['拦截', '信息更改', '破损', '快递丢件', '快递异常']);
         }
     }
 
     public function beforeApply()
     {
-        if ($this->orderPackageQuery){
-            $this->getOrderQuery()->whereIn('id',$this->orderPackageQuery);
+        if ($this->orderPackageQuery) {
+            $this->queryBuilder->whereIn('order_id', $this->orderPackageQuery);
         }
 
         if ($this->orderQuery) {
-            $this->queryBuilder->whereIn('order_id',$this->getOrderQuery());
+            $this->queryBuilder->whereIn('order_id', $this->orderQuery);
         }
 
-        // 审核 默认为 待审核
-        if (isset($this->params['is_review'])){
-            $this->queryBuilder->where('status','2');
-            $this->queryBuilder->whereHas('orderIssue')->orderBydesc('work_orders.created_at');
-        } else {
-            $work_order_query = WorkOrder::query()->select('id')->where('status','2')->whereHas('orderIssue');
-            $this->queryBuilder->whereNotIn('id',$work_order_query);
+        if ($this->issueTypeQuery) {
+            $this->queryBuilder->whereIn('order_issue_type_id', $this->issueTypeQuery);
         }
     }
 
     public function getOrderQuery(): Builder
     {
-        if (!$this->orderQuery){
+        if (!$this->orderQuery) {
             $this->orderQuery = Order::query()->select('id');
         }
         return $this->orderQuery;
@@ -152,106 +163,113 @@ class WorkOrderFilters
 
     public function getOrderPackageQuery(): Builder
     {
-        if (!$this->orderPackageQuery){
+        if (!$this->orderPackageQuery) {
             $this->orderPackageQuery = OrderPackage::query()->select('order_id');
         }
         return $this->orderPackageQuery;
     }
 
+    public function getOrderIssueQuery(): Builder
+    {
+        if (!$this->issueTypeQuery) {
+            $this->issueTypeQuery = OrderIssueType::query()->select('id');
+        }
+        return $this->issueTypeQuery;
+    }
+
     public function id($id)
     {
-        if(is_array($id))$this->queryBuilder->whereIn('work_orders.id',$id);
-        else $this->queryBuilder->where('work_orders.id',$id);
+        if (is_array($id)) $this->queryBuilder->whereIn('work_orders.id', $id);
+        else $this->queryBuilder->where('work_orders.id', $id);
     }
 
     // 创建开始时间
     public function created_at_start($create_at_start)
     {
-        $this->queryBuilder->where('work_orders.created_at','>=',$create_at_start);
+        $this->queryBuilder->where('work_orders.created_at', '>=', $create_at_start);
     }
+
     // 创建结束时间
     public function created_at_end($created_at_end)
     {
-        $this->queryBuilder->where('work_orders.created_at','<=',$created_at_end);
+        $this->queryBuilder->where('work_orders.created_at', '<=', $created_at_end);
     }
-    // 审核开始时间
+
+    // 终审开始时间
     public function review_at_start($review_at_start)
     {
-        $this->queryBuilder->where('work_orders.review_at','>=',$review_at_start);
+        $this->queryBuilder->where('work_orders.review_at', '>=', $review_at_start);
     }
-    // 审核结束时间
+
+    // 终审结束时间
     public function review_at_end($review_at_end)
     {
-        $this->queryBuilder->where('work_orders.review_at','<=',$review_at_end);
+        $this->queryBuilder->where('work_orders.review_at', '<=', $review_at_end);
     }
+
     // 创建人
     public function creator($creator)
     {
-        $userQuery = User::query()->select('id')->where('name','like',"%{$creator}%");;
-        $this->queryBuilder->whereIn('creator_id',$userQuery);
+        $userQuery = User::query()->select('id')->where('name', 'like', "%{$creator}%");;
+        $this->queryBuilder->whereIn('creator_id', $userQuery);
     }
-    // 审核人
+
+    // 终审人
     public function reviewer($id)
     {
         if (is_array($id))
-            $this->queryBuilder->whereIn('work_orders.reviewer_id',$id);
+            $this->queryBuilder->whereIn('work_orders.reviewer_id', $id);
         else
-            $this->queryBuilder->where('work_orders.reviewer_id',$id);
+            $this->queryBuilder->where('work_orders.reviewer_id', $id);
     }
 
     // 类型
     public function word_order_types($word_order_types)
     {
-        if(!$this->workOrderTypeQuery)
+        if (!$this->workOrderTypeQuery)
             $this->workOrderTypeQuery = WorkOrder::query()->select('id');
         if (is_array($word_order_types))
-            $this->workOrderTypeQuery->whereIn('id',$word_order_types);
-        else $this->workOrderTypeQuery->where('id',$word_order_types);
+            $this->workOrderTypeQuery->whereIn('id', $word_order_types);
+        else $this->workOrderTypeQuery->where('id', $word_order_types);
     }
 
     public function order_issue_type($order_issue_type)
     {
-        $this->queryBuilder->where('order_issue_type_id',$order_issue_type);
+        $this->queryBuilder->where('order_issue_type_id', $order_issue_type);
     }
 
     // 快递单号
     public function logistic_number($logistic_number)
     {
-        $this->searchWay($this->getOrderPackageQuery(),$logistic_number,'order_packages.logistic_number');
+        $this->searchWay($this->getOrderPackageQuery(), $logistic_number, 'order_packages.logistic_number');
     }
 
     // 对应问题件
     public function is_issue_order($is_issue_order)
     {
-        $orderIssueQuery = OrderIssue::query()->select('order_id')->whereIn('order_id',WorkOrder::query()->select('order_id'));
-        if($is_issue_order == 'true'){
-            $this->queryBuilder->whereIn('order_id',$orderIssueQuery);
+        $orderIssueQuery = OrderIssue::query()->select('order_id')->whereIn('order_id', WorkOrder::query()->select('order_id'));
+        if ($is_issue_order == 'true') {
+            $this->queryBuilder->whereIn('order_id', $orderIssueQuery);
         } else {
-            $this->queryBuilder->whereNotIn('order_id',$orderIssueQuery);
+            $this->queryBuilder->whereNotIn('order_id', $orderIssueQuery);
         }
     }
 
     // 承运商筛选
     public function logistic($logistic)
     {
-        $orderQuery = $this->getOrderQuery()->whereIn('id',WorkOrder::query()->select('order_id'));
-        $this->searchWay($orderQuery,$logistic,'logistic_id');
-    }
-
-    public function grad($grad)
-    {
-        $this->queryBuilder->where('grad',$grad);
+        $this->searchWay($this->queryBuilder, $logistic, 'logistic_id');
     }
 
     // 货主
     public function owner($owner)
     {
-        $this->searchWay($this->queryBuilder,$owner,'work_orders.owner_id');
+        $this->searchWay($this->queryBuilder, $owner, 'work_orders.owner_id');
     }
 
     public function client_code($client_code)
     {
-        $this->searchWay($this->getOrderQuery(),$client_code,'orders.client_code');
+        $this->searchWay($this->getOrderQuery(), $client_code, 'orders.client_code');
     }
 
 }

+ 18 - 2
app/Http/Controllers/OrderPackageCommoditiesController.php

@@ -10,11 +10,27 @@ use Illuminate\Http\Request;
 
 class OrderPackageCommoditiesController extends Controller
 {
-    public function getCommoditiesApi(Request $request,OrderService $orderService,OrderPackageCommoditiesService $orderPackageCommoditiesService)
+    public function getCommoditiesApi(Request $request, OrderService $orderService, OrderPackageCommoditiesService $orderPackageCommoditiesService): array
     {
         $code = $request->input(['orderNo']);
+
         $orderService->syncOrderByCodes([$code]);
-        return $orderPackageCommoditiesService->getCommodities($code);
+
+        $commodities = $orderPackageCommoditiesService->getCommodities($code);
+
+        $data = $commodities->map(function ($item) {
+            return [
+                'sku' => $item->commodity->sku ?? '',
+                'commodity_id' => $item->id,
+                'amount' => $item->amount,
+                'name' => $item->commodity->name ?? '',
+                'logistic_number' => $item->package->logistic_number ?? '',
+                'check_amount' => 0,
+                'abnormal_amount' => 0,
+            ];
+        })->toArray();
+
+        return ['success' => true, 'data' => $data];
     }
 
 }

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

@@ -683,4 +683,33 @@ sql;
         $now=Carbon::now()->subMonths(-1)->startOfMonth()->startOfDay()->toDateTimeString();
         dd($now);
     }
+
+    public function syncOrderIssue()
+    {
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = OrderIssue::query()->find('48798');
+        $orderIssue->syncRejectingStatus();
+    }
+
+    public function test123()
+    {
+
+        $reflection = new \ReflectionClass(new OrderIssue());
+        dump($reflection->getMethods());
+        dump($reflection->getConstants());
+        dump($reflection->getInterfaces());
+    }
+
+    public function syncWorkOrder()
+    {
+        $workOrders = WorkOrder::query()->with('order')->get();
+        foreach ($workOrders as $workOrder) {
+            $workOrder->owner_id = $workOrder->order->owner_id;
+            $workOrder->logistic_id = $workOrder->order->logistic_id;
+            if ($workOrder->review_at){
+                $workOrder->status = 5;
+            }
+            $workOrder->save();
+        }
+    }
 }

+ 319 - 67
app/Http/Controllers/WorkOrderController.php

@@ -6,6 +6,10 @@ use App\Filters\WorkOrderFilters;
 use App\Http\Requests\WorkOrder\WorkOrderRequest;
 use App\Logistic;
 use App\OrderIssue;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\WorkOrderCommoditiesService;
+use App\Services\WorkOrderLogService;
 use App\Services\WorkOrderService;
 use App\WorkOrder;
 use Illuminate\Http\Request;
@@ -14,161 +18,409 @@ use Illuminate\Support\Facades\Gate;
 class WorkOrderController extends Controller
 {
 
-    public function index(Request $request, WorkOrderFilters $filters, WorkOrderService $service)
+    /**
+     * @var WorkOrderService $service
+     * @var WorkOrderCommoditiesService $commoditiesService
+     * @var WorkOrderLogService $logService
+     * @var OrderService $orderService
+     * @var OwnerService $ownerService
+     */
+    public $service;
+    public $commoditiesService;
+    public $logService;
+    public $orderService;
+    public $ownerService;
+
+    public function __construct(
+        WorkOrderService $service,
+        WorkOrderCommoditiesService $commoditiesService,
+        WorkOrderLogService $logService,
+        OrderService $orderService,
+        OwnerService $ownerService)
+    {
+        $this->service = $service;
+        $this->commoditiesService = $commoditiesService;
+        $this->logService = $logService;
+        $this->orderService = $orderService;
+        $this->ownerService = $ownerService;
+    }
+
+    public function index(Request $request, WorkOrderFilters $filters)
     {
         if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
+
         $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderBy('created_at')->orderByDesc('status')->paginate($request['paginate'] ?? 50);
+
         $logistics = Logistic::all();
-        $orderIssueTypes = $service->getIssueType();
-        $owners = app('OwnerService')->getAuthorizedOwners();
-        $service->tags($workOrders);
-        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes','owners'));
+
+        $orderIssueTypes = $this->service->getIssueType();
+
+        $owners = $this->ownerService->getAuthorizedOwners();
+
+        $this->service->tags($workOrders);
+
+        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners'));
     }
 
     // 审核 api
-    public function reviewApi(Request $request, WorkOrderService $service): array
+    public function reviewApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-审核')) return ['success' => false, 'message' => '没有对应的编辑权限'];
+
         $workOrder = WorkOrder::query()->find($request['id']);
-        return $service->review($workOrder);
+
+        return $this->service->review($workOrder);
     }
 
     // 批量审核 api
-    public function batchReviewApi(Request $request,WorkOrderService  $service): array
+    public function batchReviewApi(Request $request): array
     {
-        if(Gate::denies('订单管理-工单处理-审核'))return ['success' => false, 'message' => '没有对应的编辑权限'];
-        if (WorkOrder::query()->whereIn('id',$request['ids'])->whereNotNull('review_at')->exists())
+        if (Gate::denies('订单管理-工单处理-审核')) {
+            return ['success' => false, 'message' => '没有对应的编辑权限'];
+        }
+
+        if (WorkOrder::query()->whereIn('id', $request['ids'])->whereNotNull('review_at')->exists())
             return ['success' => false, 'message' => '选中的工单已有审核完成,刷新页面重试'];
-        $work_orders = WorkOrder::query()->whereIn('id',$request['ids'])->get();
-        $service->tags($work_orders);
-        return $service->batchReview($work_orders);
+
+        $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
+
+        $this->service->tags($work_orders);
+
+        return $this->service->batchReview($work_orders);
     }
 
-    // 生成问题件 api
-    public function buildOrderIssueApi(Request $request, WorkOrderService $service): array
+    public function buildOrderIssueApi(Request $request): array
     {
         if (Gate::denies('订单管理-订单问题件生成'))
             return ['success' => false, 'message' => '没有对应权限'];
+
         $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
+
         if (count($work_orders) == 0) return ['success' => false, 'message' => '刷新当前页面重试'];
-        if (OrderIssue::query()->whereIn('order_id',$work_orders->map(function($item){return $item['order_id'];}))->exists()){
+
+        if (OrderIssue::query()->whereIn('order_id', $work_orders->map(function ($item) {
+            return $item['order_id'];
+        }))->exists()) {
             return ['success' => false, 'message' => '已有对应的问题件'];
         }
-        $result = $service->buildOrderIssue($work_orders);
+
+        $result = $this->service->buildOrderIssue($work_orders);
+
         if (!$result['success']) return $result;
-        $workOrders = WorkOrder::query()->defaultWith()->whereIn('id',$request['ids'])->get();
-        $service->tags($workOrders);
-        return ['success' => true ,'data' => $workOrders];
+
+        $workOrders = WorkOrder::query()->defaultWith()->whereIn('id', $request['ids'])->get();
+
+        $this->service->tags($workOrders);
+
+        return ['success' => true, 'data' => $workOrders];
     }
 
-    // 创建工单 api
-    public function storeApi(Request $request, WorkOrderService $service):array
+    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){
+        if (count($params) == 0) return ['success' => false, 'message' => '参数异常'];
+        app('OrderService')->syncOrderByCodes(array_map(function ($param) {
             return $param['order_no'];
-        },$params));
-        return  $service->build($params);
+        }, $params));
+        return $this->service->build($params);
+    }
+
+    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];
+    }
+
+    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];
     }
 
-    // 破损工单
-    public function damagedApi(WorkOrderRequest $request, WorkOrderService $service): array
+    public function lossApi(WorkOrderRequest $request): array
     {
         if (Gate::denies('订单管理-订单-生成工单'))
             return ['success' => false, 'message' => '没有对应权限'];
-        app('OrderService')->syncOrderByCodes([$request->input('order_no')]);
 
-        $workOrder =  $service->createDamagedWorkOrder($request->all());
+        $orderNo = $request->input('order_no','');
+
+        $this->orderService->syncOrderByCodes([$orderNo]);
+
+        $this->service->createLossWorkOrder($request->all());
+
+        return ['success' => true];
+    }
+
+    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];
+        else return ['success' => false];
+    }
+
+    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];
+    }
+
+    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];
+    }
+
+    public function fillLossApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-宝时编辑') || Gate::denies('订单管理-订单-货主编辑')){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+
+        $workOrder = $this->service->find($request->input('id'));
+
+        $this->service->fillLossWorkOrder($workOrder,$request->all());
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true,'data' => $workOrder];
     }
 
-    // 货主 遗失工单信息 填充
-    public function updateLossApi(Request $request, WorkOrderService $service): array
+    public function updateLossApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-货主编辑'))
             return ['success' => false, 'message' => '没有对应权限'];
 
-        /** @var WorkOrder $workOrder */
-        $workOrder = WorkOrder::query()->where('id',$request->input('id'))->first();
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
 
-        if (!$workOrder) return ['success' => false,'message' => '参数异常'];
+        $workOrder = $this->service->fillLossWorkOrder($workOrder, $request->all());
 
-        $workOrder = $service->fillLossWorkOrder($workOrder,$request->all());
+        if (!$workOrder) return ['success' => false, 'message' => '创建异常'];
 
-        if(!$workOrder) return ['success' => false,'message' => '创建异常'];
+        $workOrder->loadDefaultWith();
 
         return ['success' => true, 'data' => $workOrder];
     }
 
-    // 修改问题类型
     public function updateIssueTypeApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-审核'))
-            return ['success' => false,'message' => '没有对应权限'];
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        WorkOrder::query()->where('id', $request['id'])->update(['order_issue_type_id' => $request['type_id']]);
 
-        WorkOrder::query()->where('id',$request['id'])->update(['order_issue_type_id' => $request['type_id']]);
         return ['success' => true];
     }
 
-    // 批量修改问题件类型
-    public function batchUpdateIssueTypeApi(Request $request,WorkOrderService $service): array
+    public function batchUpdateIssueTypeApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-审核'))
-            return ['success' => false,'message' => '没有对应权限'];
-        WorkOrder::query()->whereIn('id',$request['ids'])->update(['order_issue_type_id' => $request['type']]);
-        $items = WorkOrder::query()->defaultWith()->whereIn('id',$request['ids'])->get();
-        $service->tags($items);
-        return ['success' => true,'data' => $items];
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        WorkOrder::query()->whereIn('id', $request['ids'])->update(['order_issue_type_id' => $request['type']]);
+
+        $items = WorkOrder::query()->defaultWith()->whereIn('id', $request['ids'])->get();
+
+        $this->service->tags($items);
+
+        return ['success' => true, 'data' => $items];
     }
 
-    // 删除
     public function destroyApi($id): array
     {
         if (Gate::denies('订单管理-工单处理-删除'))
-            return ['success' => false,'message' => '没有对应权限'];
-        $workOrder = WorkOrder::query()->where('id',$id)->first();
-        if (! $workOrder)
-            return ['success' => false,'message' => '对应工单信息未找到'];
-        if ($workOrder->status == '已处理'){
-            return ['success' => false,'message' => '对应工单已处理,拒绝删除'];
-        }
-        WorkOrder::query()->where('id',$id)->Delete();
+            return ['success' => false, 'message' => '没有对应权限'];
+
+        $workOrder = $this->service->find($id);
+
+        if (!$workOrder)
+            return ['success' => false, 'message' => '对应工单信息未找到'];
+        if ($workOrder->status == '已处理') {
+            return ['success' => false, 'message' => '对应工单已处理,拒绝删除'];
+        }
+        WorkOrder::query()->where('id', $id)->Delete();
         return ['success' => true];
     }
 
-    // 宝时 修改工单状态
     public function updateWorkOrderStatusApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-宝时编辑'))
-            return  ['success' => false,'message' => '没有对应权限'];
+            return ['success' => false, 'message' => '没有对应权限'];
         try {
-            $workOrder = WorkOrder::query()->find($request['id']);
+            $workOrder = $this->service->find($request->input('id'));
+
             $workOrder->work_order_status = $request['work_order_status'];
+
             $workOrder->update();
         } catch (\Exception $e) {
-            return ['success' => false,'message' => '编辑工单状态失败'];
+            return ['success' => false, 'message' => '编辑工单状态失败'];
         }
         return ['success' => true];
     }
 
-    // 承运商处理工单状态
-    public function logisticUpdateWorkOrderStatusApi(Request $request):array
+    public function logisticUpdateWorkOrderStatusApi(Request $request): array
     {
         if (Gate::denies('订单管理-工单处理-承运商编辑'))
-            return  ['success' => false,'message' => '没有对应权限'];
+            return ['success' => false, 'message' => '没有对应权限'];
         try {
-            $workOrder = WorkOrder::query()->find($request['id']);
+            $workOrder = $this->service->find($request->input('id'));
+
             $workOrder->work_order_status = $request['work_order_status'];
+
             $workOrder->update();
         } catch (\Exception $e) {
-            return ['success' => false,'message' => '编辑工单状态失败'];
+            return ['success' => false, 'message' => '编辑工单状态失败'];
+        }
+        return ['success' => true];
+    }
+
+    public function ownerUpdateCommoditiesApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-货主编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
+
+        if(($workOrder->issueType->name ?? '') == '快递丢件'){
+            $this->logService->createLog($workOrder,'处理','货主填充数据');
+            $workOrder->changeStatus('宝时处理');
+        }
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true, 'data' => $workOrder];
+    }
+
+    public function logisticUpdateCommoditiesApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
+
+        $workOrder->loadDefaultWith();
+        $issueType = $workOrder->issueType->name ?? '';
+        if (in_array($issueType,['破损','快递异常','快递丢件'])){
+            $workOrder->changeStatus('宝时终审');
+            $this->logService->createLog($workOrder,'处理','承运商处理');
+
+        } else if (in_array($issueType,['拦截','信息更改'])){
+            $workOrder->changeStatus('完成');
+            $this->logService->createLog($workOrder,'完结','承运商完成');
         }
-        return ['success'=> true];
+
+
+        return ['success' => true, 'data' => $workOrder];
     }
 
+    public function baoShiUpdateCommoditiesApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
+
+        $workOrder->loadDefaultWith();
+
+        if (($workOrder->issueType->name ?? '') === '错漏发') {
+            $workOrder->changeStatus('完成');
+            $this->logService->createLog($workOrder, '完结', '错漏发完结');
+        }
+
+        return ['success' => true, 'data' => $workOrder];
+    }
+
+    public function logisticEndApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-承运商编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        if (!$workOrder) return ['success' => false, 'message' => '参数错误,刷新重试'];
+
+        $this->service->logisticEnd($workOrder);
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true, 'data' => $workOrder];
+    }
+
+    public function baoShiReviewApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-客服编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $workOrder = $this->service->find($request->input('id'));
+
+        $this->service->baoShiReview($workOrder,$request->input('commodities'));
+
+        $workOrder->loadDefaultWith();
+
+        return ['success' => true,'data' => $workOrder];
+    }
+
+    public function checkWorkOrderApi(Request $request): array
+    {
+        $nos = $request->input('no','');
+
+        if (is_string($nos)){
+            $nos = [$nos];
+        }
+
+        $data = $this->service->checkWorkOrder($nos);
+        return ['success' => true,'data' => $data];
+    }
 }

+ 85 - 0
app/Http/Controllers/WorkOrderLogController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\WorkOrderLog;
+use Illuminate\Http\Request;
+
+class WorkOrderLogController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function show(WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\WorkOrderLog  $workOrderLog
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(WorkOrderLog $workOrderLog)
+    {
+        //
+    }
+}

+ 21 - 3
app/Http/Requests/WorkOrder/WorkOrderRequest.php

@@ -31,6 +31,8 @@ class WorkOrderRequest extends FormRequest
         switch ($routeName ){
             case 'workOrder.damagedApi':
                 return $this->damagedApiRule();
+            case 'worKOrder.workOrder.interceptApi':
+                return $this->interceptApiRule();
             default:
                 return [];
         }
@@ -42,6 +44,8 @@ class WorkOrderRequest extends FormRequest
         switch ($routeName ){
             case 'workOrder.damagedApi':
                 return $this->damagedApiMessage();
+            case 'worKOrder.workOrder.interceptApi':
+                return $this->interceptApiMessage();
             default:
                 return [];
         }
@@ -50,7 +54,6 @@ class WorkOrderRequest extends FormRequest
     public function damagedApiRule(): array
     {
         return [
-            'type' => 'required|string',
             'order_no' => 'required|string',
             'packageImages' => 'required|array',
             'commodityImages' => 'required|array',
@@ -61,8 +64,6 @@ class WorkOrderRequest extends FormRequest
     public function damagedApiMessage(): array
     {
         return [
-            'type.required' => '未指定工单类型',
-            'type.string' => '工单类型格式不正确',
             'order_no.required' => '未指定订单',
             'order_no.string' => '订单数据格式不正确',
             'packageImages.required' => '未上传外包装图片',
@@ -73,4 +74,21 @@ class WorkOrderRequest extends FormRequest
             'dealImages.array' => '交易图片按数组格式上传',
         ];
     }
+
+    public function interceptApiRule():array
+    {
+        return [
+            'orderNos' => 'required|array',
+            'remark' => 'string',
+        ];
+    }
+
+    public function interceptApiMessage(): array
+    {
+        return [
+            'orderNos.required' => '参数异常',
+            'orderNos.array' => '参数异常',
+            'remark.string' => '参数异常',
+        ];
+    }
 }

+ 4 - 0
app/Providers/AppServiceProvider.php

@@ -192,6 +192,8 @@ use App\Services\LaborApplyService;
 use App\Services\SyriusTaskService;
 use App\Services\ReplenishmentService;
 use App\Services\ObligationService;
+use App\Services\WorkOrderLogService;
+use App\Services\OrderIssueTypeService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -290,6 +292,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OrderIssueProcessLogService', OrderIssueProcessLogService::class);
         app()->singleton('OrderIssueRejectedBillService', OrderIssueRejectedBillService::class);
         app()->singleton('OrderIssueService', OrderIssueService::class);
+        app()->singleton('OrderIssueTypeService',OrderIssueTypeService::class);
         app()->singleton('OrderIssueWorkLoadService', OrderIssueWorkLoadService::class);
         app()->singleton('OrderPackageCommoditiesService', OrderPackageCommoditiesService::class);
         app()->singleton('OrderPackageCommoditySerialNumberService', OrderPackageCommoditySerialNumberService::class);
@@ -392,6 +395,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('WorkOrderCommoditiesService',WorkOrderCommoditiesService::class);
         app()->singleton('WorkOrderDetailService',WorkOrderDetailService::class);
         app()->singleton('WorkOrderImageService',WorkOrderImageService::class);
+        app()->singleton('WorkOrderLogService',WorkOrderLogService::class);
         app()->singleton('WorkOrderProcessLogService',WorkOrderProcessLogService::class);
         app()->singleton('WorkOrderService',WorkOrderService::class);
         app()->singleton('WorkOrderTypeService',WorkOrderTypeService::class);

+ 12 - 0
app/Services/OrderIssueTypeService.php

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

+ 5 - 3
app/Services/OrderPackageCommoditiesService.php

@@ -726,10 +726,12 @@ class OrderPackageCommoditiesService
         }
      }
 
+
+
     public function getCommodities($orderNo)
     {
-        $orderQuery = Order::query()->where('id')->where('code',$orderNo);
-        $orderPackageQuery = OrderPackage::query()->select('id')->where('order_id',$orderQuery);
-        return OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id',$orderPackageQuery)->get();
+        $orderQuery = Order::query()->select('id')->where('code',$orderNo);
+        $orderPackageQuery = OrderPackage::query()->select('id')->whereIn('order_id',$orderQuery);
+        return OrderPackageCommodities::query()->with('commodity','package')->whereIn('order_package_id',$orderPackageQuery)->get();
     }
 }

+ 39 - 47
app/Services/OrderPackageService.php

@@ -29,20 +29,43 @@ class OrderPackageService
     const ZT_COLLECT_UPLOAD_DEFAULT_WEIGHT = 0.01; //中通自动揽收默认重量
     protected $modelClass = OrderPackage::class;
 
-    public function batchUpdate(array $params)
+    /**
+     * @var LogisticService $logisticService
+     * @var DataHandlerService $dataHandlerService
+     * @var OrderTrackingService $orderTrackingService
+     * @var OrderPackageCommoditiesService $orderPackageCommoditiesService
+     * @var BatchUpdateService $batchUpdateService
+     */
+    public $logisticService;
+    public $dataHandlerService;
+    public $orderTrackingService;
+    public $orderPackageCommoditiesService;
+    public $batchUpdateService;
+
+    public function __construct(LogisticService $logisticService,
+                                DataHandlerService $dataHandlerService,
+                                OrderTrackingService $orderTrackingService,
+                                OrderPackageCommoditiesService $orderPackageCommoditiesService,
+                                BatchUpdateService $batchUpdateService)
     {
-        return app(BatchUpdateService::class)->batchUpdate('order_packages', $params);
+        $this->logisticService = $logisticService;
+        $this->dataHandlerService = $dataHandlerService;
+        $this->orderTrackingService = $orderTrackingService;
+        $this->orderPackageCommoditiesService = $orderPackageCommoditiesService;
+        $this->batchUpdateService = $batchUpdateService;
     }
 
-    /** @var OrderTrackingService $orderTrackingService */
-    public $orderTrackingService;
+    public function batchUpdate(array $params)
+    {
+        return $this->batchUpdateService->batchUpdate('order_packages', $params);
+    }
 
     /**
      * @param string $logistic_number
      * @param array $values
      * @return OrderPackage $package
      */
-    public function firstOrCreate($logistic_number, array $values)
+    public function firstOrCreate($logistic_number, array $values): OrderPackage
     {
         /** @var $package OrderPackage */
         $package = OrderPackage::query()->where('logistic_number', $logistic_number)->first();
@@ -77,10 +100,6 @@ class OrderPackageService
     {
         $order_nos = data_get($orderHeaders, '*.orderno');
         return $this->getByOrderNos($order_nos);
-//        return OrderPackage::query()->with('order')
-//            ->whereIn('order_id', function ($query) use ($order_nos) {
-//                $query->from('orders')->select('id')->whereIn('code', $order_nos);
-//            })->get();
     }
 
     public function create(array $params)
@@ -88,9 +107,7 @@ class OrderPackageService
         if (count($params) == 0) return null;
         try {
             $this->insert($params);
-            app('LogService')->log(__METHOD__, __FUNCTION__, '批量生成 orderPackage' . count($params) . json_encode($params));
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__, __FUNCTION__, '批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
         } finally {
             $logistic_numbers = data_get($params, '*.logistic_number');
             unset($params);
@@ -119,10 +136,6 @@ class OrderPackageService
             }
         }
         return $orderPackages ?? new Collection();
-//        return OrderPackage::query()->with('order.logistic')
-//            ->whereIn('order_id', function ($query) use ($orderNos) {
-//                $query->from('orders')->select('id')->whereIn('code', $orderNos);
-//            })->get();
     }
 
     public function update($orderClientNo, $logisticNumber)
@@ -187,20 +200,14 @@ class OrderPackageService
                 $inner_array = array_chunk($inner_params, 200);
                 foreach ($inner_array as $params) {
                     $bool = $this->insert($params);
-                    $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null;
                 }
             } catch (\Exception $e) {
-                LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' . json_encode($e->getMessage()) . json_encode($inner_params) . json_encode($e->getTraceAsString()));
             }
         }
     }
 
     public function getInnerParams($orderHeader, $order, $packages_maps, $logistic): array
     {
-        /**
-         * @var DataHandlerService $dataHandlerService
-         */
-        $dataHandlerService = app('DataHandlerService');
         $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails, '*.picktotraceid')), ['', '*']);
         $date = Carbon::now()->format('Y-m-d H:i:s');
         $inner_params = [];
@@ -222,8 +229,15 @@ class OrderPackageService
             $sentAtMap[$orderHeader['soreference5']] = $orderHeader->actAllocationDetails->first() ?? null;
         }
 
+        /** 唯品顺丰速运承运商定制 */
+        if ($orderHeader['userdefine1'] === 'WPSFSY'){
+            $logistic_numbers = [$orderHeader['soreference5']];
+            $sentAtMap[$orderHeader['soreference5']] = $orderHeader->actAllocationDetails->first() ?? null;
+        }
+
+
         foreach ($logistic_numbers as $logistic_number) {
-            $package = $dataHandlerService->getKeyValue(['logistic_number' => $logistic_number], $packages_maps);
+            $package = $this->dataHandlerService->getKeyValue(['logistic_number' => $logistic_number], $packages_maps);
 
             if (isset($package)) continue;
             try {
@@ -248,20 +262,13 @@ class OrderPackageService
 
     public function deleteUnnecessaryPackage($orderHeaders, $packages)
     {
-        /**
-         * @var DataHandlerService $dataHandlerService
-         * @var OrderTrackingService $orderTrackingService
-         * @var OrderPackageCommoditiesService $orderPackageCommoditiesService
-         */
-        $dataHandlerService = app(DataHandlerService::class);
-        $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
 
         $logistic_numbers = array();
         foreach ($orderHeaders as $orderHeader) {
             if ($orderHeader['sostatus'] == '90') {
                 if ($orderHeader['soreference5'] == '') $logistic_numbers[$orderHeader['orderno']] = $orderHeader['orderno'];
                 else $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
-            } elseif ($orderHeader['userdefine1'] == 'JDKD') {
+            } elseif ($orderHeader['userdefine1'] == 'JDKD' || $orderHeader['userdefine1'] == 'WPSFSY') {
                 $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
             } else {
                 foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
@@ -275,7 +282,7 @@ class OrderPackageService
         $logistic_numbers = array_diff($logistic_numbers, ['', ' ', '*']);
 
         /** WAS数据库中已有的快递单号*/
-        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'], $packages);
+        $packages_maps = $this->dataHandlerService->dataHeader(['logistic_number'], $packages);
         $exits_number = data_get($packages, '*.logistic_number');
 
         /** WMS快递单号 和 WAS的快递单号 的差集*/
@@ -284,21 +291,13 @@ class OrderPackageService
 
         /** 记录差集对应的OrderPackage的id*/
         foreach ($diff_number as $number) {
-            $package = $dataHandlerService->getKeyValue(['logistic_number' => $number], $packages_maps);
+            $package = $this->dataHandlerService->getKeyValue(['logistic_number' => $number], $packages_maps);
             if ($package ?? false) $packages[] = $package->id;
         }
 
         /** 删除 OrderPackage 和 OrderPackageCommodities*/
         if (count($packages) == 0) return;
         $this->deleteIds($packages);
-//        try {
-//            $bool = OrderPackage::query()->whereIn('id', $packages)->delete();
-//            $orderPackageCommodities = OrderPackageCommodities::query()->whereIn('order_package_id', $packages)->get();
-//            $orderPackageCommoditiesService->deleteOrderCommodities($orderPackageCommodities);
-//            $bool ? LogService::log(__METHOD__, __FUNCTION__, '删除多余包裹 ids:' . json_encode($packages)) : null;
-//        } catch (\Exception $e) {
-//            LogService::log(__METHOD__, __FUNCTION__, '删除多余包裹 ids:' . json_encode($packages) . $e->getMessage());
-//        }
     }
 
     public function deleteIds($ids)
@@ -383,17 +382,10 @@ class OrderPackageService
      */
     public function processCancelOrderPackages(&$orderHeaders)
     {
-        $this->instant($this->orderTrackingService, 'OrderTrackingService');
-
         $cancelOrder = $orderHeaders->filter(function ($orderHeader) {
             return $orderHeader->sostatus == '90';
         });
-
         $orderPackages = $this->getByWmsOrders($cancelOrder);
-//        $orderPackages = OrderPackage::query()->whereIn('order_id', function ($query) use ($cancelOrder) {
-//            /** @var Builder $query */
-//            $query->from((new Order())->getTable())->selectRaw('id')->whereIn('code', data_get($cancelOrder, '*.orderno'));
-//        })->get();
 
         if ($orderPackages == null ||  count($orderPackages) == 0) return;
 

+ 30 - 4
app/Services/WorkOrderCommoditiesService.php

@@ -2,7 +2,6 @@
 
 namespace App\Services;
 
-use App\Commodity;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
 use App\WorkOrderCommodities;
@@ -16,9 +15,17 @@ class WorkOrderCommoditiesService
     public function createWorkOrderCommodityByJson(WorkOrder $workOrder, $json)
     {
         $obj = json_decode($json);
-        $owner_id = $workOrder->order->owner_id ?? '';
-        $commodity = Commodity::query()->where('owner_id', $owner_id)->where('sku', $obj->sku)->first();
-        $workOrder->commodities()->create(['sku' => $obj->sku, 'amount' => $obj->amount, 'commodity_id' => $commodity->id ?? '']);
+        $workOrder->commodities()->create([
+            'commodity_id' => $obj->commodity_id ?? '',
+            'sku' => $obj->sku,
+            'amount' => $obj->amount ?? '',
+            'logistic_number' => $obj->logistic_number ?? '',
+            'abnormal_amount' => $obj->abnormal_amount ?? '',
+            'check_amount' => $obj->check_amount ?? '',
+            'bao_shi_check_amount' => $obj->bao_shi_check_amount ?? '',
+            'check_result' => $obj->check_result ?? '',
+            'process_result' => $commodity->process_result ?? '',
+        ]);
     }
 
     /**
@@ -32,4 +39,23 @@ class WorkOrderCommoditiesService
             $this->createWorkOrderCommodityByJson($workOrder, $json);
         }
     }
+
+    public function updateWorkOrderCommoditiesByJsonArray(WorkOrder $workOrder, $array)
+    {
+        foreach ($array as $json) {
+            $this->updateWorkOrderCommoditiesByJson($workOrder, $json);
+        }
+    }
+
+    public function updateWorkOrderCommoditiesByJson(WorkOrder $workOrder, $json)
+    {
+        $obj = json_decode($json);
+        $workOrder->commodities()->where('id', $obj->id)->update([
+            'check_amount' => $obj->check_amount ?? '',
+            'bao_shi_check_amount' => $obj->bao_shi_check_amount ?? '',
+            'check_result' => $obj->check_result ?? '',
+            'process_result' => $obj->process_result ?? '',
+        ]);
+    }
+
 }

+ 34 - 24
app/Services/WorkOrderImageService.php

@@ -15,15 +15,13 @@ class WorkOrderImageService
      * 外包装
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderPackageImages($workOrder,$images, bool $isLoadMissing = true)
+    public function createWorkOrderPackageImages($workOrder,$images)
     {
         foreach ($images as $image) {
            $this->createWorkOrderPackageImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('packageImages');
-    }
+     }
 
     /**
      * @param $workOrder
@@ -32,9 +30,9 @@ class WorkOrderImageService
     public function createWorkOrderPackageImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->packageImages()->count();
+        $count = $workOrder->images()->where('type',1)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->packageImages()->create(['type' => 1, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 1, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
 
@@ -42,15 +40,13 @@ class WorkOrderImageService
      * 工单商品
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderCommodityImages($workOrder,$images, bool $isLoadMissing = true)
+    public function createWorkOrderCommodityImages($workOrder,$images)
     {
         foreach ($images as $image) {
             $this->createWorkOrderCommodityImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('commodityImages');
-    }
+     }
 
     /**
      * @param $workOrder
@@ -59,9 +55,9 @@ class WorkOrderImageService
     public function createWorkOrderCommodityImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->commodityImages()->count();
+        $count = $workOrder->images()->where('type',2)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->commodityImages()->create(['type' => 2, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 2, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
 
@@ -69,22 +65,20 @@ class WorkOrderImageService
      * 交易截图
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderDealImages($workOrder,$images, bool $isLoadMissing = true)
+    public function createWorkOrderDealImages($workOrder,$images)
     {
         foreach ($images as $image) {
             $this->createWorkOrderDealImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('dealImages');
-    }
+     }
 
     public function createWorkOrderDealImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->dealImages()->count();
+        $count = $workOrder->images()->where('type',3)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->dealImages()->create(['type' => 3, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 3, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
 
@@ -92,22 +86,38 @@ class WorkOrderImageService
      * 退款截图
      * @param $workOrder
      * @param $images
-     * @param bool $isLoadMissing
      */
-    public function createWorkOrderRefundImages($workOrder, $images, bool $isLoadMissing = true)
+    public function createWorkOrderRefundImages($workOrder, $images)
     {
         foreach ($images as $image) {
             $this->createWorkOrderRefundImage($workOrder,$image);
         }
-        if ($isLoadMissing)$workOrder->loadMissing('refundImages');
-    }
+     }
 
     public function createWorkOrderRefundImage($workOrder,$image)
     {
         /** @var UploadedFile  $image */
-        $count = $workOrder->refundImages()->count();
+        $count = $workOrder->images()->where('type',4)->count();
         /** @var WorkOrderImage $workOrderImage */
-        $workOrderImage = $workOrder->refundImages()->create(['type' => 4, 'number' => ++$count]);
+        $workOrderImage = $workOrder->images()->create(['type' => 4, 'number' => ++$count]);
         $workOrderImage->saveFile($image);
     }
+
+
+    public function createImages($workOrder,$package_images = null,$commodity_images = null,$deal_images = null,$refund_images = null)
+    {
+        if ($package_images) $this->createWorkOrderPackageImages($workOrder,$package_images);
+        if ($commodity_images) $this->createWorkOrderCommodityImages($workOrder,$commodity_images);
+        if ($deal_images) $this->createWorkOrderDealImages($workOrder,$deal_images);
+        if ($refund_images) $this->createWorkOrderRefundImages($workOrder,$refund_images);
+    }
+
+    public function createWorkOrderImages($workOrder,$params)
+    {
+        $package_images=  $params['packageImages'] ?? [];
+        $commodity_images = $params['commodityImages'] ?? [];
+        $deal_images  = $params['dealImages'] ?? [];
+        $refund_images = $params['refundImages'] ?? [];
+        $this->createImages($workOrder,$package_images,$commodity_images,$deal_images,$refund_images);
+    }
 }

+ 28 - 0
app/Services/WorkOrderLogService.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\WorkOrder;
+use App\WorkOrderLog;
+use Illuminate\Support\Facades\Auth;
+
+class WorkOrderLogService
+{
+    use ServiceAppAop;
+
+    protected $modelClass = WorkOrderLog::class;
+
+    public function createLog(WorkOrder $workOrder, $type, $content)
+    {
+        $user = Auth::user();
+        $log = new WorkOrderLog([
+            'work_order_id' => $workOrder->id,
+            'type' => $type,
+            'creator_id' => $user['id'] ?? '',
+            'content' => $content
+        ]);
+        $log->save();
+    }
+
+}

+ 174 - 51
app/Services/WorkOrderService.php

@@ -8,6 +8,7 @@ use App\OrderIssueType;
 use App\OrderPackage;
 use App\Traits\ServiceAppAop;
 use App\WorkOrder;
+use App\WorkOrderProcessLog;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Carbon;
@@ -20,6 +21,36 @@ class WorkOrderService
 
     protected $modelClass = WorkOrder::class;
 
+    /**
+     * @var WorkOrderLogService $logService
+     * @var WorkOrderImageService $imageService
+     * @var WorkOrderCommoditiesService $commoditiesService
+     * @var WorkOrderDetailService $detailService
+     * @var OrderIssueTypeService $issueTypeService
+     * @var OrderService $orderService
+     */
+    private $logService;
+    private $imageService;
+    private $commoditiesService;
+    private $detailService;
+    private $issueTypeService;
+    private $orderService;
+
+    public function __construct(WorkOrderLogService $logService,
+                                WorkOrderImageService $imageService,
+                                WorkOrderCommoditiesService $commoditiesService,
+                                WorkOrderDetailService $detailService,
+                                OrderIssueTypeService $issueTypeService,
+                                OrderService $orderService)
+    {
+        $this->logService = $logService;
+        $this->imageService = $imageService;
+        $this->commoditiesService = $commoditiesService;
+        $this->detailService = $detailService;
+        $this->issueTypeService = $issueTypeService;
+        $this->orderService = $orderService;
+    }
+
     /**
      * 获取可生成工单的问题件类型
      * @return Builder[]|Collection
@@ -29,7 +60,7 @@ class WorkOrderService
         if (Gate::allows('订单管理-工单处理-客服编辑') || 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();
     }
@@ -62,22 +93,30 @@ class WorkOrderService
         return ['success' => true];
     }
 
-    public function createAndNotification($order, $orderIssueType, $remark): WorkOrder
+    public function createWorkOrder($order, $issueType, $remark)
     {
         $user = Auth::user();
-        /** @var WorkOrder $workOrder */
-        $workOrder = WorkOrder::query()->create([
+
+        return WorkOrder::query()->create([
             'order_id' => $order->id,
-            'creator_id' => $user["id"],
-            'owner_id' => $order->owner_id,
+            'logistic_id' => $order->logistic_id ?? '',
+            'owner_id' => $order->owner_id ?? '',
+            'creator_id' => $user['id'] ?? '',
             'remark' => $remark,
             'outer_table_name' => 'orders',
-            'order_issue_type_id' => $orderIssueType->id,
+            'order_issue_type_id' => $issueType->id,
             'uniquely_tag' => $order->code,
-            'status' => 1,
-            'work_order_status' => 1
+            'status' => 0,
         ]);
+    }
+
+    public function createAndNotification($order, $orderIssueType, $remark): WorkOrder
+    {
+        /** @var WorkOrder $workOrder */
+        $workOrder = $this->createWorkOrder($order, $orderIssueType, $remark);
+
         $workOrder->notification();
+
         return $workOrder;
     }
 
@@ -86,10 +125,19 @@ class WorkOrderService
      */
     public function createInterceptWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '拦截']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '拦截']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $remark = $param['remark'] ?? '拦截工单';
+
+        $workOrder = $this->createAndNotification($order, $issueType, $remark);
+
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建');
+
+        return $workOrder;
     }
 
     /**
@@ -97,10 +145,17 @@ class WorkOrderService
      */
     public function createMistakeWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '错漏发']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '错漏发']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
+
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']);
+
+        $workOrder->changeStatus('宝时处理');
+
+        return $workOrder;
     }
 
     /**
@@ -108,25 +163,21 @@ class WorkOrderService
      */
     public function createDamagedWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '破损']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '破损']);
 
-        $workOrderImageService = app('WorkOrderImageService');
+        $order = $this->orderService->first(['code' => $param['order_no']]);
 
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $remark);
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
 
-        $workOrderImageService->createWorkOrderPackageImages($workOrder, $param['packageImages']);
+        $this->imageService->createWorkOrderImages($workOrder, $param);
 
-        $workOrderImageService->createWorkOrderCommodityImages($workOrder, $param['commodityImages']);
+        $this->detailService->createWorkOrderDetail($workOrder, $param);
 
-        $workOrderImageService->createWorkOrderDealImages($workOrder, $param['dealImages']);
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']); // 登记商品信息
 
-        app('WorkOrderDetailService')->createWorkOrderDetail($workOrder, $param);
+        $workOrder->changeStatus('承运商处理');
 
-        app('WorkOrderCommoditiesService')->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']); // 登记商品信息
-
-        $workOrder->update(['work_order_status' => 2]); // 标记信息已填写
+        $this->logService->createLog($workOrder, '创建', '创建工单');
 
         return $workOrder;
     }
@@ -136,10 +187,21 @@ class WorkOrderService
      */
     public function createExpressAbnormalWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '快递异常']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递异常']);
+
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
+
+        $this->imageService->createWorkOrderImages($workOrder, $param);
+
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities']);
+
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建工单');
+
+        return $workOrder;
     }
 
     /***
@@ -147,12 +209,15 @@ class WorkOrderService
      */
     public function createInformationChangeWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '信息更改']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $workOrder = $this->createAndNotification($order, $issueType, $param['remark'] ?? '');
 
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $remark);
-//        $workOrder->update(['work_order_status' => ]); // 标记信息已填写
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建工单');
 
         return $workOrder;
     }
@@ -162,10 +227,11 @@ class WorkOrderService
      */
     public function createDefaultWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '其他']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        return $this->createAndNotification($order, $orderIssueType, $remark);
+        $orderIssueType = $this->issueTypeService->firstOrCreate(['name' => '其他']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        return $this->createAndNotification($order, $orderIssueType, $param['remark'] ?? '');
     }
 
     /**
@@ -173,11 +239,16 @@ class WorkOrderService
      */
     public function createLossWorkOrder($param): WorkOrder
     {
-        $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '快递丢件']);
-        $order = Order::query()->where('code', $param['order_no'])->first();
-        $remark = $param['remark'] ?? '';
-        $workOrder = $this->createAndNotification($order, $orderIssueType, $remark);
-        $workOrder->update(['work_order_status' => 1]); // 标记信息未填写
+        $orderIssueType = $this->issueTypeService->firstOrCreate(['name' => '快递丢件']);
+
+        $order = $this->orderService->first(['code' => $param['order_no']]);
+
+        $workOrder = $this->createAndNotification($order, $orderIssueType, $param['remark'] ?? '');
+
+        $workOrder->changeStatus('货主处理');
+
+        $this->logService->createLog($workOrder, '创建', '创建工单');
+
         return $workOrder;
     }
 
@@ -187,13 +258,39 @@ class WorkOrderService
     public function fillLossWorkOrder(WorkOrder $workOrder, $param): WorkOrder
     {
         $workOrder->saveWorkOrderDetail($param);        // 收方信息 丢件价值 补发单号
-        $workOrder->addDealImage($param['dealImages']); // 交易截图
-        $workOrder->addRefundImage($param['refundImages'] ?? []); // 退款截图
-        $workOrder->update(['work_order_status' => 2]); // 标记信息填写
-        $workOrder->loadDefaultWith();
+
+        $this->imageService->createWorkOrderImages($workOrder, $param);
+
+        $workOrder->changeStatus('承运商处理');
+
+        $this->logService->createLog($workOrder, '处理', '填充丢件信息');
+
+        $this->commoditiesService->createWorkOrderCommoditiesByJsonArray($workOrder, $param['commodities'] ?? '');
+
         return $workOrder;
     }
 
+    public function end(WorkOrder $workOrder)
+    {
+        $workOrder->end();
+
+        $this->logService->createLog($workOrder, '完结', '完结工单');
+    }
+
+    public function logisticEnd(WorkOrder $workOrder)
+    {
+        $workOrder->changeStatus('完成');
+        $this->logService->createLog($workOrder, '完结', '承运商完结工单');
+    }
+
+    public function find($id): WorkOrder
+    {
+        /** @var WorkOrder $item */
+        $item = WorkOrder::query()->where('id', $id)->first();
+        return $item;
+    }
+
+
     /**
      * 工单审核
      * @param $wordOrder
@@ -202,11 +299,25 @@ class WorkOrderService
     public function review($wordOrder): array
     {
         $wordOrder->update(['reviewer_id' => Auth::user()['id'], 'review_at' => Carbon::now(), 'status' => '2',]);
+
         $workOrders = WorkOrder::query()->defaultWith()->whereIn('id', [$wordOrder['id']])->get();
+
         $this->tags($workOrders);
+
         return ['success' => true, 'data' => $workOrders->first()];
     }
 
+    public function baoShiReview(WorkOrder $workOrder,$params)
+    {
+        $user = Auth::user();
+
+        $workOrder->update(['reviewer_id' => $user['id'], 'review_at' => Carbon::now(), 'status' => '5']);
+
+        $this->logService->createLog($workOrder,'终审','终审完成');
+
+        $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder,$params);
+    }
+
     /**
      * 批量审核工单
      * @param $workOrders
@@ -314,4 +425,16 @@ class WorkOrderService
             else $order->is_work_order = false;
         }
     }
+
+    public function checkWorkOrder($nos)
+    {
+        return  WorkOrder::query()->defaultWith()->whereIn('order_id', function ($query) use ($nos) {
+            $query->from('orders')->selectRaw('id');
+            if (is_array($nos))
+                $query->whereIn('code', $nos);
+            else {
+                $query->where('code', $nos);
+            }
+        })->get();
+    }
 }

+ 125 - 156
app/WorkOrder.php

@@ -24,41 +24,45 @@ class WorkOrder extends Model
 
     // 工单 信息
     protected $fillable = [
+        'owner_id',      // 货主
+        'logistic_id',      // 承运商
+        'order_issue_type_id', // 问题件类型
         'status',           // 审核状态
         'creator_id',       // 创建人
         'reviewer_id',      // 审核人
-        'owner_id',      // 货主
-        'order_issue_type_id', // 问题件类型
-        'work_order_type_id',  // 工单类型
-        'grad',         // 紧急等级
-        'remark',       // 工单信息描述
-        'outer_table_name',     // 链接表名
         'review_at',            // 审核时间
         'order_id',             // 订单id
         'uniquely_tag',         // 唯一标识
-        'work_order_status', // 工单状态
+        'remark',       // 工单信息描述
+//        'work_order_type_id',  // 工单类型
+//        'grad',         // 紧急等级
+//        'outer_table_name',     // 链接表名
+//        'work_order_status', // 工单状态
     ];
 
     static public $enums = [
         'status' => [
             '' => 0,
-            '待审核' => 1,
-            '已处理' => 2,
-        ],
-        'work_order_status' => [
-            '' => 0,
-            '创建' => 1,
-            '信息已填写' => 2,
-            '快递已处理' => 3,
-            '工单完成' => 4,
-        ],
-        'grad' => [
-            '' => 0,
-            '一般' => 1,
-            '重要' => 2,
-            '紧急' => 3,
-            '重要且紧急' => 4,
+            '宝时处理' => 1,
+            '货主处理' => 2,
+            '承运商处理' => 3,
+            '宝时终审' => 4,
+            '完成' => 5,
         ],
+//        'work_order_status' => [
+//            '' => 0,
+//            '创建' => 1,
+//            '信息已填写' => 2,
+//            '快递已处理' => 3,
+//            '工单完成' => 4,
+//        ],
+//        'grad' => [
+//            '' => 0,
+//            '一般' => 1,
+//            '重要' => 2,
+//            '紧急' => 3,
+//            '重要且紧急' => 4,
+//        ],
     ];
 
     function __construct(array $attributes = [])
@@ -77,7 +81,7 @@ class WorkOrder extends Model
 
     public function setStatusAttribute($value)
     {
-        if (!$value) return ;
+        if (!$value) return;
         if (is_numeric($value)) {
             $this->attributes['status'] = $value;
         } else {
@@ -85,36 +89,54 @@ class WorkOrder extends Model
         }
     }
 
-    public function getWorkOrderStatusAttribute($value)
-    {
-        if (!$value) return '';
-        return self::$enums['work_order_status'][$value];
-    }
+//    public function getWorkOrderStatusAttribute($value)
+//    {
+//        if (!$value) return '';
+//        return self::$enums['work_order_status'][$value];
+//    }
+//
+//    public function setWorkOrderStatusAttribute($value)
+//    {
+//        if (!$value) return ;
+//        if (is_numeric($value)) {
+//            $this->attributes['work_order_status'] = $value;
+//        } else {
+//            $this->attributes['work_order_status'] = self::$enums['work_order_status'][$value];
+//        }
+//    }
+//
+//    public function getGradAttribute($value)
+//    {
+//        if (!$value) return '';
+//        return self::$enums['grad'][$value];
+//    }
+//
+//    public function setGradAttribute($value)
+//    {
+//        if (!$value) return ;
+//        if (is_numeric($value)) {
+//            $this->attributes['grad'] = $value;
+//        } else {
+//            $this->attributes['grad'] = self::$enums['grad'][$value];
+//        }
+//    }
 
-    public function setWorkOrderStatusAttribute($value)
+    // 关联订单
+    public function order(): BelongsTo
     {
-        if (!$value) return ;
-        if (is_numeric($value)) {
-            $this->attributes['work_order_status'] = $value;
-        } else {
-            $this->attributes['work_order_status'] = self::$enums['work_order_status'][$value];
-        }
+        return $this->belongsTo(Order::class);
     }
 
-    public function getGradAttribute($value)
+    // 关联货主
+    public function owner(): BelongsTo
     {
-        if (!$value) return '';
-        return self::$enums['grad'][$value];
+        return $this->belongsTo(Owner::class, 'owner_id');
     }
 
-    public function setGradAttribute($value)
+    // 关联承运商
+    public function logistic(): BelongsTo
     {
-        if (!$value) return ;
-        if (is_numeric($value)) {
-            $this->attributes['grad'] = $value;
-        } else {
-            $this->attributes['grad'] = self::$enums['grad'][$value];
-        }
+        return $this->belongsTo(Logistic::class);
     }
 
     // 创建人
@@ -129,18 +151,6 @@ class WorkOrder extends Model
         return $this->belongsTo(User::class, 'reviewer_id');
     }
 
-    // 关联订单
-    public function order(): BelongsTo
-    {
-        return $this->belongsTo(Order::class);
-    }
-
-    // 关联货主
-    public function owner(): BelongsTo
-    {
-        return $this->belongsTo(Owner::class, 'owner_id');
-    }
-
     // 工单类型
     public function type(): BelongsTo
     {
@@ -153,42 +163,39 @@ class WorkOrder extends Model
         return $this->belongsTo(OrderIssueType::class, 'order_issue_type_id');
     }
 
-    /** 对应问题件 */
+    // 对应问题件
     public function orderIssue(): BelongsTo
     {
         return $this->belongsTo(OrderIssue::class, 'order_id', 'order_id');
     }
 
     // 图片
-    public function image(): HasMany
+    public function images(): HasMany
     {
         return $this->hasMany(WorkOrderImage::class);
     }
 
-    // 外包装图片
-    public function packageImages(): HasMany
+    public function getPackageImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 1);
+        return $this->images->where('type', 1);
     }
 
-    // 内物破损图片
-    public function commodityImages(): HasMany
+    public function getCommodityImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 2);
+        return $this->images->where('type', 2);
     }
 
-    // 交易图片
-    public function dealImages(): HasMany
+    public function getDealImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 3);
+        return $this->images->where('type', 3);
     }
 
-    // 退款图片
-    public function refundImages(): HasMany
+    public function getRefundImagesAttribute()
     {
-        return $this->hasMany(WorkOrderImage::class)->where('type', 4);
+        return $this->images->where('type', 4);
     }
 
+
     // 工单详情
     public function details(): HasMany
     {
@@ -201,16 +208,25 @@ class WorkOrder extends Model
         return $this->hasMany(WorkOrderCommodities::class);
     }
 
-    // 宝时处理日志
-    public function processLog(): HasOne
+    // 处理日志
+    public function processLogs(): HasMany
+    {
+        return $this->hasMany(WorkOrderProcessLog::class);
+    }
+
+    public function baoShiLog()
+    {
+        return $this->processLogs->where('type', 1);
+    }
+
+    public function logisticLog()
     {
-        return $this->hasOne(WorkOrderProcessLog::class)->where('type','1');
+        return $this->processLogs->where('type', 2);
     }
 
-    // 承运商处理日志
-    public function logisticLog(): HasOne
+    public function logs(): HasMany
     {
-        return $this->hasOne(WorkOrderProcessLog::class)->where('type','2');
+        return $this->hasMany(WorkOrderLog::class);
     }
 
     public function scopeFilter($query, $filters)
@@ -218,48 +234,35 @@ class WorkOrder extends Model
         return $filters->apply($query);
     }
 
-
     /** 默认 with 参数 */
     public function scopeDefaultWith($query)
     {
-        $query->with(['type', 'owner', 'issueType', 'creator','details','commodities.commodity',
-            'processLog.creator',
-            'logisticLog.creator',
-            'packageImages.uploadFile',
-            'commodityImages.uploadFile',
-            'dealImages.uploadFile',
-            'refundImages.uploadFile',
+        $query->with(['type', 'owner', 'logistic', 'issueType', 'creator', 'details', 'commodities.commodity','logs.creator',
+            'processLogs.creator',
+            'images.uploadFile',
             'reviewer',
-            'order' => function ($query) {
-            /** @var Builder $query  */
-            $query->with('packages', 'logistic', 'owner');
-        }, 'orderIssue' => function ($query) {
-            /** @var Builder $query  */
-            $query->with(['issueType', 'logs' => function ($query) {
-                if (Gate::denies('订单管理-问题件-客户不可见')) {
-                    $query->with('user')->orderByDesc('created_at');
-                } else {
-                    $query->with('user')->where('tag', '=', 0)->orderByDesc('created_at');
-                }
+            'order.packages',
+            'orderIssue' => function ($query) {
+                /** @var Builder $query */
+                $query->with(['issueType', 'logs' => function ($query) {
+                    if (Gate::denies('订单管理-问题件-客户不可见')) {
+                        $query->with('user')->orderByDesc('created_at');
+                    } else {
+                        $query->with('user')->where('tag', '=', 0)->orderByDesc('created_at');
+                    }
+                }]);
             }]);
-        }]);
     }
 
     public function loadDefaultWith()
     {
-        $this->loadMissing(['owner','type', 'issueType', 'creator','details','commodities.commodity',
-            'processLog.creator',
-            'logisticLog.creator',
-            'packageImages.uploadFile',
-            'commodityImages.uploadFile',
-            'dealImages.uploadFile',
-            'refundImages.uploadFile',
+        $this->loadMissing(['type', 'owner', 'logistic', 'issueType', 'creator', 'details', 'commodities.commodity','logs.creator',
+            'processLogs.creator',
+            'images.uploadFile',
             'reviewer',
-            'order' => function ($query) {
-                /** @var Builder $query  */
-                $query->with('packages', 'logistic', 'owner');
-            }, 'orderIssue' => function ($query) {
-                /** @var Builder $query  */
+            'order.packages',
+            'orderIssue' => function ($query) {
+                /** @var Builder $query */
                 $query->with(['issueType', 'logs' => function ($query) {
                     if (Gate::denies('订单管理-问题件-客户不可见')) {
                         $query->with('user')->orderByDesc('created_at');
@@ -281,56 +284,22 @@ class WorkOrder extends Model
         NotificationService::SingleRegister($msg, $clientCode, "订单管理-问题件");
     }
 
-    public function addPackageImage($images)
-    {       // 外包装图
-        foreach ($images as $image) {
-            /** @var UploadedFile  $image */
-            $count = $this->packageImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->packageImages()->create(['type' => 0, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('packageImages');
-    }
-
-    public function addCommodityImage($images)
-    {       // 内物破损图
-        foreach ($images as $image) {
-            $count = $this->commodityImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->commodityImages()->create(['type' => 1, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('commodityImages');
-    }
-
-    public function addDealImage($images)
-    {       // 交易截图
-        foreach ($images as $image) {
-            $count = $this->dealImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->dealImages()->create(['type' => 2, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('dealImages');
-    }
-
-    public function addRefundImage($images)
-    {        // 退款截图
-        foreach ($images as $image) {
-            $count = $this->refundImages()->count();
-            /** @var WorkOrderImage $workOrderImage */
-            $workOrderImage = $this->refundImages()->create(['type' => 3, 'amount' => ++$count]);
-            $workOrderImage->saveFile($image);
-        }
-        $this->loadMissing('dealImages');
-    }
-
     public function saveWorkOrderDetail($params)
     {
-        $param  = (new WorkOrderDetail($params))->getAttributes();
+        $param = (new WorkOrderDetail($params))->getAttributes();
         $this->details()->create($param);
         $this->loadMissing('details');
     }
 
+    // 工单完结
+    public function end()
+    {
+        $this->update(['status'  => 4]);
+    }
+
+    public function changeStatus($status)
+    {
+        $this->status = $status;
+        $this->update();
+    }
 }

+ 7 - 2
app/WorkOrderCommodities.php

@@ -13,12 +13,17 @@ class WorkOrderCommodities extends Model
     use ModelLogChanging;
     use ModelTimeFormat;
 
-    //
     protected $fillable = [
         'work_order_id',
         'commodity_id',
         'sku',
-        'amount',
+        'logistic_number',      // 快递单号数量
+        'check_amount',         // 复核数量
+        'bao_shi_check_amount', // 宝时复核数量
+        'abnormal_amount',      // 异常数量
+        'amount',               // 订单数量
+        'check_result',         // 核实结果
+        'process_result',       // 处理结果
     ];
 
     public function workOrder(): BelongsTo

+ 1 - 1
app/WorkOrderImage.php

@@ -87,7 +87,7 @@ class WorkOrderImage extends Model
         $fileSuffix = $image->getClientOriginalExtension();
 
         if (!is_uploaded_file($tmpFile)) return false;
-        if ($image->getSize() > 5 * 1024 * 1024) return false;
+//        if ($image->getSize() > 5 * 1024 * 1024) return false;
         if (!in_array($fileSuffix,[ 'gif','image','jpeg','jpg','png','svg'])) return false;
         return true;
     }

+ 60 - 0
app/WorkOrderLog.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+
+class WorkOrderLog extends Model
+{
+    use ModelTimeFormat;
+
+    protected $fillable = ['work_order_id','content','type','creator_id'];
+
+    static public $enums = [
+        'type' => [
+            '' => 0,
+            '创建' => 1,
+            '处理' => 2,
+            '终审' => 3,
+            '完结' => 4,
+        ],
+    ];
+
+    function __construct(array $attributes = [])
+    {
+        foreach (self::$enums as &$enum) {
+            $enum = $enum + array_flip($enum);
+        }
+        parent::__construct($attributes);
+    }
+
+    public function getTypeAttribute($value)
+    {
+        if (!$value) return '';
+        return self::$enums['type'][$value];
+    }
+
+    public function setTypeAttribute($value)
+    {
+        if (!$value) return;
+        if (is_numeric($value)) {
+            $this->attributes['type'] = $value;
+        } else {
+            $this->attributes['type'] = self::$enums['type'][$value];
+        }
+    }
+
+    public function workOrder(): BelongsTo
+    {
+        return $this->belongsTo(WorkOrder::class);
+    }
+
+    public function creator(): BelongsTo
+    {
+        return $this->belongsTo(User::class);
+    }
+}

+ 12 - 0
database/factories/WorkOrderLogFactory.php

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

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrdersAddColunmsLogisticId extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->integer('logistic_id')->index()->comment('承运商');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->dropColumn('logistic_id');
+        });
+    }
+}

+ 43 - 0
database/migrations/2021_10_26_132927_add_colunms_to_work_order_commodities.php

@@ -0,0 +1,43 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColunmsToWorkOrderCommodities extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->string('logistic_number')->comment('快递单号');
+
+
+            $table->string('check_result')->comment('核实结果');
+            $table->string('process_result')->comment('处理结果');
+
+            $table->integer('check_amount')->comment('核实数量');
+            $table->integer('abnormal_amount')->comment('异常数量');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->dropColumn('check_result');
+            $table->dropColumn('process_result');
+            $table->dropColumn('logistic_number');
+            $table->dropColumn('check_amount');
+            $table->dropColumn('abnormal_amount');
+        });
+    }
+}

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

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateWorkOrderLogsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('work_order_logs', function (Blueprint $table) {
+            $table->id();
+            $table->integer('work_order_id')->index()->comment('工单');
+            $table->string('content')->comment('详情');
+            $table->integer('type')->comment('类型');
+            $table->integer('creator_id')->comment('创建人');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('work_order_logs');
+    }
+}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrderCommoditiesAddColumnsBaoShiCheckAmount extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->integer('bao_shi_check_amount')->comment('宝时审核数量');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_order_commodities', function (Blueprint $table) {
+            $table->dropColumn('');
+        });
+    }
+}

+ 16 - 0
database/seeds/WorkOrderLogSeeder.php

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

+ 172 - 0
resources/views/order/index/_workOrkerInfoModal.blade.php

@@ -0,0 +1,172 @@
+<div class="modal fade " id="work-order-info" 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="work-order-info-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">
+                <div class="alert alert-light mb-0 border border-top">
+                    <div class="">
+                        <div>
+                            <span class="text-monospace">客户订单号:</span>
+                            <span v-text="workOrderInfo.clientCode"></span>
+                        </div>
+                        <div>
+                            <span class="text-monospace">工单类型:</span>
+                            <span v-text="workOrderInfo.type"></span>
+                        </div>
+                        <div>
+                            <span class="text-monospace">内容:</span>
+                            <span v-text="workOrderInfo.remark"></span>
+                        </div>
+                    </div>
+
+                    <div class="">
+                        <span class="text-monospace">当前工单号:</span>
+                        <span v-text="workOrderInfo.id"></span>
+                    </div>
+
+                    <div class=""
+                         v-if="workOrderInfo?.logistic_numbers.length >0 ">
+                        <span class="text-monospace">快递单号:</span>
+                        <span v-for="logistic_number in (workOrderInfo?.logistic_numbers || [])"
+                              v-text="logistic_number"></span>
+                    </div>
+
+                    <div class="" v-if="workOrderInfo?.details.length > 0">
+                        <div class="" v-for="detail in (workOrderInfo?.details || [])">
+                            <div>
+                                <span class="text-monospace">价值:</span>
+                                <span v-text="detail.price"></span>
+                            </div>
+                            <div v-if="detail.return_logistic_number">
+                                <span class="text-monospace">退回单号:</span>
+                                <span v-text="detail.return_logistic_number"></span>
+                            </div>
+                            <div v-if="detail.reissue_logistic_number">
+                                <span class="text-monospace">补发单号:</span>
+                                <span v-text="detail.reissue_logistic_number"></span>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class=""
+                         v-if="workOrderInfo.packagesImages && workOrderInfo.packagesImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">外包装截图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.packagesImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="外包装截图">
+                            </div>
+                        </div>
+                    </div>
+
+
+                    <div class="" v-if="workOrderInfo.commodityImages && workOrderInfo.commodityImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">内物破损图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.commodityImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="内物破损图">
+                            </div>
+                        </div>
+                    </div>
+
+
+                    <div class="" v-if="workOrderInfo.dealImages  && workOrderInfo.dealImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">交易截图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.dealImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="交易截图">
+                            </div>
+                        </div>
+                    </div>
+
+
+                    <div class="" v-if="workOrderInfo.refundImages && workOrderInfo.refundImages.length > 0">
+                        <div class="col-12">
+                            <span class="text-monospace">退款截图</span>
+                        </div>
+                        <div class="card-body col-sm-6"
+                             v-for="image in workOrderInfo.refundImages">
+                            <div class="">
+                                <img class="image-w" style="width: 100%"
+                                     :src="image.src"
+                                     alt="退款截图">
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="" v-if="workOrderInfo.commodities && workOrderInfo.commodities.length > 0">
+                        <table class="table">
+                            <thead>
+                            <tr class="text-center">
+                                <td>快递单号</td>
+                                <td>sku</td>
+                                <td>商品名称</td>
+                                <td>订单数量</td>
+                                <td>异常数量</td>
+                                <td>核实数量</td>
+                                <td>核实原因</td>
+                                <td>处理结果</td>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr class="text-center" v-for="commodity in workOrderInfo.commodities">
+                                <td v-text="commodity.logistic_number"></td>
+                                <td v-text="commodity.sku"></td>
+                                <td v-text="commodity.name"></td>
+                                <td v-text="commodity.amount"></td>
+                                <td v-text="commodity.abnormal_amount"></td>
+                                <td v-text="commodity.check_amount"></td>
+                                <td v-text="commodity.check_result"></td>
+                                <td v-text="commodity.process_result"></td>
+                            </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+
+                <div class="container">
+                    <div class="row">
+                        <div class="col-sm-4 col-sm-offset-4">
+                            <button class="btn btn-sm btn-outline-primary"
+                                    @click="selectWorkOrderIndex(workOrderIndex-1)">
+                                上一单
+                            </button>
+                            <button class="btn btn-sm btn-outline-primary" @click="selectWorkOrderIndex(workOrderIndex+1)">
+                                下一单
+                            </button>
+                            <span  v-text="workOrderIndex+1"></span>/<span v-text="workOrderInfos.length"></span>
+                        </div>
+                    </div>
+                </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="showCreateWorkOrder">继续生成工单
+                </button>
+            </div>
+        </div>
+    </div>
+</div>

+ 33 - 19
resources/views/order/index/_work_order_modal.blade.php

@@ -51,9 +51,9 @@
 
 
                 {{--信息更改--}}
-                <div class="form-group row" v-if="'信息更改' === workOrder.orderIssueType ">
+                <div class="form-group row" v-if="['信息更改'].includes(workOrder.orderIssueType) ">
                     <hr>
-                    <label for="order_issue_type" class="col-sm-2 col-form-label">新的收方信息</label>
+                    <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="5"
                                   v-model="workOrder.remark.info"></textarea>
@@ -104,9 +104,8 @@
                     </div>
                 </div>
 
-
-                <hr v-if="'破损' === workOrder.orderIssueType">
-                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
+                <hr v-if=" ['破损','快递异常'].includes(workOrder.orderIssueType)">
+                <div class="form-group row" v-if="['破损','快递异常'].includes(workOrder.orderIssueType) ">
                     <label for="deal-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="deal-image" style="min-height: 75px"
@@ -127,30 +126,45 @@
                     </div>
                 </div>
 
-                <hr v-if="'破损' === workOrder.orderIssueType">
-                <div class="form-group row" v-if="'破损' === workOrder.orderIssueType">
+                <hr v-if="['破损','错漏发','快递异常'].includes(workOrder.orderIssueType)">
+                <div class="form-group row" v-if="['破损','错漏发','快递异常'].includes(workOrder.orderIssueType)">
                     <label for="work-order-sku-amount"
-                           class="col-sm-2 col-form-label text-right text-primary">破损sku信息</label>
+                           class="col-sm-2 col-form-label text-right text-primary">商品信息</label>
                     <div class="col-sm-10">
                         <table class="table table-sm table-active table-grid-row">
-                            <tr class="text-center">
-                                <th>商品编码</th>
-                                <th>商品名称</th>
-                                <th>数量</th>
-                                <th>选中</th>
+                            <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">异常数量</td>
+                                <td></td>
                             </tr>
-                            <tr v-for="(item,i) in workOrder.commodities" :key="i" class="text-center">
-                                <td><span v-text="item.sku"></span></td>
-                                <td><span v-text="item.name"></span></td>
+                            </thead>
+                            <tbody>
+                            <tr v-for="(commodity,i) in workOrder.commodities" class="text-center">
+                                <td><span v-text="commodity.logistic_number"></span></td>
+                                <td><span v-text="commodity.sku"></span></td>
+                                <td v-if="['破损',].includes(workOrder.orderIssueType)">
+                                    <span v-if="workOrder.orderIssueType === '破损'"
+                                          :data="commodity.abnormal_type = '破损'" >破损</span>
+{{--                                    <span v-if="workOrder.orderIssueType === '错漏发'"--}}
+{{--                                          :data="commodity.abnormal_type = '错漏发'"  >错漏发</span>--}}
+                                </td>
+                                <td><span v-text="commodity.name"></span></td>
+                                <td><span v-text="commodity.amount"></span></td>
                                 <td>
-                                    <input type="number" class="form-control form-control-sm" v-model="item.amount">
+                                    <input type="number" class="form-control form-control-sm" v-model="commodity.abnormal_amount">
                                 </td>
                                 <td>
-                                    <button type="button" class="btn btn-sm btn-outline-danger"
-                                            @click="workOrder.commodities.splice(i,1)">删除
+                                    <button type="button" class="close" @click="workOrder.commodities.splice(i,1)">
+                                        <span aria-hidden="true" class="text-danger">&times;</span>
                                     </button>
                                 </td>
                             </tr>
+                            </tbody>
                         </table>
                     </div>
                 </div>

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

@@ -57,7 +57,7 @@
 
                     <button class="btn btn-sm ml-1 btn-primary" @click="copyLogisticNumber()">复制快递单号</button>
                     @can('订单管理-订单-生成工单')
-                        <button class="btn btn-sm ml-1 btn-outline-success" @click="showInterceptModel()">生成工单</button>
+                        <button class="btn btn-sm ml-1 btn-outline-success" @click="checkWorkOrderOrCreateWorkOrder">生成工单</button>
                     @endcan
                     @can('订单管理-订单-一键回传')
                         <button class="btn btn-sm ml-1 btn-success tooltipTarget"
@@ -325,6 +325,7 @@
                 </div>
                 @can('订单管理-订单-生成工单')
                     @include('order.index._work_order_modal')
+                    @include('order.index._workOrkerInfoModal')
                 @endcan
                 <textarea id="clipboardDiv" style="opacity:0"></textarea>
             </div>
@@ -411,6 +412,21 @@
                     {name: '重要且紧急', value: '4'},
                 ],
                 exeSign: {},
+                workOrderInfos:[],
+                workOrderIndex:null,
+                workOrderInfo:{
+                    id:'',
+                    type:'',
+                    clientCode:'',
+                    logistic_numbers:[],
+                    details:[],
+                    commodities:[],
+                    packagesImages:[],
+                    commodityImages:[],
+                    dealImages:[],
+                    refundImages:[],
+                    remark:'',
+                },
             },
             mounted: function () {
                 this.initData();
@@ -624,10 +640,13 @@
                 },
                 'workOrder.orderIssueType':function(newValue){
                     if (newValue === null) return;
-                    if (newValue === '破损'){
+                    if (['破损','错漏发','快递异常'].includes(newValue)){
                         this.fillWorkOrderCommodity();
                     }
                 },
+            },
+            computed:{
+
             },
             methods: {
                 initData() {
@@ -1213,6 +1232,30 @@
                     }
                     return char;
                 },
+                checkWorkOrderOrCreateWorkOrder(){
+                    window.tempTip.setIndex(1999);
+                    window.tempTip.waitingTip('校验是否有对应工单');
+                    this.checkWorkOrder().then(res=>{
+                        window.tempTip.cancelWaitingTip();
+                        if (res) {
+                            window.tempTip.confirm('当前勾选订单已有工单是否查看',()=>{
+                                this.workOrderInfo = this.workOrderInfos[0];
+                                this.workOrderIndex = 0;
+                                $('#work-order-info').modal('show');
+                            },()=>{
+                                this.showInterceptModel();
+                            },'查看','跳过');
+                        } else {
+                            this.showInterceptModel();
+                        }
+                    }).catch(err=>{
+                        window.tempTip.cancelWaitingTip();
+                    })
+                },
+                showCreateWorkOrder(){
+                    $("#work-order-info").modal('hide');
+                    $("#intercept-modal").modal('show');
+                },
                 showInterceptModel() {
                     this.workOrder.grad = 1;
                     if (checkData.length < 1) {
@@ -1229,7 +1272,7 @@
                     this.workOrder.remark.info = '';
                     this.workOrder.commodities = [];
                     this.workOrder.logistic_number = null;
-                    $('#intercept-modal').modal('show');
+                    $("#intercept-modal").modal('show');
                 },
                 checkOrderIssue(name) {  //
                     let types = this.orderIssueType.filter(item => {
@@ -1271,33 +1314,83 @@
                     }
                     if ('拦截' === this.workOrder.orderIssueType) {
                         this.createInterceptWorkOrder();
+                    }  else if ('信息更改' === this.workOrder.orderIssueType) {
+                        this.createInformationChangeWorkOrder();
+                    } else if ('快递丢件' === this.workOrder.orderIssueType) {
+                        this.createLossWorkOrder();
                     } else if ('快递异常' === this.workOrder.orderIssueType) {
                         this.createExpressAbnormalWorkOrder();
-                    } else if ('信息更改' === this.workOrder.orderIssueType) {
-                        this.createInformationChangeWorkOrder();
                     } else if ('错漏发' === this.workOrder.orderIssueType) {
                         this.createMistakeWorkOrder();
                     } else if ('破损' === this.workOrder.orderIssueType) {
                         this.createDamagedWorkOrder();
-                    }else if ('快递丢件' === this.workOrder.orderIssueType) {
-                        this.createLossWorkOrder();
-                    }  else {
+                    } else {
                         this.createDefaultWorkOrder();
                     }
                 },
+                createInterceptWorkOrder() {        // 拦截
+                    let formData = new FormData();
+                    checkData.forEach(e=>{
+                        formData.append('orderNos[]',e);
+                    });
+                    formData.append('remark',this.workOrder?.remark?.info || '');
+                    let url = "{{route('workOrder.interceptApi')}}";
+                    this.createWorkOrder(formData,url);
+                },
                 createInformationChangeWorkOrder() { // 信息修改
                     let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
+                    if (data.length > 1){
+                        window.tempTip.setIndex(1999);
+                        window.tempTip.show('信息修改仅支持单个订单修改');
+                    }
+                    let url = "{{route('workOrder.informationChangeApi')}}";
+                    this.createWorkOrder(data[0],url);
                 },
-                createDefaultWorkOrder() { // 其他
+                createLossWorkOrder(){  // 快递丢件
                     let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
+                    let formData = new FormData();
+                    formData.append('order_no', data[0]['order_no']);
+                    formData.append('remark', this.workOrder.remark.info);
+                    let url = "{{route('workOrder.lossApi')}}";
+                    this.createWorkOrder(formData,url);
                 },
-                createExpressAbnormalWorkOrder() { // 快递异常
+                createExpressAbnormalWorkOrder(){ // 快递异常
+                    let url = "{{route('workOrder.expressAbnormalApi')}}";
+                    let data = this.getCreateWorkOrderData();
+                    let formData = new FormData();
+                    formData.append('order_no', data[0]['order_no']);
+                    formData.append('remark', this.workOrder.remark.info);
+                    let dealImages = this.getImages(this.workOrder.dealImages);
+                    this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
+                    this.setFormDataCommodities(formData);
+                    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']);
+                    formData.append('remark', data[0]['remark']);
+                    formData.append('logistic_number', data[0]['logistic_number']);
+                    let dealImages = this.getImages(this.workOrder.dealImages);
+                    this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
+                    this.setFormDataCommodities(formData);
+                    this.createWorkOrder(formData, url);
+                },
+                createDefaultWorkOrder() {              // 其他
                     let data = this.getCreateWorkOrderData();
                     this.createWorkOrder(data);
                 },
-                checkWorkOrderImage(packageImages,commodityImages,dealImages){
+                createDamagedWorkOrder() { //破损工单创建
+                    let packageImages = this.getImages(this.workOrder.packageImages);                   // 外包装破损图片
+                    let commodityImages = this.getImages(this.workOrder.commodityImages);               // 内物破损图片
+                    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')}}";
+                    this.createWorkOrder(formData, url);
+                },
+                checkWorkOrderImage(packageImages,commodityImages,dealImages) {
                     let message = null;
                     if (0 === packageImages.length) {
                         message = '请选择外包图片';
@@ -1313,34 +1406,25 @@
                     let data = this.getCreateWorkOrderData();
                     formData.append('order_no', data[0]['order_no']);
                     formData.append('remark', data[0]['remark']);
-                    formData.append('type', '破损');
-                    formData.append('logistic_number', this.workOrder.logistic_number);
+                    formData.append('logistic_number', data[0]['logistic_number']);
                     formData.append('price', this.workOrder.price);
-                    this.setFormDataImagePrefix(formData, 'packageImages', packageImages);
-                    this.setFormDataImagePrefix(formData, 'commodityImages', commodityImages);
-                    this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
+
+                    this.setFormDataImagePrefix(formData,'packageImages',packageImages);
+                    this.setFormDataImagePrefix(formData,'commodityImages',commodityImages);
+                    this.setFormDataImagePrefix(formData,'dealImages',dealImages);
                     this.setFormDataCommodities(formData);
                     return formData;
                 },
-                createDamagedWorkOrder() { //破损工单创建
-                    if (!this.checkDamagedWorkOrder())return;
-                    let packageImages = this.getImages(this.workOrder.packageImages);                   // 外包装破损图片
-                    let commodityImages = this.getImages(this.workOrder.commodityImages);               // 内物破损图片
-                    let dealImages = this.getImages(this.workOrder.dealImages);                         // 交易截图
-                    let message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages);   // 校验工单图片不能为空
-                    if (message) {
-                        window.tempTip.setIndex(1999);
-                        window.tempTip.show(message)
-                        return;
-                    }
-                    let formData = this.getDamagedFormData(packageImages,commodityImages,dealImages);
-                    let url = "{{route('workOrder.damagedApi')}}";
-
-                    this.createWorkOrder(formData, url);
-                },
                 setFormDataCommodities(formData){
                      this.workOrder.commodities.map(commodity=>{
-                         let item = {sku:commodity.sku,amount:commodity.amount};
+                         let item = {
+                             sku:commodity.sku,
+                             amount:commodity.amount,
+                             commodity_id:commodity['commodity_id'],
+                             abnormal_type:commodity['abnormal_type'],
+                             logistic_number:commodity['logistic_number'],
+                             abnormal_amount:commodity['abnormal_amount'],
+                         };
                          formData.append('commodities[]',JSON.stringify(item)) ;
                     });
                 },
@@ -1354,14 +1438,17 @@
                         return item.file;
                     })
                 },
-                checkDamagedWorkOrder(){
+                checkDamagedWorkOrder(packageImages,commodityImages,dealImages){
                     let message = null;
                     if (!this.checkPrice()){
                         message = '商品价值需大于0';
                     }
+                    if (!message){
+                        message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages);
+                    }
                     if (message){
                         window.tempTip.setIndex(1999);
-                        window.tempTip.show("sku数量和录入sku信息数量不符合");
+                        window.tempTip.show(message);
                         return false;
                     }
                     return true;
@@ -1369,22 +1456,11 @@
                 checkPrice(){
                     return parseInt(this.workOrder.price) !== 0;
                 },
-                createMistakeWorkOrder() { // 错漏发
-                    let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
-                },
-                createInterceptWorkOrder() {// 拦截
-                    let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
-                },
-                createLossWorkOrder(){  // 丢件
-                    let data = this.getCreateWorkOrderData();
-                    this.createWorkOrder(data);
-                },
-                createWorkOrder(data, url = null) {
-                    if (!url) url = '{{route('workOrder.storeApi')}}';
+                createWorkOrder(data, url) {
                     window.tempTip.setIndex(1999);
+                    window.tempTip.waitingTip('生成工单中');
                     window.axios.post(url, data, {'Content-Type': 'multipart/form-data'}).then(res => {
+                        window.tempTip.cancelWaitingTip();
                         if (res.data.success) {
                             window.tempTip.showSuccess('工单生成成功');
                             $('#intercept-modal').modal('hide');
@@ -1400,6 +1476,7 @@
                             }
                         }
                     }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
                         window.tempTip.show(err)
                     });
                 },
@@ -1414,8 +1491,8 @@
                     this.workOrder.packageImages = [];
                     this.workOrder.dealImages = [];
                     this.workOrder.commodities = [];
-                    this.workOrder.price = [];
-                    this.workOrder.logisticNumber = [];
+                    this.workOrder.price = '';
+                    this.workOrder.logisticNumber = '';
                     this.workOrder.orderIssueType = 0;
                 },
                 getCreateWorkOrderData() {
@@ -1540,18 +1617,16 @@
                     });
                 },
                 fillWorkOrderCommodity(){
-                    const {commodities} = this;
-                    let orderNo = checkData[0];
-                    let orderCommodities = commodities[orderNo];
-                    this.workOrder.commodities = [];
-                    orderCommodities.forEach(item=>{
-                        this.workOrder.commodities.push({
-                            sku:item.sku,
-                            name:item['descr_c'],
-                            amount:item['qtyordered'],
-                            selected:false,
-                        });
-                    });
+                    let url = "{{route('order.commodity.getCommoditiesApi')}}";
+                    let data = {orderNo:checkData[0]};
+                    window.axios.post(url,data).then(res=>{
+                        if (res.data.success){
+                            this.workOrder.commodities = res.data.data;
+                        } else {
+
+                        }
+                    }).catch(err=>{
+                    })
                 },
                 pasteImage(event,imageArray){
                     for (let i = 0; i < event.clipboardData.items.length; i++) {
@@ -1581,6 +1656,84 @@
                         };
                     });
                 },
+                checkWorkOrder(){
+                    return new Promise((resolve, reject)=>{
+                        let no = checkData;
+                        let url = '{{route('workOrder.checkApi')}}';
+                        window.axios.post(url,{no:no}).then(res=>{
+                            if (res.data.success){
+                                if (res.data.data.length > 0){
+                                    res.data.data.forEach((e,i)=>{
+                                        this.workOrderInfos[i] = this.conversionWorkOrder(e);
+                                    });
+                                    resolve(true) ;
+                                } else{
+                                    this.workOrderInfos = [];
+                                    resolve(false);
+                                }
+
+                            } else {
+                                this.workOrderInfos = [];
+                            }
+                        }).catch(err=>{
+                            reject(err);
+                        });
+                    });
+                },
+                conversionWorkOrder(workOrder){
+                    return {
+                        id:workOrder?.id,
+                        type:workOrder?.issue_type?.name,
+                        clientCode:workOrder?.order?.client_code,
+                        logistic_numbers:this.getLogisticNumbers(workOrder),
+                        details:this.getDetails(workOrder),
+                        commodities:this.getCommodities(workOrder),
+                        packagesImages:this.getImageList(workOrder.images,'1'),
+                        commodityImages:this.getImageList(workOrder.images,'2'),
+                        dealImages:this.getImageList(workOrder.images,'3'),
+                        refundImages:this.getImageList(workOrder.images,'4'),
+                        remark:workOrder.remark,
+                    };
+                },
+                getLogisticNumbers(workOrder){
+                    let packages = workOrder?.order?.packages || [];
+                    return packages.map(e=>{return e.logistic_number});
+                },
+                getDetails(workOrder){
+                    let details = workOrder?.details;
+                    return details.map(e=>{return e;});
+                },
+                getCommodities(workOrder){
+                    return (workOrder?.commodities ||[]).map(item=>{
+                        item.name = item?.commodity?.name;
+                        return item;
+                    });
+                },
+                getImageList(images,type){
+                    let filePrefix = "{{asset("/storage")}}";
+                    let imageList = images.filter(e=>{
+                        return parseInt(e.type) === parseInt(type);
+                    });
+                    return imageList.map(e=>{
+                        return {
+                            src:filePrefix+e?.upload_file?.url+'.'+e?.upload_file?.type,
+                        };
+                    });
+                },
+                selectWorkOrderIndex(index){
+                    if (index < 0)index = this.workOrderInfos.length-1;
+                    if (index >= this.workOrderInfos.length) index = 0;
+                    this.workOrderIndex = index;
+                    this.workOrderInfo = this.workOrderInfos[index];
+                },
+                showParentWorkOrder(){
+                    if (parseInt(this.workOrderIndex) === 0) return false;
+                    return this.workOrderIndex < this.workOrderInfos -1;
+                },
+                showNextWorkOrder(){
+                    if (parseInt(this.workOrderIndex) === (this.workOrderInfos.length -1)) return false;
+                    return this.workOrderIndex  < this.workOrderInfos.length -1;
+                }
             },
         });
     </script>

+ 80 - 0
resources/views/order/workOrder/_bao_shi_review.blade.php

@@ -0,0 +1,80 @@
+{{--快递处理丢件工单--}}
+<div class="modal fade " id="bao-shi-review-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="bao-shi-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">
+                <div>
+                    <table class="table">
+                        <thead>
+                        <tr class="text-center">
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>核实数量</td>
+                            <td>宝时审核数量</td>
+                            <td>核实结果</td>
+                            <td>处理结果</td>
+                        </tr>
+                        </thead>
+                        <tbody v-if="fillWorkOrder">
+                        <tr v-for="(item) in reviewWorkOrder?.commodities || [] " class="text-center">
+                            <td>
+                                <span v-text="item.logistic_number"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.name || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.sku || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.abnormal_amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.check_amount"></span>
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm" v-model="item.bao_shi_check_amount">
+                            </td>
+                            <td>
+                                <span v-text="item.check_result"></span>
+                            </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>
+                                <select class="form-control form-control-sm"
+                                        v-else-if="'错漏发' === reviewWorkOrder.issue_type_name "
+                                        v-model="item.process_result" >
+                                    <option
+                                        v-for="type in mistakeProcessResults"
+                                        :value="type" v-text="type"></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="review">终审</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 94 - 0
resources/views/order/workOrder/_baoshi_fill_work_order.blade.php

@@ -0,0 +1,94 @@
+{{--快递处理丢件工单--}}
+<div class="modal fade " id="baoshi-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">
+                <div>
+                    <table class="table">
+                        <thead>
+                        <tr class="text-center">
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>宝时核实数量</td>
+                            <td>核实结果</td>
+                            <td>处理结果</td>
+                        </tr>
+                        </thead>
+                        <tbody v-if="fillWorkOrder">
+                        <tr v-for="(item) in fillWorkOrder?.commodities || [] " class="text-center">
+                            <td>
+                                <span v-text="item.logistic_number"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.name || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.sku || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.abnormal_amount"></span>
+                            </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="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>
+                        </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>

+ 1 - 1
resources/views/order/workOrder/_edit_issue_type.blade.php

@@ -1,4 +1,4 @@
-<div class="modal fade" id="edit-issue-type-type-modal" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true" z-index="51">
+<div class="modal fade" id="edit-issue-type-modal" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true" z-index="51">
     <div class="modal-dialog">
         <div class="modal-content">
             <div class="modal-header">

+ 1 - 1
resources/views/order/workOrder/_fill_loss_work_order.blade.php

@@ -97,7 +97,7 @@
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭
                 </button>
                 {{--填充工单--}}
-                <button type="button" class="btn btn-outline-primary" @click="updateLossWorkOrder">提交
+{{--                <button type="button" class="btn btn-outline-primary" @click="updateLossWorkOrder">提交--}}
                 </button>
             </div>
         </div>

+ 82 - 0
resources/views/order/workOrder/_logistic_fill_work_order.blade.php

@@ -0,0 +1,82 @@
+{{--快递处理丢件工单--}}
+<div class="modal fade " id="logistic-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="logistic-work-order-modal" v-if="fillWorkOrder">
+                    <span v-text="fillWorkOrder.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>
+                    <table class="table">
+                        <thead>
+                        <tr>
+                            <td>快递单号</td>
+                            <td>商品</td>
+                            <td>商品条码</td>
+                            <td>订单数量</td>
+                            <td>异常数量</td>
+                            <td>核实数量</td>
+                            <td>核实结果</td>
+{{--                            <td>处理结果</td>--}}
+                        </tr>
+                        </thead>
+                        <tbody v-if="fillWorkOrder">
+                        <tr v-for="(item) in fillWorkOrder?.commodities || [] ">
+                            <td>
+                                <span v-text="item.logistic_number"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.name || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item?.commodity?.sku || ''"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.amount"></span>
+                            </td>
+                            <td>
+                                <span v-text="item.abnormal_amount"></span>
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm" v-model="item.check_amount">
+                            </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 ['核实破损','核实未破损']"
+                                            :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>
+                            </td>
+{{--                            <td>--}}
+{{--                                <select class="form-control form-control-sm" v-model="item.process_result">--}}
+{{--                                    <option--}}
+{{--                                        v-for="type in (['赔偿','不赔偿'])"--}}
+{{--                                        :value="type" v-text="type"></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="logisticUpdateCommodities">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 150 - 0
resources/views/order/workOrder/_owner_fill_work_order.blade.php

@@ -0,0 +1,150 @@
+{{--快递处理丢件工单--}}
+<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-header">
+                <h5 class="modal-title" id="checkModalLabel">信息填写(货主)</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="modal-body">
+                    <div class="form-group row">
+                        <div class="col-sm-2"></div>
+                        <div class="col-sm-10  text-primary">
+                            补发单号,退款成功截图 二选一
+                        </div>
+                    </div>
+                    {{--破损商品价格--}}
+                    <div class="form-group row">
+                        <label for="work-order-price"
+                               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"
+                                   placeholder="破损商品价格">
+                        </div>
+                    </div>
+                    {{--快递单号--}}
+                    <div class="form-group row">
+                        <label for="work-order-logistic-number"
+                               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="快递单号">
+                        </div>
+                    </div>
+                    {{--补发快递--}}
+                    <div class="form-group row"
+                         v-show="fillWorkOrder.dealImages && fillWorkOrder.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="快递单号">
+                        </div>
+                    </div>
+                    {{--信息更改--}}
+                    <div class="form-group row">
+                        <hr>
+                        <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>
+                        </div>
+                    </div>
+
+                    <hr>
+                    <div class="form-group row">
+                        <label for="deal-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="deal-image" style="min-height: 75px"
+                                 contenteditable="true"
+                                 @paste="pasteImage($event,fillWorkOrder.dealImages)">
+                                <div v-for="(image,i) in fillWorkOrder.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)">取消
+                                            </button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <hr>
+                    <div class="form-group row" v-show="!fillWorkOrder['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"
+                                     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)">取消
+                                            </button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div>
+                        <table class="table">
+                            <thead>
+                            <tr class="text-center">
+                                <td>快递单号</td>
+                                <td>商品</td>
+                                <td>商品条码</td>
+                                <td>订单数量</td>
+                                <td>异常数量</td>
+                                <td></td>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr v-for="(item,i) in  fillWorkOrder.commodities" class="text-center">
+                                <td>
+                                    <span v-text="item.logistic_number"></span>
+                                </td>
+                                <td>
+                                    <span v-text="item.name || ''"></span>
+                                </td>
+                                <td>
+                                    <span v-text="item.sku || ''"></span>
+                                </td>
+                                <td>
+                                    <span v-text="item.amount"></span>
+                                </td>
+                                <td>
+                                    <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)">
+                                        <span aria-hidden="true" class="text-danger">&times;</span>
+                                    </button>
+                                </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="ownerUpdateWorkOrder">提交
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 170 - 148
resources/views/order/workOrder/_work_order_details.blade.php

@@ -1,9 +1,9 @@
-{{-- 工单详情 --}}
-<div v-if="item.details.length > 0" class="alert alert-light mb-0">
+<div class="alert alert-light mb-0">
     <div class="header-alert">
         <span class="text-monospace">工单详情</span>
         <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)"
                 @click="selectDetailId = item.id">显示
         </button>
         <button type="button" class="btn btn-sm btn-outline-primary float-right"
@@ -11,155 +11,177 @@
                 @click="selectDetailId = null">隐藏
         </button>
     </div>
-    <transition name="fade">
-        <div class="body-alert" v-if="selectDetailId === item.id">
-            <div class="card-body row col-12 mb-0 pb-0"
-                 v-for="(detail,i) in item.details">
-                {{-- 快递丢件工单详情 --}}
-                <div v-if="item['issue_type']['name'] === '快递丢件'">
-                    <div v-if="detail.logistic_number">
-                        <span class="mr-3">丢件快递单号:</span>
-                        <span class="text-truncate"
-                              v-text="detail.logistic_number"></span>
-                    </div>
-                    <div>
-                        <span class="mr-3">丢件价值:</span>
-                        <span class="text-truncate"
-                              v-text="detail.price"></span>
-                    </div>
-                    {{-- 工单登记商品详情 --}}
-                    <div v-for="(item,i) in item.commodities">
-                        <span class="mr-2">sku</span>
-                        <span v-text="item.sku"></span>
-                        <span class="mr-2">商品名</span>
-                        <span
-                            v-text="item.commodity ? item.commodity.name : ''"></span>
-                        <span class="mr-2">数量</span>
-                        <span v-text="item.amount"></span>
-                    </div>
-                </div>
+</div>
+<transition name="fade">
+    <div class="alert alert-light mb-0 border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item.details && item.details.length > 0 && selectDetailId === item.id">
+        <div>
+            <span class="text-monospace" v-text="'商品价值'"></span>
+        </div>
+        <div class="card-body row col-12 mb-0 pb-0"
+             v-for="(detail) in item.details">
+            <div class="col-12">
+                <span v-text="detail.price"></span>
+            </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.deal_images && item.deal_images.length > 0">
+        <div class="col-12">
+            <span class="text-monospace" v-text="'交易截图'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(dealImage,i) in item.deal_images">
+            <div class="">
+                <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>
+        </div>
+    </div>
+</transition>
+
+<transition name="fade">
+    <div class="alert alert-light mb-0 border border-top"
+         v-show="selectDetailId === item.id"
+         v-if="item.refund_image && item.refund_image.length > 0">
+        <div class="col-12">
+           <span class="text-monospace" v-text="'交易截图'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(refund_image,i) in item.refund_image">
+            <div class="">
+                <a  target="_blank"
+                    v-if="dealImage.upload_file"
+                    :href="filePrefix+refund_image.upload_file.url + '.'+refund_image.upload_file.type">
+                    <img class="image-w"
+                         :src="filePrefix+refund_image.upload_file.url + '.'+refund_image.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.refund_image && item.refund_image.length > 0">
+        <div class="col-12">
+           <span class="text-monospace" v-text="'交易截图'"></span>
+        </div>
+        <div class="card-body col-sm-6"
+             v-for="(refund_image,i) in item.refund_image">
+            <div class="">
+                <a  target="_blank"
+                    v-if="dealImage.upload_file"
+                    :href="filePrefix+refund_image.upload_file.url + '.'+refund_image.upload_file.type">
+                    <img class="image-w"
+                         :src="filePrefix+refund_image.upload_file.url + '.'+refund_image.upload_file.type"
+                         alt="交易截图">
+                </a>
+            </div>
+        </div>
+    </div>
+</transition>
 
-                {{-- 破损工单详情 --}}
-                <div v-if="item['issue_type']['name'] === '破损'">
-                    <div>
-                        <div>
-                            <span class="mr-3">破损sku数:</span>
-                            <span class="text-truncate"
-                                  v-text="detail.sku_amount"></span>
-                        </div>
-                        <div>
-                            <span class="mr-3">快递单号:</span>
-                            <span class="text-truncate"
-                                  v-text="detail.logistic_number !== 'null' ? detail.logistic_number : ''"></span>
-                        </div>
-                        <div>
-                            <span class="mr-3">破损商品价值:</span>
-                            <span v-text="detail.price"></span>
-                        </div>
-                    </div>
+<transition name="fade">
+    <div class="alert alert-light mb-0  border border-top"
+         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>
+        </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>
+    </div>
+</transition>
+
+<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">
+        <div class="col-12">
+           <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>
+    </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>
-                {{-- 交易截图 --}}
-                <div class="row"
-                     v-if="item['deal_images'] && item['deal_images'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <span class="text-monospace" v-text="'交易截图'"></span>
-                    </div>
-                    <div class="card-body col-sm-6"
-                         v-for="(dealImage,i) in item['deal_images']">
-                        <div class="">
-                            <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>
-                    </div>
-                </div>
-                {{-- 退款截图 --}}
-                <div class="row"
-                     v-if="item['refund_image'] && item['refund_image'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <span class="text-monospace" v-text="'退款截图'"></span>
-                    </div>
-                    <div class="card-body col-sm-6"
-                         v-for="(refundImage,i) in item['refund_images']">
-                        <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>
-                </div>
-                {{-- 外包装截图 --}}
-                <div class="row"
-                     v-if="item['package_images'] && item['package_images'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <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>
-                </div>
-                {{-- 内物破损图片 --}}
-                <div class="row"
-                     v-if="item['commodity_images'] && item['commodity_images'].length > 0">
-                    <div class="col-12">
-                        <hr>
-                        <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>
-                </div>
+        <div class="col-12">
+           <div class="text-monospace">异常商品详情</div>
+        </div>
+        <div class="card-body col-12"
+             v-for="(commodity,i) in item.commodities">
+            <div>
+                <span class="mr-3">SKU:</span>
+                <span class="text-truncate" v-text="commodity.sku"></span>
+            </div>
+            <div>
+                <span class="mr-3">商品名称:</span>
+                <span class="text-truncate"
+                      v-text="commodity.commodity ?.name || '' "></span>
+            </div>
+            <div>
+                <span class="mr-3">数量:</span>
+                <span class="text-truncate"
+                      v-text="commodity.amount"></span>
             </div>
 
-            {{-- 破损商品详情 --}}
-            <div class="row"
-                 v-if="item['issue_type']['name'] === '破损'">
-                <div class="col-12">
-                    <hr>
-                    <div class="text-monospace">破损商品详情</div>
-                </div>
-                <div class="card-body col-12"
-                     v-for="(commodity,i) in item.commodities">
-                    <div>
-                        <span class="mr-3">SKU:</span>
-                        <span class="text-truncate" v-text="commodity.sku"></span>
-                    </div>
-                    <div>
-                        <span class="mr-3">商品名称:</span>
-                        <span class="text-truncate"
-                              v-text="commodity.commodity ? commodity.commodity.name : '' "></span>
-                    </div>
-                    <div>
-                        <span class="mr-3">数量:</span>
-                        <span class="text-truncate"
-                              v-text="commodity.amount"></span>
-                    </div>
-                </div>
+            <div v-if="item.issue_type_name !== '错漏发'">
+                <span class="mr-3">核实数量:</span>
+                <span class="text-truncate"
+                      v-text="commodity.check_amount"></span>
+            </div>
+
+            <div >
+                <span class="mr-3">宝时核实数量:</span>
+                <span class="text-truncate"
+                      v-text="commodity.bao_shi_check_amount"></span>
+            </div>
+
+            <div>
+                <span class="mr-3">核实:</span>
+                <span class="text-truncate"
+                      v-text="commodity.check_result"></span>
+            </div>
+
+
+            <div>
+                <span class="mr-3">处理结果:</span>
+                <span class="text-truncate"
+                      v-text="commodity.process_result"></span>
             </div>
         </div>
-    </transition>
-</div>
+    </div>
+</transition>

Разлика између датотеке није приказан због своје велике величине
+ 330 - 502
resources/views/order/workOrder/index.blade.php


+ 25 - 5
routes/apiLocal.php

@@ -272,19 +272,39 @@ Route::group(['prefix' => 'print'],function (){
 });
 
 Route::prefix('workOrder')->group(function(){
-    Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
-    Route::post('damaged','WorkOrderController@damagedApi')->name('workOrder.damagedApi'); // 创建 破损
-    Route::post('loss','WorkOrderController@updateLossApi')->name('workOrder.lossApi'); // 客户提供丢件信息
-    Route::post('status','WorkOrderController@updateWorkOrderStatusApi')->name('workOrder.updateStatusApi');
+
+    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::post('updateLoss','WorkOrderController@updateLossApi')->name('workOrder.updateLossApi'); // 客户提供丢件信息
+    Route::post('status','WorkOrderController@updateWorkOrderStatusApi')->name('workOrder.updateStatusApi');        // 修改状态
     Route::post('status/logistic','WorkOrderController@logisticUpdateWorkOrderStatusApi')->name('workOrder.logisticUpdateStatusApi');
-    Route::post('store','WorkOrderController@storeApi')->name('workOrder.storeApi'); // 创建
+
+
     Route::post('review','WorkOrderController@reviewApi')->name('workOrder.reviewApi'); // 审核
+    Route::post('review/baoShi','WorkOrderController@baoShiReviewApi')->name('workOrder.baoShi.reviewApi');
+
     Route::post('batchReview','WorkOrderController@batchReviewApi')->name('workOrder.batchReviewApi');  // 批量审核
     Route::post('buildOrderIssue','WorkOrderController@buildOrderIssueApi')->name('workOrder.buildOrderIssueApi');  // 生成问题件
     Route::post('updateIssueType','WorkOrderController@updateIssueTypeApi')->name('workOrder.updateIssueTypeApi'); // 修改问题类型
     Route::post('batchUpdateIssueType','WorkOrderController@batchUpdateIssueTypeApi')->name('workOrder.batchUpdateIssueTypeApi'); // 修改问题类型
     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("updateCommodities/owner","WorkOrderController@ownerUpdateCommoditiesApi")->name("workOrder.commodity.ownerUpdateApi");
+        Route::post("updateCommodities/logistic","WorkOrderController@logisticUpdateCommoditiesApi")->name("workOrder.commodity.logisticUpdateApi");
+        Route::post("updateCommodities/baoshi","WorkOrderController@baoShiUpdateCommoditiesApi")->name("workOrder.commodity.baoShiUpdateCommodities");
+    });
+
     Route::prefix('process')->group(function (){
         Route::post('log/logistic','WorkOrderProcessLogController@logisticStoreApi')->name('workOrderProcessLog.logisticLogApi');
         Route::post('log','WorkOrderProcessLogController@storeApi')->name('workOrderProcessLog.LogApi');

Неке датотеке нису приказане због велике количине промена