Ver Fonte

部分提交

zengjun há 4 anos atrás
pai
commit
ebd36880cd

+ 7 - 3
app/Http/Controllers/CommodityController.php

@@ -399,9 +399,13 @@ class CommodityController extends Controller
     public function getCommodityApi(Request $request,CommodityService $service): array
     {
         $ownerService = new OwnerService();
-        $codes = [$request->input('owner_code')];
-        $ownerService->createByWmsCustomerIds([$request->input('owner_code')]);
-        $owner = Owner::query()->where('code',$request['owner_code'])->first();
+        $owner = null;
+        if($request->has("owner_id")){
+            $owner = Owner::query()->where('id',$request->input("owner_id"))->first();
+        } else {
+            $ownerService->createByWmsCustomerIds([$request->input('owner_code')]);
+            $owner = Owner::query()->where('code',$request['owner_code'])->first();
+        }
         $service->syncWMSOrderCode($owner,[$request->input('sku')]);
         if (!$owner){
             return ['success' => false ,'message' => '货主未找到'];

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

@@ -5,6 +5,12 @@ namespace App\Http\Controllers;
 use App\Components\AsyncResponse;
 use App\Components\Database;
 use App\Components\ErrorPush;
+use App\Order;
+use App\OrderIssue;
+use App\Services\OrderIssueService;
+use App\Services\OrderIssueTypeService;
+use App\Services\OrderRejectedBillRelationService;
+use App\Services\OrderService;
 use App\Services\WaybillService;
 use App\Waybill;
 use Illuminate\Http\Request;
@@ -47,5 +53,25 @@ SQL;
             DB::connection("aliyunMysql")->insert($insert, [$item->repository_id,$item->code."-1",$item->id,$item->depth,$item->width]);
         }
     }
+
+    public function batch(){
+        /** @var OrderIssueTypeService $issueTypeService */
+        $issueTypeService  = app(OrderIssueTypeService::class);
+        $types = $issueTypeService->getWorkOrderIssueType();
+        return view("order.workOrder.batch.index",compact("types"));
+    }
+
+    public function test1(){
+        $arr1 = ["123","1234","12345"];
+        $arr2 = ["1234"];
+        dd(array_diff($arr1,$arr2));
+    }
+
+    public function  syncOrder(){
+        /** @var  OrderService $service */
+        $service = app(OrderService::class);
+        $service->syncOrderInfoByWmsOrderNos(['SO220331003419','SO220331003387','SO220331003378','SO220331003356']);
+    }
+
 }
 

+ 20 - 0
app/Http/Controllers/WorkOrderCancelInterceptController.php

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Order;
+use App\OrderPackage;
 use App\Services\OrderService;
 use App\Services\WorkOrderCancelInterceptService;
 use App\WorkOrder;
@@ -154,4 +156,22 @@ class WorkOrderCancelInterceptController extends Controller
         return ['success' => true, 'data' => $data];
     }
 
+    public function createBatchApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单')){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u',$request->input('logistic_numbers') )));
+        $result = $this->service->check($logisticNumbers,'取消拦截');
+        if($result['success'] == false) return $result;
+
+        $orderPackageQuery = OrderPackage::query()->select("order_id")->whereIn("logistic_number",$logisticNumbers);
+        $orders = Order::query()->whereIn("id",$orderPackageQuery)->get();
+        $params = [
+            "remark" => $request->input("remark"),
+            "order_nos" => $orders->map(function($item){return $item->code;})->toArray(),
+        ];
+        $this->service->batchStore($params);
+        return ['success' => true];
+    }
 }

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

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Order;
+use App\OrderPackage;
 use App\Services\OrderService;
 use App\Services\WorkOrderDamageService;
 use App\WorkOrder;
@@ -88,5 +90,36 @@ class WorkOrderDamageController extends Controller
         return ['success' => true,'data' => $data];
     }
 
+    public function checkLogisticNumberApi(Request $request){
+        $logisticNumbers = array_unique(array_filter(preg_split('/[,, \n]+/u', $request->input('logistic_numbers'))));
+        $result = $this->service->check($logisticNumbers, '快递异常');
+        if(!$result['success']){
+            return $result;
+        }
+        $orderPackageQuery = OrderPackage::query()->select('order_id')->whereIn('logistic_number',$logisticNumbers);
+        $orders = Order::query()->with('packages.commodities')->whereIn('id',$orderPackageQuery)->get();
+        $params = [];
+        foreach ($orders as $order){
+            $param = [];
+            $packages = $order->packages ?? [];
+            $param['order_no'] = $order->code ?? '';
+            foreach ($packages as $package){
+                $commodities = $package->commodities ?? [];
+                $commodityParams = [];
+                foreach($commodities as $commodity){
+                    $commodityParams[] = [
+                        'logistic_number' => $package->logistic_number ?? '',
+                        'amount' => $commodity->amount ?? '',
+                        'commodity_id' => $commodity->id ?? '',
+                        'sku' => $commodity->sku ?? '',
+                        'sku_name' => $commodity->name ?? '',
+                    ];
+                }
+                $param['commodities'] = $commodities;
+            }
+            $params[] = $param;
+        }
+        return ['success' => true,'data' => $params];
+    }
 
 }

+ 35 - 1
app/Http/Controllers/WorkOrderExpressAbnormalController.php

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Order;
+use App\OrderPackage;
 use App\Services\OrderService;
 use App\Services\WorkOrderExpressAbnormalService;
 use App\WorkOrder;
@@ -92,4 +94,36 @@ class WorkOrderExpressAbnormalController extends Controller
 
         return ['success' => true, 'data' => $data];
     }
-}
+
+    public function checkLogisticNumberApi(Request $request,WorkOrderExpressAbnormalService  $service){
+        $logisticNumbers = array_unique(array_filter(preg_split('/[,, \n]+/u', $request->input('logistic_numbers'))));
+        $result = $this->service->check($logisticNumbers, '快递异常');
+        if(!$result['success']){
+            return $result;
+        }
+        $orderPackageQuery = OrderPackage::query()->select('order_id')->whereIn('logistic_number',$logisticNumbers);
+        $orders = Order::query()->with('packages')->whereIn('id',$orderPackageQuery)->get();
+        $params = [];
+        foreach ($orders as $order){
+            $packages = $order->packages ?? [];
+            $param = ['order_no' => $order->code ?? ''];
+            foreach ($packages as $package){
+                $param['packages'][] = ['logistic_number' =>  $package->logistic_number ?? ''];
+            }
+            $params[] = $param;
+        }
+        return ['success' => true,'data' => $params];
+    }
+
+    public function createBatchApi(Request $request):array
+    {
+        if (Gate::denies('订单管理-订单-生成工单')){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u',$request->input('logistic_numbers') )));
+        $result = $this->service->check($logisticNumbers,'快递异常');
+
+        if($result['success'] == false) return $result;
+        $this->service->batchStore($request->input('data'));
+        return ['success' => true];
+    }}

+ 49 - 12
app/Http/Controllers/WorkOrderInformationChangeController.php

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Order;
+use App\OrderPackage;
 use App\Services\OrderService;
 use App\Services\WorkOrderInformationChangeService;
 use App\WorkOrder;
@@ -20,8 +22,8 @@ class WorkOrderInformationChangeController extends Controller
 
     public function __construct()
     {
-        $this->service = app('WorkOrderInformationChangeService');
-        $this->orderService = app('OrderService');
+        $this->service = app(WorkOrderInformationChangeService::class);
+        $this->orderService = app(OrderService::class);
     }
 
     public function storeApi(Request $request): array
@@ -40,7 +42,7 @@ class WorkOrderInformationChangeController extends Controller
 
     public function ownerEditApi(Request $request): array
     {
-        if (Gate::denies('订单管理-工单处理-货主编辑')){
+        if (Gate::denies('订单管理-工单处理-货主编辑')) {
             return ['success' => false, 'message' => '没有对应权限'];
         }
 
@@ -48,7 +50,7 @@ class WorkOrderInformationChangeController extends Controller
 
         if (!$detail) {
             return ['success' => false, 'message' => '参数异常'];
-        } else if($detail->status == '完成') {
+        } else if ($detail->status == '完成') {
             return ['success' => false, 'message' => '工单已完成,请刷新重试'];
         }
 
@@ -72,7 +74,7 @@ class WorkOrderInformationChangeController extends Controller
 
         if (!$detail) {
             return ['success' => false, 'message' => '参数异常'];
-        } else if($detail->status == '完成'){
+        } else if ($detail->status == '完成') {
             return ['success' => false, 'message' => '工单已完成,请刷新重试'];
         }
 
@@ -92,22 +94,22 @@ class WorkOrderInformationChangeController extends Controller
     {
         if (Gate::denies('订单管理-工单处理-承运商编辑'))
             return ['success' => false, 'message' => '没有对应权限'];
-        $detail_ids = $request->input('detail_ids',[]);
+        $detail_ids = $request->input('detail_ids', []);
 
         if (count($detail_ids) == 0) return ['success' => false, 'message' => '参数异常'];
 
-        $details = WorkOrderDetail::query()->where('status',3)->find($detail_ids);
+        $details = WorkOrderDetail::query()->where('status', 3)->find($detail_ids);
 
         if (count($details) < count($detail_ids)) {
             return ['success' => false, 'message' => '参数异常,刷新后重试'];
         }
-        $this->service->logisticBatchHandler($details,$request->all());
+        $this->service->logisticBatchHandler($details, $request->all());
 
-        $data = WorkOrder::query()->defaultWith()->find($details->map(function($item){
+        $data = WorkOrder::query()->defaultWith()->find($details->map(function ($item) {
             return $item->work_order_id;
         })->toArray());
 
-        return ['success' => true,'data' => $data];
+        return ['success' => true, 'data' => $data];
     }
 
     /**
@@ -135,7 +137,7 @@ class WorkOrderInformationChangeController extends Controller
      */
     public function baoShiBatchReviewApi(Request $request): array
     {
-        if (Gate::denies('订单管理-工单处理-宝时编辑')){
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
             return ['success' => false, 'message' => '没有对应权限'];
         }
         $detail_ids = $request->input('detail_ids', []);
@@ -156,6 +158,41 @@ class WorkOrderInformationChangeController extends Controller
             return $item->work_order_id;
         })->toArray());
 
-        return ['success' => true,'data' => $data];
+        return ['success' => true, 'data' => $data];
+    }
+
+    public function checkLogisticNumberApi(Request $request)
+    {
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u', $request->input('logistic_numbers'))));
+        $result = $this->service->check($logisticNumbers, '信息更改');
+        if (!$result['success']) {
+            return $result;
+        }
+        $orderPackageQuery = OrderPackage::query()->select('order_id')->whereIn("logistic_number", $logisticNumbers);
+        $orders = Order::query()->with('packages')->select('code', 'id')->whereIn('id', $orderPackageQuery)->get();
+        return ['success' => true,
+            'data' => $orders->map(function ($item) {
+                $logistic_numbers = $item->packages->map(function ($package) {
+                    return $package->logistic_number;
+                })->toArray();
+                return ['code' => $item->code, 'logistic_numbers' => $logistic_numbers];
+            })->toArray()];
+    }
+
+    public function createBatchApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-订单-生成工单')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u', $request->input('logistic_numbers'))));
+        $result = $this->service->check($logisticNumbers, '信息更改');
+        if ($result['success'] == false) return $result;
+        $this->service->batchStore(array_map(function($item){
+            return [
+                'order_no' => $item['code'],
+                'remark' => $item['remark'],
+            ];
+        },$request->input("data")));
+        return ['success' => true];
     }
 }

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

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Order;
+use App\OrderPackage;
 use App\Services\OrderService;
 use App\Services\WorkOrderInterceptService;
 use App\WorkOrder;
@@ -156,4 +158,23 @@ class WorkOrderInterceptController extends Controller
         $this->service->tags($data);
         return ['success' => true, 'data' => $data];
     }
+
+    public function createBatchApi(Request $request):array
+    {
+        if (Gate::denies('订单管理-订单-生成工单')){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u',$request->input('logistic_numbers') )));
+        $result = $this->service->check($logisticNumbers,'拦截');
+
+        if($result['success'] == false) return $result;
+        $orderPackageQuery = OrderPackage::query()->select("order_id")->whereIn("logistic_number",$logisticNumbers);
+        $orders = Order::query()->whereIn("id",$orderPackageQuery)->get();
+        $params = [
+            "remark" => $request->input("remark"),
+            "order_nos" => $orders->map(function($item){return $item->code;})->toArray(),
+        ];
+        $this->service->batchStore($params);
+        return ['success' => true];
+    }
 }

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

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Order;
+use App\OrderPackage;
 use App\Services\OrderService;
 use App\Services\WorkOrderLossService;
 use App\WorkOrder;
@@ -66,4 +68,22 @@ class WorkOrderLossController extends Controller
         $data = $this->service->getDefaultWith($detail->work_order_id);
         return ['success' => true,'data' => $data];
     }
+    public function createBatchApi(Request $request):array
+    {
+        if (Gate::denies('订单管理-订单-生成工单')){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u',$request->input('logistic_numbers') )));
+        $result = $this->service->check($logisticNumbers,'快递丢件');
+
+        if($result['success'] == false) return $result;
+        $orderPackageQuery = OrderPackage::query()->select("order_id")->whereIn("logistic_number",$logisticNumbers);
+        $orders = Order::query()->whereIn("id",$orderPackageQuery)->get();
+        $params = [
+            "remark" => $request->input("remark"),
+            "order_nos" => $orders->map(function($item){return $item->code;})->toArray(),
+        ];
+        $this->service->batchStore($params);
+        return ['success' => true];
+    }
 }

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

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\OrderPackage;
 use App\Services\OrderService;
 use App\Services\WorkOrderMistakeService;
 use App\WorkOrder;
@@ -123,5 +124,55 @@ class WorkOrderMistakeController extends Controller
         return ['success' => true, 'data' => $data];
     }
 
+    public function checkLogisticNumberApi(Request $request){
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u', $request->input('logistic_numbers'))));
+        $result = $this->service->check($logisticNumbers, '错漏发');
+        if(!$result['success']){
+            return $result;
+        }
+        $orderPackages = OrderPackage::query()->with('order','commodities.commodity')->whereIn("logistic_number",$logisticNumbers)->get();
+        $params = [];
+        $count = 0;
+        foreach ($orderPackages as $package){
+            $commodities = $package->commodities??[];
+            foreach($commodities as $commodity){
+                $count ++;
+                $params[] = [
+                    'order_code' => $package->order->code ?? '',
+                    'owner_id' => $package->order->owner_id ?? '',
+                    'commodity_id'=>$commodity->commodity_id ?? '',
+                    'sku' => $commodity->commodity->sku ?? '',
+                    'sku_name' => $commodity->commodity->name ?? '',
+                    'amount' => $commodity->amount ?? '',
+                    'logistic_number' => $package->logistic_number ?? '',
+                    'abnormal_type' => '',
+                    'issue_type' => '',
+                ];
+            }
+        }
+        return ['success' => true,'data' => $params];
+    }
+
+    public function  createBatchApi(Request $request){
+        if (Gate::denies('订单管理-订单-生成工单')){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        $logisticNumbers  = array_unique(array_filter(preg_split('/[,, \n]+/u',$request->input('logistic_numbers') )));
+        $result = $this->service->check($logisticNumbers,'错漏发');
+        if(!$result['success']){
+            return $request;
+        }
+        $data = $request->input("data");
+        $params = [];
+        foreach ($data as $item){
+            $params[] = [
+                'order_no'=> $item['order_no'],
+                'remark' => $request->input('remark'),
+                'commodities' => $item['commodities'],
+            ];
+        }
+        $this->service->batchStore($params);
+        return ['success' => true];
+    }
 
 }

+ 12 - 0
app/Services/WorkOrderExpressAbnormalService.php

@@ -216,4 +216,16 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
         $this->logService->createLog($detail, '终审', $process_progress.'-宝时终审');
     }
 
+    /**
+     * 拦截工单-批量创建
+     * @param $params
+     */
+    public function batchStore($params)
+    {
+        foreach ($params as $param) {
+            $this->store($param);
+        }
+    }
+
+
 }

+ 11 - 0
app/Services/WorkOrderInformationChangeService.php

@@ -232,4 +232,15 @@ class WorkOrderInformationChangeService extends WorkOrderService
         $this->logService->createLog($detail, '完结', '承运商更改成功,自动终审');
         $this->review($detail, $process_progress,$endContext );
     }
+
+    /**
+     * 拦截工单-批量创建
+     * @param $params
+     */
+    public function batchStore($params)
+    {
+        foreach ($params as $item) {
+            $this->store($item);
+        }
+    }
 }

+ 3 - 1
app/Services/WorkOrderInterceptService.php

@@ -4,9 +4,11 @@ namespace App\Services;
 
 use App\Order;
 use App\OrderIssueProcessLog;
+use App\OrderPackage;
 use App\WorkOrder;
 use App\WorkOrderDetail;
 use Illuminate\Support\Facades\Auth;
+use function Symfony\Component\Translation\t;
 
 /**
  * 处理 拦截 工单
@@ -110,7 +112,7 @@ class WorkOrderInterceptService extends WorkOrderService
     public function batchStore($params)
     {
         foreach ($params['order_nos'] as $order_no) {
-            $this->store(['order_no' => $order_no, 'remark' => $params['remark']]);
+                $this->store(['order_no' => $order_no, 'remark' => $params['remark']]);
         }
     }
 

+ 0 - 1
app/Services/WorkOrderLogService.php

@@ -3,7 +3,6 @@
 namespace App\Services;
 
 use App\Traits\ServiceAppAop;
-use App\WorkOrder;
 use App\WorkOrderDetail;
 use App\WorkOrderLog;
 use Illuminate\Support\Facades\Auth;

+ 30 - 26
app/Services/WorkOrderLossService.php

@@ -26,27 +26,20 @@ class WorkOrderLossService extends WorkOrderService
         OrderIssueProcessLogService $orderIssueProcessLogService
     )
     {
-        parent::__construct($logService,$imageService,$commoditiesService,$detailService,$issueTypeService,$orderService,$orderIssueService,$orderIssueProcessLogService);
+        parent::__construct($logService, $imageService, $commoditiesService, $detailService, $issueTypeService, $orderService, $orderIssueService, $orderIssueProcessLogService);
     }
 
     public function checkWorkOrder($nos)
     {
         $issueType = $this->issueTypeService->firstOrCreate(['name' => '快递丢件']);
-        $orderQuery = Order::query()->select('id')->where('code',$nos);
-        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id',$orderQuery)->first();
+        $orderQuery = Order::query()->select('id')->where('code', $nos);
+        $workOrder = WorkOrder::query()->select('id')->whereIn('order_id', $orderQuery)->first();
         if (!$workOrder) return false;
         return WorkOrderDetail::query()
-            ->where('order_issue_type_id',$issueType['id'])
-            ->where('work_order_id',$workOrder['id'])->exists();
+            ->where('order_issue_type_id', $issueType['id'])
+            ->where('work_order_id', $workOrder['id'])->exists();
     }
 
-   /*
-   * 快递丢件处理流程
-   * 1: 创建 (限定宝时创建)
-   * 2: 商家填充商品信息
-   * 3: 宝时终审
-   */
-
     // 创建
     public function store($params)
     {
@@ -54,12 +47,12 @@ class WorkOrderLossService extends WorkOrderService
 
         $order = $this->syncOrder($params['order_no']);
 
-        $work_order = $this->createAndNotification($order, $orderIssueType, $params['remark'] ?? '','宝时创建');
+        $work_order = $this->createAndNotification($order, $orderIssueType, $params['remark'] ?? '', '宝时创建');
 
         $process_progress = '宝时创建';
 
         $work_order->update([
-            'status'=> WorkOrder::$OWNER_HANDLER_STATUS,
+            'status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'owner_tag' => WorkOrder::$NEW_TAG,
@@ -71,18 +64,18 @@ class WorkOrderLossService extends WorkOrderService
         $detail = $this->detailService->createWorkOrderDetail($work_order, $params);
 
         $detail->update([
-            'status'=> WorkOrder::$OWNER_HANDLER_STATUS,
+            'status' => WorkOrder::$OWNER_HANDLER_STATUS,
             'process_progress' => $process_progress,
             'last_status' => WorkOrder::$DEFAULT_STATUS,
             'work_order_status' => 0,
-            'logistic_handle_tag' =>0,
+            'logistic_handle_tag' => 0,
         ]);
 
         $detail->processLogs()->create([
             'work_order_id' => $work_order->id,
             'work_order_detail_id' => $detail->id,
             'user_id' => $work_order->creator_id,
-            'content' => $process_progress.'-快递丢件',
+            'content' => $process_progress . '-快递丢件',
             'status' => '未同步',
             'type' => '创建',
         ]);
@@ -95,7 +88,7 @@ class WorkOrderLossService extends WorkOrderService
      * @param WorkOrderDetail $detail
      * @param $params
      */
-    public function ownerFillDetail(WorkOrderDetail $detail,$params)
+    public function ownerFillDetail(WorkOrderDetail $detail, $params)
     {
         $this->detailService->fillLossDetail($detail, $params);
         $process_progress = '待终审';
@@ -103,7 +96,7 @@ class WorkOrderLossService extends WorkOrderService
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
             'process_progress' => $process_progress,
             'last_status' => WorkOrder::$OWNER_HANDLER_STATUS,
-            'logistic_handle_tag' =>0,
+            'logistic_handle_tag' => 0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
@@ -120,11 +113,11 @@ class WorkOrderLossService extends WorkOrderService
             'work_order_id' => $detail->work_order_id,
             'work_order_detail_id' => $detail->id,
             'user_id' => Auth::id(),
-            'content' => $process_progress.'-填充丢件信息',
+            'content' => $process_progress . '-填充丢件信息',
             'status' => '未同步',
             'type' => '处理',
         ]);
-        $this->logService->createLog($detail, '处理', $process_progress.'-填充丢件信息');
+        $this->logService->createLog($detail, '处理', $process_progress . '-填充丢件信息');
     }
 
     /**
@@ -132,15 +125,15 @@ class WorkOrderLossService extends WorkOrderService
      * @param WorkOrderDetail $detail
      * @param $params
      */
-    public function baoShiReview(WorkOrderDetail $detail,$params)
+    public function baoShiReview(WorkOrderDetail $detail, $params)
     {
         $process_progress = '终审完成';
-        $this->detailService->updateLossDetail($detail,$params);
+        $this->detailService->updateLossDetail($detail, $params);
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
             'process_progress' => $process_progress,
             'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'logistic_handle_tag' =>0,
+            'logistic_handle_tag' => 0,
         ]);
         $detail->workOrder()->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
@@ -157,11 +150,22 @@ class WorkOrderLossService extends WorkOrderService
             'work_order_id' => $detail->work_order_id,
             'work_order_detail_id' => $detail->id,
             'user_id' => Auth::id(),
-            'content' => $process_progress.'-完结',
+            'content' => $process_progress . '-完结',
             'status' => '未同步',
             'type' => '结束',
         ]);
         $this->endOrderIssueAndSyncProcessLogs($detail);
-        $this->logService->createLog($detail, '终审', $process_progress.'-宝时终审');
+        $this->logService->createLog($detail, '终审', $process_progress . '-宝时终审');
+    }
+
+    /**
+     * 拦截工单-批量创建
+     * @param $params
+     */
+    public function batchStore($params)
+    {
+        foreach ($params['order_nos'] as $order_no) {
+            $this->store(['order_no' => $order_no, 'remark' => $params['remark']]);
+        }
     }
 }

+ 6 - 0
app/Services/WorkOrderMistakeService.php

@@ -271,4 +271,10 @@ class WorkOrderMistakeService extends WorkOrderService
         $this->logService->createLog($detail, '终审', $params['process_progress'].'-宝时终审');
     }
 
+    public function batchStore($params){
+        foreach ($params as $param){
+            $this->store($param);
+        }
+    }
+
 }

+ 35 - 0
app/Services/WorkOrderService.php

@@ -431,6 +431,7 @@ class WorkOrderService
             $processLogs = array_merge($commodityLog, $processLogs);
         }
         $order_issue->logs()->insert($processLogs);
+        $order_issue->logs()->insert();
         $this->orderIssueService->endOrderIssues([$order_issue->id]);
         $detail->processLogs()->where('status', '未同步')->update(['status' => '同步']);
     }
@@ -440,4 +441,38 @@ class WorkOrderService
         return WorkOrder::query()->whereIn('id', $ids)->update(['custom_rejected_status' => $customRejectedStatus]);
     }
 
+    public function check($logisticNumbers,$orderIssueType)
+    {
+        $orderPackages = OrderPackage::query()->select(["id","logistic_number"])->whereIn("logistic_number",$logisticNumbers)->get();
+        if(count($orderPackages) != count($logisticNumbers)){
+            $array = array_diff($logisticNumbers,$orderPackages->map(function($item){return $item->logistic_number;})->toArray());
+            return ['success' => false,'message'=> '未找到对应的订单快递单号:'.join(",",$array) ];
+        }
+        $orderIds = $orderPackages->map(function ($item){return $item->id;})->toArray();
+        $workOrders = WorkOrder::query()->whereIn('order_id',$orderIds)->get();
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => $orderIssueType]);
+        $workOrderDetails = WorkOrderDetail::query()->whereIn('work_order_id',$workOrders->map(function($item){
+            return $item->work_order_id;
+        }))->where('order_issue_type_id',$issueType->id)->get();
+
+        if(count($workOrderDetails) > 0 ){
+            $workOrderDetailIds = $workOrderDetails->map(function($item){
+                return $item->work_order_id;
+            })->toArray();
+            $workOrders = $workOrders->filter(function($item)use($workOrderDetailIds){
+                return in_array($item->id,$workOrderDetailIds);
+            })->map(function ($item){
+                return $item->order_id;
+            })->toArray();
+
+            $items = $orderPackages->filter(function($item)use($workOrders){
+                return in_array($item->order_id,$workOrders);
+            })->map(function($item){
+                return $item->logistic_numbers;
+            })->toArray();
+            return ['success' => false,"message" => "已有对应的拦截工单:".join(",",$items)];
+        }
+        return ['success' => true];
+    }
+
 }

+ 4 - 0
resources/views/order/workOrder/batch/_content.blade.php

@@ -0,0 +1,4 @@
+<div class="form-group">
+    <label for="">请填写问题描述</label>
+    <textarea class="form-control" name="remark" id="remark" cols="30" rows="3" ref="remark"></textarea>
+</div>

+ 745 - 0
resources/views/order/workOrder/batch/index.blade.php

@@ -0,0 +1,745 @@
+@extends("layouts.app")
+@section('title','批量创建工单')
+@section('head')
+@endsection
+
+@section("content")
+    <div class="container" id="batch_container">
+        <div class="form-group">
+            <label for="logistic_numbers">请输入快递单号</label>
+            <textarea class="form-control" name="logistic_numbers" id="logistic_numbers" cols="30" rows="2"
+                      v-model="logisticNumbers"
+                      ref="logistic_numbers"></textarea>
+            <small id="emailHelp" class="form-text text-muted">如添加多个单号,请将快递单号以“空格”、“,”等分隔符隔开</small>
+        </div>
+        <div class="form-group">
+            <label for="">工单类型</label>
+            <select name="issueType" id="issueType" class="form-control" v-model="issueType">
+                <option value=""></option>
+                <option v-for="item in issueTypes" :value="item.name">@{{ item.name }}</option>
+            </select>
+        </div>
+        <div class="form-group" id="remark-div" v-if="showRemarkDiv">
+            <label for="">请填写问题描述</label>
+            <textarea class="form-control" name="remark" id="remark" cols="30" rows="2" ref="remark"
+                      v-model="remark"></textarea>
+        </div>
+
+        <div class="form-group" id="info-edit" v-if="'信息更改' === issueType">
+            <div class="alert alert-info" v-for="(item,index) in infoChange">
+                <div class="form-row">
+                    <div class="col-sm-3">
+                        <label>订单</label>
+                        <p v-text="item.code"></p>
+                    </div>
+                    <div class="col-sm-9 ">
+                        <label class="text-dark font-weight-bolder"><span class="text-danger">*</span>请填写新的收方信息</label>
+                        <textarea class="form-control form-control-sm col-12" name="" id="" cols="30" rows="2"
+                                  v-model="item.remark"></textarea>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+
+        <div class="form-group" id="info-edit" v-if="'错漏发' === issueType">
+            <p for="" class="">商品信息:<span class="text-primary float-right">注意需要勾选商品列才能正确提交!</span></p>
+            <div class="alert alert-info" v-for="(mistake,index) in mistakes">
+                <div class="form-row">
+                    <label class="text-dark font-weight-bolder" v-text="'订单号:'+index"></label>
+                    <table class="table table-bordered table-hover bg-white">
+                        <thead>
+                        <tr>
+                            <th scope="col">勾选</th>
+                            <th scope="col">快递单号</th>
+                            <th scope="col">商品条码</th>
+                            <th scope="col">商品名称</th>
+                            <th scope="col">订单数量</th>
+                            <th scope="col">异常类型</th>
+                            <th scope="col">客户实收数</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(item,index) in mistake">
+                            <td>
+                                <div class="form-group form-check">
+                                    <input type="checkbox" class="form-check-input" v-model="item.select">
+                                </div>
+                            </td>
+                            <td v-text="item.logistic_number"></td>
+                            <td v-text="item.sku"></td>
+                            <td v-text="item.sku_name"></td>
+                            <td v-text="item.amount"></td>
+                            <td v-text="item.abnormal_type"></td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="item.abnormal_amount"
+                                       @input="mistakeAbnormalType(item)">
+                            </td>
+                        </tr>
+                        </tbody>
+
+                    </table>
+                    <table>
+                        <tbody>
+                        <tr class="add-mistake">
+                            <td><input type="text" placeholder="快递单号" class="logistic_number form-control"
+                                       :ref="'logistic_number'+index"></td>
+                            <td><input type="text" placeholder="商品条码" class="sku form-control"
+                                       :ref="'sku'+index"></td>
+                            <td><input type="text" placeholder="实收数量" class="abnormal_amount form-control"
+                                       :ref="'abnormal_amount'+index"></td>
+                            <td>
+                                <button class="btn btn-sm btn-outline-success" @click="addMistakeItem(mistake,index)">
+                                    添加
+                                </button>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+        <div class="form-group" id="express-abnormal-edit" v-if="'快递异常' === issueType"
+             v-for="(item,index) in expressAbnormalData">
+            <p class="text-dark">异常信息</p>
+            <div class="alert alert-info">
+                <p class="text-dark font-weight-bolder" v-text="'订单号:'+item.order_no"></p>
+                <div class="form-row">
+                    <div class="col-sm-3">
+                        <label class="text-dark">快递单号</label>
+                        <div class="form-group form-check" v-for="package  in  item.packages">
+                            <input type="checkbox" class="form-check-input"
+                                   :id=" item.code+':'+ package.logistic_number" v-model="package.select">
+                            <label class="text-dark " v-text="package.logistic_number"
+                                   :for="item.code+':'+ package.logistic_number"></label>
+                        </div>
+                    </div>
+
+                    <div class="col-sm-3 ">
+                        <label class="text-dark "><span class="text-danger">*</span>请选择异常类型</label>
+                        <select name="" id="" class="form-control" v-model="item.abnormal_type">
+                            <option v-for="type in expressAbnormalType" v-text="type" :value="type"></option>
+                        </select>
+                    </div>
+
+                    <div class="col-sm-6 ">
+                        <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
+                        <div class="h-auto border border-secondary bg-white rounded" id="package-image"
+                             style="min-height: 75px"
+                             contenteditable="true"
+                             @paste="pasteImage($event,item.dealImages)">
+                            <div v-for="(image,i) in  item.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,item.dealImages)">取消
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+
+        <div class="form-group" id="damage-edit" v-if="'破损' === issueType">
+            <p class="text-dark">破损信息</p>
+            <div class="alert alert-info" v-for="(item,index) in damages">
+                <div class="form-row">
+                    <label>订单:</label>
+                    <p  class="text-dark" v-text="item.order_no"></p>
+                </div>
+                <div class="damage-table">
+                    <table class="table table-bordered bg-white">
+                        <thead>
+                        <tr>
+                            <th>快递单号</th>
+                            <th>商品条码</th>
+                            <th>异常类型</th>
+                            <th>商品名称</th>
+                            <th>订单数量</th>
+                            <th>异常数量</th>
+                            <th>破损单价</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(commodity,i) in item.commodities">
+                            <td v-text="commodity.logistic_number"></td>
+                            <td v-text="commodity.sku"></td>
+                            <td v-text="commodity.sku_name"></td>
+                            <td v-text="commodity.amount"></td>
+                            <td v-text="commodity.abnormal_amount"></td>
+                            <td v-text="commodity.price"></td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <div class="form-row">
+                    <div class="col-sm-2">
+
+                    </div>
+                    <div class="col-sm-3 ">
+                        <label class="text-dark"><span class="text-danger">*</span>外包装图片</label>
+                        <div class="h-auto border border-secondary bg-white rounded" id="package-image"
+                             style="min-height: 75px"
+                             contenteditable="true"
+                             @paste="pasteImage($event,item.dealImages)">
+                            <div v-for="(image,i) in  item.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,item.dealImages)">取消
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-3 ">
+                        <label class="text-dark"><span class="text-danger">*</span>内物破损图</label>
+                        <div class="h-auto border border-secondary bg-white rounded" id="package-image"
+                             style="min-height: 75px"
+                             contenteditable="true"
+                             @paste="pasteImage($event,item.dealImages)">
+                            <div v-for="(image,i) in  item.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,item.dealImages)">取消
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-3 ">
+                        <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
+                        <div class="h-auto border border-secondary bg-white rounded" id="package-image"
+                             style="min-height: 75px"
+                             contenteditable="true"
+                             @paste="pasteImage($event,item.dealImages)">
+                            <div v-for="(image,i) in  item.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,item.dealImages)">取消
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </div>
+
+        <div class="form-group" id="submit-div">
+            <button class="btn btn-primary" @click="submit">提交</button>
+        </div>
+
+    </div>
+@endsection
+
+@section("lastScript")
+    <script>
+        new Vue({
+            el: "#batch_container",
+            data: {
+                issueTypes: {!! $types !!},
+                issueType: null,
+                logisticNumbers: null,
+                remark: null,
+                expressAbnormalType: ['在途异常', '签收未收到'],
+                infoChange: [],
+                mistakes: [],
+                expressAbnormalData: [],
+                damages:[],
+            },
+            computed: {
+                showRemarkDiv() {
+                    return '信息更改' !== this.issueType;
+                }
+            },
+            watch: {
+                issueType: function (val) {
+                    if (val === "信息更改") {
+                        this.getInfoChangeData();
+                    } else if (val === "错漏发") {
+                        this.getMistakeData();
+                    } else if (val === "快递异常") {
+                        this.getExpressAbnormalData();
+                    } else if(val === "破损"){
+                        this.getDamages();
+                    }
+                }
+            },
+            methods: {
+                submit() {
+                    if (!this.checkSubmitData()) {
+                        return;
+                    }
+                    this.submitData();
+                },
+                checkSubmitData() {
+                    let {issueType} = this;
+                    if (issueType === "拦截" || issueType === "取消拦截" || issueType === "快递丢件") {
+                        if (!this.checkRemark()) {
+                            this.errorTempTip("问题描述为必填项")
+                            return false;
+                        }
+                    } else if (issueType === "信息更改") {
+                        if (!this.checkInfoChange()) {
+                            this.errorTempTip("信息更改项不能为空,且列不能为空")
+                            return false;
+                        }
+                    } else if (issueType === "错漏发") {
+                        if (!this.checkMistakes()) {
+                            return false;
+                        }
+                    } else if (issueType === "快递异常") {
+                        if (!this.checkExpressAbnormal()) {
+                            return false;
+                        }
+                    }
+                    return true;
+                },
+                submitData() {
+                    let {issueType} = this;
+                    if (issueType === "拦截") {
+                        this.intercept()
+                    } else if (issueType === "取消拦截") {
+                        this.cancelIntercept();
+                    } else if (issueType === "快递丢件") {
+                        this.loss();
+                    } else if (issueType === "信息更改") {
+                        this.informationChange();
+                    } else if (issueType === "错漏发") {
+                        this.mistake()
+                    } else if (issueType === "快递异常") {
+                        this.expressAbnormal()
+                    }
+                },
+                loss() {
+                    let {remark, logisticNumbers} = this;
+                    let data = {
+                        logistic_numbers: logisticNumbers,
+                        remark: remark
+                    };
+                    this.waitingTempTip("处理中");
+                    let url = '{{ route("workOrder.loss.createBatchApi") }}';
+                    axios.post(url, data).then(res => {
+                        this.cancelWaitingTempTip();
+                        if (res.data.success === true) {
+                            this.successTempTip("添加成功");
+                            this.cancelSubData();
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
+                        }
+                    }).catch(err => {
+                        this.cancelWaitingTempTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                intercept() {
+                    let {remark, logisticNumbers} = this;
+                    let data = {
+                        logistic_numbers: logisticNumbers,
+                        remark: remark
+                    };
+                    this.waitingTempTip("处理中");
+                    let url = '{{ route("workOrder.intercept.createBatchApi") }}';
+                    axios.post(url, data).then(res => {
+                        this.cancelWaitingTempTip();
+                        if (res.data.success === true) {
+                            this.successTempTip("添加成功");
+                            this.cancelSubData();
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
+                        }
+                    }).catch(err => {
+                        this.cancelWaitingTempTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                cancelIntercept() {
+                    let url = '{{ route("workOrder.cancelIntercept.createBatchApi") }}';
+                    let {remark, logisticNumbers} = this;
+                    let data = {
+                        logistic_numbers: logisticNumbers,
+                        remark: remark
+                    };
+                    this.waitingTempTip("处理中");
+                    axios.post(url, data).then(res => {
+                        this.cancelWaitingTempTip();
+                        if (res.data.success === true) {
+                            this.successTempTip("添加成功");
+                            this.cancelSubData();
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
+                        }
+                    }).catch(err => {
+                        this.cancelWaitingTempTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                informationChange() {
+                    let url = '{{route('workOrder.informationChange.createBatchApi')}}';
+                    let {logisticNumbers, infoChange, remark} = this;
+                    let data = {
+                        logistic_numbers: logisticNumbers,
+                        remark: remark,
+                        data: infoChange,
+                    };
+                    axios.post(url, data).then(res => {
+                        this.cancelWaitingTempTip();
+                        if (res.data.success === true) {
+                            this.successTempTip("添加成功");
+                            this.cancelSubData();
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
+                        }
+                    }).catch(err => {
+                        this.cancelWaitingTempTip();
+                        this.errorTempTip(err);
+                    });
+
+                },
+                mistake() {
+                    let url = '{{route('workOrder.mistake.createBatchApi')}}';
+                    let {logisticNumbers, mistakes, remark} = this;
+                    let mistakesCommodities = [];
+                    for (let key in mistakes) {
+                        let commodities = mistakes[`${key}`] ? mistakes[`${key}`] : [];
+                        commodities = commodities.map(item => JSON.stringify(item));
+                        mistakesCommodities.push({
+                            order_no: key,
+                            commodities: commodities,
+                        });
+                    }
+                    let data = {
+                        logistic_numbers: logisticNumbers,
+                        remark: remark,
+                        data: mistakesCommodities,
+                    };
+                    this.waitingTempTip("提交中");
+                    axios.post(url, data).then(res => {
+                        this.cancelWaitingTempTip();
+                        if (res.data.success === true) {
+                            this.successTempTip("添加成功");
+                            this.cancelSubData();
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
+                        }
+                    }).catch(err => {
+                        this.cancelWaitingTempTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                expressAbnormal() {
+                    let {expressAbnormalData, remark} = this;
+                    let message = '';
+                    this.waitingTempTip("处理中");
+                    for (let i = 0; i < expressAbnormalData.length; i++) {
+                        let expressAbnormal = expressAbnormalData[i];
+                        let data = new FormData();
+                        let packages = expressAbnormal.packages ? expressAbnormal.packages : [];
+                        data.append('order_no', expressAbnormal.order_no);
+                        data.append('remark', remark);
+                        data.append('type', expressAbnormal.abnormal_type);
+                        data.append('process_progress', expressAbnormal.abnormal_type);
+                        packages = packages.filter(item => item.select);
+                        packages.forEach(e=>{
+                            data.append('commodities[]',JSON.stringify({logistic_number:e.logistic_number}));
+                        })
+                        let dealImages = this.getImages(expressAbnormal.dealImages);
+                        this.setFormDataImagePrefix(data, 'dealImages', dealImages);
+                        this.syncExpressAbnormal(data).then(res=>{
+                            if(i === (expressAbnormalData.length -1)){
+                                this.cancelWaitingTempTip();
+                                this.cancelSubData();
+                            }
+                            this.successTempTip(`${expressAbnormal.order_no}创建完成`);
+                        }).catch(err => {
+                            message += err + '\\n';
+                        });
+                    }
+                },
+                syncExpressAbnormal(data) {
+                    let url = "{{route('workOrder.expressAbnormal.storeApi')}}";
+                    return new Promise((resolve, reject) => {
+                        axios.post(url, data).then(res => {
+                            if (res.data.success) {
+                                resolve(true)
+                            } else {
+                                reject(res.data.message ? res.data.message : '创建工单异常');
+                            }
+                        }).catch(err => {
+                            reject(err);
+                        })
+                    });
+                },
+                getInfoChangeData() {
+                    let url = '{{route('workOrder.informationChange.checkLogisticNumberApi')}}';
+                    let data = {
+                        'logistic_numbers': this.logisticNumbers,
+                    };
+                    axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            this.infoChange = res.data.data.map(item => {
+                                item.remark = '';
+                                return item;
+                            });
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
+                        }
+                    }).catch(err => {
+                        this.errorTempTip(err);
+                    });
+                },
+                getMistakeData() {
+                    let url = '{{route('workOrder.mistake.checkLogisticNumberApi')}}';
+                    let data = {
+                        'logistic_numbers': this.logisticNumbers
+                    };
+                    axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            res.data.data.forEach((item) => {
+                                item.abnormal_amount = item.amount;
+                                item.abnormal_type = '未错漏发';
+                                item.select = false;
+                            });
+                            let mistakes = {};
+                            for (let i = 0; i < res.data.data.length; i++) {
+                                let data = res.data.data[i];
+                                let order_code = data['order_code'];
+                                if (mistakes[order_code] == null) {
+                                    mistakes[order_code] = []
+                                }
+                                mistakes[order_code].push(data);
+                            }
+                            this.mistakes = mistakes;
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
+                        }
+                    }).catch(err => {
+                        this.errorTempTip(err);
+                    });
+                },
+                getExpressAbnormalData() {
+                    let url = '{{route('workOrder.expressAbnormal.checkLogisticNumberApi')}}';
+                    let data = {
+                        'logistic_numbers': this.logisticNumbers
+                    };
+                    axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            this.expressAbnormalData = res.data.data.map(item => {
+                                item.abnormal_type = null;
+                                item.dealImages = [];
+                                item.packages.forEach(item => item.select = false);
+                                return item;
+                            });
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
+                        }
+                    }).catch(err => {
+                        this.errorTempTip(err);
+                    });
+                },
+                getDamages(){
+                    let url = '{{route('workOrder.damage.checkLogisticNumberApi')}}';
+                    let data = {
+                        'logistic_numbers': this.logisticNumbers
+                    };
+                    axios.post(url,data).then(res=>{
+                        if(res.data.data){
+                            this.damages = res.data.data;
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
+                        }
+                    }).catch(err=>{
+                        this.errorTempTip(err);
+                    });
+                },
+                waitingTempTip(message) {
+                    window.tempTip.setIndex(2005);
+                    window.tempTip.setDuration(9999);
+                    window.tempTip.waitingTip(message);
+                },
+                cancelWaitingTempTip() {
+                    window.tempTip.cancelWaitingTip();
+                },
+                successTempTip(message) {
+                    window.tempTip.setDuration(1500);
+                    window.tempTip.setIndex(2005);
+                    window.tempTip.showSuccess(message);
+                },
+                errorTempTip(message) {
+                    window.tempTip.setDuration(2000);
+                    window.tempTip.setIndex(2005);
+                    window.tempTip.show(message);
+                },
+                mistakeAbnormalType(item) {
+                    let {abnormal_amount, amount} = item;
+                    if (abnormal_amount === amount) {
+                        item.abnormal_type = "未错漏发";
+                    } else if (abnormal_amount > amount) {
+                        item.abnormal_type = "多发";
+                    } else if (abnormal_amount < amount) {
+                        item.abnormal_type = "少发"
+                    }
+                },
+                addMistakeItem(mistake, i) {
+                    let logisticNumber = $(this.$refs["logistic_number" + i][0]).val();
+                    let sku = $(this.$refs["sku" + i][0]).val();
+                    let abnormalAmount = $(this.$refs["abnormal_amount" + i][0]).val();
+                    let ownerId = mistake[0]['owner_id'] ?? '';
+                    if (ownerId === '' || ownerId == null) {
+                        this.errorTempTip("添加商品时,校验失败货主异常");
+                        return;
+                    }
+                    this.asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber);
+                },
+                cancelMistakeItem(i) {
+                    $(this.$refs["logistic_number" + i][0]).val("");
+                    $(this.$refs["sku" + i][0]).val("");
+                    $(this.$refs["abnormal_amount" + i][0]).val("");
+                },
+                asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber) {
+                    let url = "{{route('commodity.getCommodityApi')}}";
+                    let data = {
+                        owner_id: ownerId,
+                        sku: sku
+                    }
+                    this.waitingTempTip("查询中");
+                    axios.post(url, data).then(res => {
+                        this.cancelWaitingTempTip();
+                        if (res.data.success) {
+                            let item = JSON.parse(JSON.stringify(mistake[0]));
+                            item.abnormal_amount = abnormalAmount;
+                            item.abnormal_type = "多发";
+                            item.logistic_number = logisticNumber;
+                            item.amount = 0;
+                            item.sku_name = res.data.data.name;
+                            item.commodity_id = res.data.data.id;
+                            mistake.push(item);
+                            this.cancelMistakeItem(i);
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : '查询商品失败')
+                        }
+                    }).catch(err => {
+                        this.cancelWaitingTempTip();
+                        this.errorTempTip(err);
+                    })
+                },
+                checkRemark() {
+                    let {remark} = this;
+                    if (remark == null || remark === "") return false;
+                    return remark.trim().length !== 0;
+                },
+                cancelSubData() {
+                    this.logisticNumbers = null;
+                    this.issueType = null;
+                    this.remark = null;
+                    this.infoChange = [];
+                    this.mistakes = [];
+                    this.expressAbnormalData = [];
+                },
+                checkInfoChange() {
+                    let {infoChange} = this;
+                    if (infoChange.length === 0) return false;
+                    return infoChange.filter(item => item.remark == null || item.remark === "" || item.remark.trim().length === 0).length !== 0;
+                },
+                checkMistakes() {
+                    let {mistakes} = this;
+                    if (mistakes.length === 0) {
+                        this.errorTempTip("请校验提交的商品信息是否为勾选")
+                        return false;
+                    }
+                    for (let orderCode in mistakes) {
+                        let mistake = mistakes[`${orderCode}`];
+                        if (!mistake) {
+                            this.errorTempTip('订单:${orderCode}未有订单商品信息');
+                            return false;
+                        }
+                        let count = mistake.filter(item => item.select === true).length;
+                        if (count === 0) {
+                            this.errorTempTip(`订单:${orderCode}未勾选商品列`);
+                            return false;
+                        }
+                    }
+                    return true;
+                },
+                checkExpressAbnormal() {
+                    let {expressAbnormalData} = this;
+                    if (expressAbnormalData.length === 0) {
+                        this.errorTempTip("提交参数异常!");
+                        return false;
+                    }
+                    for (let i = 0; i < expressAbnormalData.length; i++) {
+                        let data = expressAbnormalData[i];
+                        let selectCount = data.packages.filter(item => item.select).length;
+                        if (selectCount === 0) {
+                            this.errorTempTip(`未选中快递单号 订单:${data.code}!`);
+                            return false;
+                        }
+                    }
+                    return true;
+                },
+                pasteImage(event, imageArray) {
+                    for (let i = 0; i < event.clipboardData.items.length; i++) {
+                        let item = event.clipboardData.items[i];
+                        if (item.kind === 'string') continue;
+                        if (item.type.indexOf('image') === -1) continue;
+                        if (item.kind === 'file') {
+                            let blob = item.getAsFile();
+                            let src = null;
+                            this.blobToBase64(blob).then(res => {
+                                src = res;
+                                imageArray.push({src: src, file: blob});
+                            });
+                        }
+                    }
+                    event.preventDefault();
+                },
+                spliceImage(i, images) {
+                    if (!confirm('是否取消选择该图片')) return;
+                    images.splice(i, 1);
+                },
+                blobToBase64(blob) {
+                    return new Promise((resolve, reject) => {
+                        const fileReader = new FileReader();
+                        fileReader.onload = (e) => {
+                            resolve(e.target.result);
+                        };
+                        fileReader.readAsDataURL(blob);
+                        fileReader.onerror = () => {
+                            reject(new Error('blobToBase64 error'));
+                        };
+                    });
+                },
+                getImages(images) {
+                    return images.map((item) => {
+                        return item.file;
+                    })
+                },
+                setFormDataImagePrefix(formData, prefix, images) {
+                    images.forEach((item) => {
+                        formData.append(`${prefix}[]`, item);
+                    });
+                },
+            }
+        })
+    </script>
+@endsection

+ 9 - 0
routes/apiLocal.php

@@ -311,6 +311,7 @@ Route::prefix('workOrder')->group(function(){
 
     // 承运商处理标记
     Route::prefix('intercept')->group(function(){           // 拦截
+        Route::post('batch','WorkOrderInterceptController@createBatchApi')->name("workOrder.intercept.createBatchApi");                           // 批量创建
         Route::post('store','WorkOrderInterceptController@storeApi')->name('workOrder.intercept.storeApi');                                       // 拦截订单创建
         Route::post('store/batch','WorkOrderInterceptController@batchStoreApi')->name('workOrder.intercept.BatchStoreApi');                       // 拦截订单创建
         Route::post('logistic/header','WorkOrderInterceptController@logisticHandlerApi')->name('workOrder.intercept.logistic.handlerApi');        // 承运商处理
@@ -319,6 +320,7 @@ Route::prefix('workOrder')->group(function(){
         Route::post('baoShi/batchReview','WorkOrderInterceptController@baoShiBatchReviewApi')->name('workOrder.intercept.baoShi.batchReviewApi'); // 宝时批量终审
     });
     Route::prefix('cancelIntercept')->group(function(){     // 取消拦截
+        Route::post('batch','WorkOrderCancelInterceptController@createBatchApi')->name("workOrder.cancelIntercept.createBatchApi");                           // 批量创建
         Route::post('store','WorkOrderCancelInterceptController@storeApi')->name('workOrder.cancelIntercept.storeApi');                                     // 拦截订单创建
         Route::post('store/batch','WorkOrderCancelInterceptController@batchStoreApi')->name('workOrder.cancelIntercept.BatchStoreApi');                     // 拦截订单创建
         Route::post('logistic/header','WorkOrderCancelInterceptController@logisticHandlerApi')->name('workOrder.cancelIntercept.logistic.handlerApi');      // 承运商处理
@@ -327,14 +329,17 @@ Route::prefix('workOrder')->group(function(){
         Route::post('baoShi/batchReview','WorkOrderCancelInterceptController@baoShiBatchReviewApi')->name('workOrder.cancelIntercept.baoShi.BatchReviewApi');              // 宝时终审
     });
     Route::prefix('informationChange')->group(function(){   // 信息修改
+        Route::post('batch','WorkOrderInformationChangeController@createBatchApi')->name('workOrder.informationChange.createBatchApi');       // 批量创建               // 创建
         Route::post('store','WorkOrderInformationChangeController@storeApi')->name('workOrder.informationChange.storeApi');                   // 创建
         Route::post('owner/edit','WorkOrderInformationChangeController@ownerEditApi')->name('workOrder.informationChange.owner.editApi');     // 商家修改信息
         Route::post('logistic/header','WorkOrderInformationChangeController@logisticHandlerApi')->name('workOrder.informationChange.logistic.handlerApi');     // 信息修改
         Route::post('logistic/batchHeader','WorkOrderInformationChangeController@logisticBatchHandlerApi')->name('workOrder.informationChange.logistic.batchHandlerApi');     // 信息修改
         Route::post('baoShi/review','WorkOrderInformationChangeController@baoShiReviewApi')->name('workOrder.informationChange.baoShi.reviewApi');                 // 宝时终审
         Route::post('baoShi/batchReview','WorkOrderInformationChangeController@baoShiBatchReviewApi')->name('workOrder.informationChange.baoShi.batchReviewApi');  // 宝时批量终审
+        Route::post('checkLogisticNumber','WorkOrderInformationChangeController@checkLogisticNumberApi')->name('workOrder.informationChange.checkLogisticNumberApi');  // 宝时批量终审
     });
     Route::prefix('loss')->group(function(){                // 快递丢件
+        Route::post('batch','WorkOrderLossController@createBatchApi')->name('workOrder.loss.createBatchApi');                                       // 创建(宝时)
         Route::post('store','WorkOrderLossController@storeApi')->name('workOrder.loss.storeApi');                                       // 创建(宝时)
         Route::post('owner/fill','WorkOrderLossController@ownerFillDetailsApi')->name('workOrder.loss.owner.fillDetailApi');            // 货主填充信息
         Route::post('baoShi/review','WorkOrderLossController@baoShiReviewApi')->name('workOrder.loss.baoShi.reviewApi');                // 宝时终审
@@ -344,20 +349,24 @@ Route::prefix('workOrder')->group(function(){
         Route::post('edit/owner','WorkOrderDamageController@ownerEditApi')->name('workOrder.damage.owner.editApi');                     // 货主编辑
         Route::post('handler/logistic','WorkOrderDamageController@logisticHandleApi')->name('workOrder.damage.logistic.handlerApi');    // 承运商处理
         Route::post('review/baoShi','WorkOrderDamageController@baoShiReviewApi')->name('workOrder.damage.baoShi.reviewApi');            // 宝时终审
+        Route::post('checkLogisticNumber','WorkOrderDamageController@checkLogisticNumberApi')->name('workOrder.damage.checkLogisticNumberApi');            // 宝时终审
     });
     Route::prefix('expressAbnormal')->group(function(){     // 快递异常
         Route::post('store','WorkOrderExpressAbnormalController@storeApi')->name('workOrder.expressAbnormal.storeApi');                                 // 创建
         Route::post('edit/owner','WorkOrderExpressAbnormalController@ownerEditApi')->name('workOrder.expressAbnormal.owner.editApi');                   // 承运商处理
         Route::post('handler/logistic','WorkOrderExpressAbnormalController@logisticHandleApi')->name('workOrder.expressAbnormal.logistic.handlerApi');  // 承运商处理
         Route::post('review/baoShi','WorkOrderExpressAbnormalController@baoShiReviewApi')->name('workOrder.expressAbnormal.baoShi.reviewApi');          // 宝时终审
+        Route::post('checkLogisticNumber','WorkOrderExpressAbnormalController@checkLogisticNumberApi')->name('workOrder.expressAbnormal.checkLogisticNumberApi');                                 // 创建
     });
     Route::prefix('mistake')->group(function(){             // 错漏发
+        Route::post('batch','WorkOrderMistakeController@createBatchApi')->name('workOrder.mistake.createBatchApi');                                       // 创建(宝时)
         Route::post('store','WorkOrderMistakeController@storeApi')->name('workOrder.mistake.storeApi');
         Route::post('owner/edit','WorkOrderMistakeController@ownerEditApi')->name('workOrder.mistake.owner.editApi');
         Route::post('handle/baoShi','WorkOrderMistakeController@baoShiHandleApi')->name('workOrder.mistake.baoShi.handleApi');                  // 宝时处理
         Route::post('owner/handler','WorkOrderMistakeController@ownerHandleApi')->name('workOrder.mistake.owner.handlerApi');                   // 商家处理并完结订单
         Route::post('edit/owner/end','WorkOrderMistakeController@ownerEndEditApi')->name('workOrder.mistake.logistic.end.handlerApi');          // 承运商处理
         Route::post('review/baoShi','WorkOrderMistakeController@baoShiReviewApi')->name('workOrder.mistake.baoShi.reviewApi');                  // 宝时处理
+        Route::post('checkLogisticNumber','WorkOrderMistakeController@checkLogisticNumberApi')->name('workOrder.mistake.checkLogisticNumberApi');  // 宝时批量终审
     });
     Route::prefix('processLog')->group(function(){ // 处理日志
         Route::post('/store','WorkOrderProcessLogController@storeApi')->name('workOrder.processLog.storeApi');