Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

eric2h 4 tahun lalu
induk
melakukan
f4d3b4d4f7
39 mengubah file dengan 1981 tambahan dan 503 penghapusan
  1. 2 1
      app/Filters/WorkOrderFilters.php
  2. 51 0
      app/Http/ApiControllers/LoginController.php
  3. 7 3
      app/Http/Controllers/CommodityController.php
  4. 4 6
      app/Http/Controllers/RejectedController.php
  5. 5 18
      app/Http/Controllers/TestController.php
  6. 20 0
      app/Http/Controllers/WorkOrderCancelInterceptController.php
  7. 8 0
      app/Http/Controllers/WorkOrderController.php
  8. 32 0
      app/Http/Controllers/WorkOrderDamageController.php
  9. 35 1
      app/Http/Controllers/WorkOrderExpressAbnormalController.php
  10. 49 12
      app/Http/Controllers/WorkOrderInformationChangeController.php
  11. 30 0
      app/Http/Controllers/WorkOrderInterceptController.php
  12. 20 0
      app/Http/Controllers/WorkOrderLossController.php
  13. 51 0
      app/Http/Controllers/WorkOrderMistakeController.php
  14. 2 0
      app/Http/Kernel.php
  15. 29 0
      app/Http/Middleware/AccessRestriction.php
  16. 4 1
      app/Services/OrderRejectedBillRelationService.php
  17. 3 1
      app/Services/RejectedService.php
  18. 12 0
      app/Services/WorkOrderExpressAbnormalService.php
  19. 11 0
      app/Services/WorkOrderInformationChangeService.php
  20. 3 1
      app/Services/WorkOrderInterceptService.php
  21. 0 1
      app/Services/WorkOrderLogService.php
  22. 30 26
      app/Services/WorkOrderLossService.php
  23. 6 0
      app/Services/WorkOrderMistakeService.php
  24. 43 1
      app/Services/WorkOrderService.php
  25. 1 1
      config/api.php
  26. 19 0
      config/database.php
  27. 1 1
      config/users.php
  28. 15 15
      resources/views/equipment/index.blade.php
  29. 1 1
      resources/views/maintenance/containerManage/create.blade.php
  30. 1 1
      resources/views/maintenance/containerManage/index.blade.php
  31. 910 0
      resources/views/order/index/batchWorkOrder/index.blade.php
  32. 1 1
      resources/views/order/index/delivering.blade.php
  33. 25 19
      resources/views/order/workOrder/_rejected_item_equals_order_commodity.blade.php
  34. 532 177
      resources/views/order/workOrder/index.blade.php
  35. 1 1
      resources/views/rejected/rejectedPushTask/index.blade.php
  36. 3 214
      resources/views/station/monitor/show.blade.php
  37. 3 0
      routes/api.php
  38. 10 0
      routes/apiLocal.php
  39. 1 0
      routes/web.php

+ 2 - 1
app/Filters/WorkOrderFilters.php

@@ -143,7 +143,8 @@ class WorkOrderFilters
         if (!isset($this->params['is_end'])) {
             $this->queryBuilder->where('status', '!=', 5);      // 过滤已完成
         } else {
-            array_push($status, 5);
+            $status = [5];
+//            array_push($status, 5);
         }
         $this->queryBuilder->whereIn('status', array_unique($status));
     }

+ 51 - 0
app/Http/ApiControllers/LoginController.php

@@ -7,6 +7,7 @@ namespace App\Http\ApiControllers;
 use App\User;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
+use Illuminate\Http\Response;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Hash;
 
@@ -88,6 +89,56 @@ class LoginController
         }
     }
 
+    public function getUserInfo(Request $request)
+    {
+        $userName = $request->get('username','');
+        $password = $request->get('password','');
+        $users = User::query()->where("name",$userName)->orWhereHas("userDetail",function ($query)use($userName){
+            $query->where("mobile_phone",$userName);
+        })->get();
+        $user = null;
+        foreach ($users as $item){
+            if (Hash::check($password,$item->password)){
+                $user = $item;
+                break;
+            }
+        }
+        if (!$user){
+            return response("用户不存在或密码错误", 401);
+        }
+        $user->load("userDetail");
+        return response()->json([
+            "id" => $user->id,
+            "username" => $user->name,
+            "name" => $user->userDetail->full_name ?? "",
+            "sex" => $user->userDetail->gender ?? "",
+            "id_card" => $user->userDetail->identity_number ?? "",
+            "phone" => $user->userDetail->mobile_phone ?? "",
+        ]);
+    }
+
+    public function resetNameOrPwd(Request $request)
+    {
+        $userId = $request->get('id');
+        $userName = $request->get('username');
+        $password = $request->get('password');
+        $user = null;
+        if (!$userId || (!$userName && !$password) || !$user = User::query()->find($userId)){
+            return response("参数错误或用户不存在", 401);
+        }
+        $update = [];
+        if ($userName) {
+            $update["name"] = $userName;
+        }
+        if ($password) {
+            $update["password"] = Hash::make($password);
+        }
+        if ($user->update($update)) {
+            return response("OK");
+        }
+        return response("用户信息修改失败", 410);
+    }
+
     private function getMenu($user)
     {
         Auth::setUser($user);

+ 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' => '货主未找到'];

+ 4 - 6
app/Http/Controllers/RejectedController.php

@@ -406,16 +406,14 @@ class RejectedController extends Controller
             config('database.connections.mysql.port'),config('database.connections.mysql.database')
             ,config('database.connections.mysql.username'),config('database.connections.mysql.password'));
         $e->setFileName("退货单列表-".date('ymdHis'));
-        $e->setDatum("id");
-        $e->setMergeFormat([
-//            "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "P",
-//            "Q", "R"
-        ]);
+        //$e->setDatum("logistic_number_return");
+        $e->setDateTimeColumn("record_time");
         return $e->sql($sql,[
             "created_at"=>"日期","checked_numbers"=>"审核号",
             "owner_name"=>"客户名称","order_number"=>"订单号",
             "sender"=>"姓名","mobile_sender"=>"手机",
-            "logistic_number"=>"原单单号","logistic_number_return"=>"退回单号","logistic_name"=>"退回公司",
+            "record_time" => "退回时间","logistic_name"=>"退回公司",
+            "logistic_number"=>"原单单号","logistic_number_return"=>"退回单号",
             "fee_collected"=>"到付费用","loaded"=>"是否入库",
             "item_barcode"=>"商品条码","item_name"=>"商品名称",
             "item_amount"=>"商品数量","quality_label_name"=>"商品质量","item_remark"=>"备注","operator_name"=>"录入人","remark"=>"退单备注"

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

@@ -5,10 +5,13 @@ namespace App\Http\Controllers;
 use App\Components\AsyncResponse;
 use App\Components\Database;
 use App\Components\ErrorPush;
+use App\Exceptions\Exception;
 use App\Services\WaybillService;
+use App\User;
 use App\Waybill;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Hash;
 
 class TestController extends Controller
 {
@@ -29,23 +32,7 @@ class TestController extends Controller
             dd("方法不存在");
         }
     }
-    public function test(){
-        $sql = <<<SQL
-select * from equipment where id in (
-    select parent_id from equipment where parent_id in (select id from equipment where info like '%"id":2%' and code like 'H%')
-    group by parent_id having (count(*)<5)
-);
-SQL;
-
-        $arr = DB::connection("aliyunMysql")->select(DB::raw($sql));
-        $insert = <<<SQL
-insert into equipment(repository_id, code, parent_id, info, depth, width, height, containers, location_tab, created_at, updated_at, tandem)
-values (?,?,?,null,?,?,1.8,null,'0-0','2022-01-13 16:08:00','2022-01-13 16:08:00',null)
-SQL;
-
-        foreach ($arr as $item){
-            DB::connection("aliyunMysql")->insert($insert, [$item->repository_id,$item->code."-1",$item->id,$item->depth,$item->width]);
-        }
-    }
+    public function test()
+    {}
 }
 

+ 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];
+    }
 }

+ 8 - 0
app/Http/Controllers/WorkOrderController.php

@@ -369,4 +369,12 @@ class WorkOrderController extends Controller
         }
         return ['success' => true];
     }
+
+    public function batchWorkOrder(OrderIssueTypeService $orderIssueTypeService){
+        if (Gate::denies('订单管理-订单-生成工单')){
+            return redirect(url("/order/index/delivering"));
+        }
+        $types = $orderIssueTypeService->getWorkOrderIssueType();
+        return view("order.index.batchWorkOrder.index",compact("types"));
+    }
 }

+ 32 - 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,35 @@ 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){
+            $packages = $order->packages ?? [];
+            $param['order_no'] = $order->code ?? '';
+            $commodityParams = [];
+            foreach ($packages as $package){
+                $commodities = $package->commodities ?? [];
+                foreach($commodities as $commodity){
+                    $commodityParams[] = [
+                        'logistic_number' => $package->logistic_number ?? '',
+                        'amount' => $commodity->amount ?? '',
+                        'commodity_id' => $commodity->id ?? '',
+                        'sku' => $commodity->commodity->sku ?? '',
+                        'sku_name' => $commodity->commodity->name ?? '',
+                    ];
+                }
+            }
+            $param['commodities'] = $commodityParams;
+            $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];
     }
 }

+ 30 - 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,32 @@ 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];
+    }
+
+    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;
+        }
+        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];
+    }
 
 }

+ 2 - 0
app/Http/Kernel.php

@@ -2,6 +2,7 @@
 
 namespace App\Http;
 
+use App\Http\Middleware\AccessRestriction;
 use App\Http\Middleware\AuthorizingApi;
 use App\Http\Middleware\CheckCsrfToken;
 use App\Http\Middleware\LogPostRequest;
@@ -77,6 +78,7 @@ class Kernel extends HttpKernel
         'procurement.auth.api' => \App\Http\Middleware\ProcurementApiAuth::class,
         'check.token' => CheckCsrfToken::class,
         'authorizing' => AuthorizingApi::class,
+        'access.restriction' => AccessRestriction::class,
     ];
 
     /**

+ 29 - 0
app/Http/Middleware/AccessRestriction.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+
+class AccessRestriction
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $ip=[
+            '101.85.200.172',
+            '101.133.135.193'
+        ];
+        if(in_array($request->getClientIp(), $ip)){
+            return $next($request);
+        } else {
+            $request->headers->set('Accept', 'application/json');
+            return response('无权限访问,您的IP:'.$request->getClientIp(), 403);
+        }
+    }
+}

+ 4 - 1
app/Services/OrderRejectedBillRelationService.php

@@ -79,7 +79,10 @@ class OrderRejectedBillRelationService
             return ['order_id' => $order->id,'logistic_number_return' => $item,'order_issue_id' => $order_issue->id ?? ''];
         },$logistic_number_returns));
 
-        OrderIssueRejectedBill::query()->where("order_id",$order->id)->update(['order_issue_id'=>$order_issue->id]);
+        if(!$order->id ?? null){
+            return ;
+        }
+        OrderIssueRejectedBill::query()->where("order_id",$order->id)->update(['order_issue_id'=>$order_issue->id ?? null]);
         $this->service->syncRejectingStatus($order);
     }
 

+ 3 - 1
app/Services/RejectedService.php

@@ -177,7 +177,9 @@ class RejectedService
             ->leftJoin('quality_labels','rejected_bill_items.id_quality_label','=','quality_labels.id')
             ->selectRaw('quality_labels.name quality_label_name')
             ->leftJoin('users','rejected_bills.id_operator','=','users.id')
-            ->selectRaw('users.name operator_name');
+            ->selectRaw('users.name operator_name')
+            ->leftJoin('receive_records', 'rejected_bills.logistic_number_return', '=', 'receive_records.logistic_number')
+            ->selectRaw('IFNULL(receive_records.location_at,receive_records.record_at) record_time');
         return $sql->sql();
     }
 

+ 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);
+        }
+    }
+
 }

+ 43 - 1
app/Services/WorkOrderService.php

@@ -368,14 +368,22 @@ class WorkOrderService
             $order_issue->restore();
         }
         $orderIssueType = app(OrderIssueTypeService::class)->firstOrCreate(['name' => '错漏发']);
+        $expressAbnormal = app(OrderIssueTypeService::class)->firstOrCreate(['name' => '快递异常']);
+        $loss = app(OrderIssueTypeService::class)->firstOrCreate(['name' => '快递丢件']);
+        $orderIssueTypeId = $detail->order_issue_type_id;
+        if($detail->order_issue_type_id == $expressAbnormal->id && $detail->process_progress == "丢件赔偿"){
+            $orderIssueTypeId = $loss->id;
+        }
         if (!$order_issue) {
             $order_issue = OrderIssue::query()->create([
                 'order_id' => $work_order->order_id,
                 'result_explain' => $work_order->remark,
                 'imported_status' => '正常',
-                'order_issue_type_id' => $detail->order_issue_type_id,
+                'order_issue_type_id' => $orderIssueTypeId,
             ]);
             $order_issue->update(['created_at' => $detail->created_at]);
+        } else {
+            $order_issue->update(['order_issue_type_id' => $orderIssueTypeId]);
         }
 
         $order_issue->update([
@@ -440,4 +448,38 @@ class WorkOrderService
         return WorkOrder::query()->whereIn('id', $ids)->update(['custom_rejected_status' => $customRejectedStatus]);
     }
 
+    public function check($logisticNumbers,$orderIssueType)
+    {
+        $orderPackages = OrderPackage::query()->select(["id",'order_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->order_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->id;
+        }))->where('order_issue_type_id',$issueType->id)->get();
+        if(count($workOrderDetails) > 0 ){
+            $workOrderDetailIds = $workOrderDetails->map(function($item){
+                return $item->work_order_id;
+            })->toArray();
+            $checkOrderIds = $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($checkOrderIds){
+                return in_array($item->order_id,$checkOrderIds);
+            })->map(function($item){
+                return $item->logistic_number;
+            })->toArray();
+            return ['success' => false,"message" => "已有对应的".$orderIssueType."工单:".join(",",$items)];
+        }
+        return ['success' => true];
+    }
+
 }

+ 1 - 1
config/api.php

@@ -97,7 +97,7 @@ return [
     'java'=>[
         'wms'=>[
             'rejectedPushTask'=>[
-                'receivePush'=>env('WMS_REJECTED_PUSH_TASK', 'https://swms.baoshi56.com/api/wms/rejectedPushTask/receiveUpdate'),
+                'receivePush'=>env('WMS_REJECTED_PUSH_TASK', 'https://api.baoshi56.com/api/wms/rejectedPushTask/receiveUpdate'),
             ]
         ]
     ]

+ 19 - 0
config/database.php

@@ -84,6 +84,25 @@ return [
             ]) : [],
         ],
 
+        'system' => [
+            'driver' => 'mysql',
+            'url' => env('DATABASE_URL'),
+            'host' => 'rm-uf6f5v208b07hp198bo.mysql.rds.aliyuncs.com',
+            'port' => '3306',
+            'database' => 'system',
+            'username' => 'root',
+            'password' => 'baoshiSYSTEM123!',
+            'unix_socket' => env('DB_SOCKET', ''),
+            'charset' => 'utf8mb4',
+            'collation' => 'utf8mb4_unicode_ci',
+            'prefix' => '',
+            'prefix_indexes' => true,
+            'strict' => false,
+            'engine' => null,
+            'options' => extension_loaded('pdo_mysql') ? array_filter([
+                \PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+            ]) : [],
+        ],
         'aliyunMysql' => [
             'driver' => 'mysql',
             'url' => env('DATABASE_URL'),

+ 1 - 1
config/users.php

@@ -1,7 +1,7 @@
 <?php
 
 return [
-    'superAdmin' => ['xuxiaodong','ldaaww','baoshi56','周亚萍','shiyao','zhouzhendong','zengjun',"yang",'huhao','zy','刘媛媛','李家磊','唐闻炎',env('SUPER_ADMIN',"")],
+    'superAdmin' => ['xuxiaodong','ldaaww','baoshi56','周亚萍','shiyao','zhouzhendong','zengjun','huhao','zy','刘媛媛','唐闻炎',env('SUPER_ADMIN',"")],
     'token_expire_minutes'=>7200,
     'token_check_in_expire_minutes'=>432000, //打卡过期时间,单位为秒
     'cookie_expire_minutes'=>7200,//cookie过期时间,单位分钟

+ 15 - 15
resources/views/equipment/index.blade.php

@@ -343,7 +343,7 @@
             turn:true,                                                  //设备是否翻转
             isLoadLocation:false,                                       //开启加载库位
             //baseUrl:"http://127.0.0.1:8112/",
-            baseUrl:"https://swms.baoshi56.com/",
+            baseUrl:"https://api.baoshi56.com/",
             current:{},                                                 //当前操作的设备
             error:{},
             locations:[],                   //库位信息
@@ -432,7 +432,7 @@
                     this.container = {width:warehouse.length*this.ratio,height:warehouse.width*this.ratio};
                     localStorage.setItem("equipment:warehouse", warehouse.id);
                     $.ajax({
-                        url : this.baseUrl+"warehouse/detail/getCoordsInfo",
+                        url : this.baseUrl+"api/warehouse/detail/getCoordsInfo",
                         type : "post",
                         dataType : "JSON",
                         data : {id:warehouse.id},
@@ -473,7 +473,7 @@
              */
             initPage(){
                 $.ajax({
-                    url : this.baseUrl+"warehouse/detail",
+                    url : this.baseUrl+"api/warehouse/detail",
                     type : "GET",
                     success : (res,status)=>{
                         this.warehouses = res.data;
@@ -523,7 +523,7 @@
                     return;
                 }
                 $.ajax({
-                    url : this.baseUrl+"location/getAttr",
+                    url : this.baseUrl+"api/location/getAttr",
                     type : "post",
                     dataType : "JSON",
                     success : (res,status)=>{
@@ -781,7 +781,7 @@
                     }
                 });
                 $.ajax({
-                    url : this.baseUrl+"warehouse/saveScene",
+                    url : this.baseUrl+"api/warehouse/saveScene",
                     type : "POST",
                     headers:{'Content-Type':'application/json;charset=utf8'},
                     data:JSON.stringify({id:this.selected,warehouse:JSON.stringify(elements),equipment:equipments,delEquipments:delEquipments}),
@@ -994,7 +994,7 @@
                     item.column = Number(item.column);
                 });
                 $.ajax({
-                    url : this.baseUrl+"location/get",
+                    url : this.baseUrl+"api/location/get",
                     type : "post",
                     dataType : "JSON",
                     data : {id:children.id},
@@ -1031,7 +1031,7 @@
                     return;
                 }
                 $.ajax({
-                    url : this.baseUrl+"equipment/getChildren",
+                    url : this.baseUrl+"api/equipment/getChildren",
                     type : "post",
                     dataType : "JSON",
                     data : {id:equipment.eqId},
@@ -1068,7 +1068,7 @@
                 let params = this._formatEquipmentData(equipment);
                 params.warehouseDetailId = this.selected;
                 $.ajax({
-                    url : this.baseUrl+"equipment/saveOrUpdate",
+                    url : this.baseUrl+"api/equipment/saveOrUpdate",
                     type : "post",
                     dataType : "JSON",
                     headers:{'Content-Type':'application/json;charset=utf8'},
@@ -1136,7 +1136,7 @@
                 if (this.isLoadLocation)return;
                 this.isLoadLocation = true;
                 $.ajax({
-                    url : this.baseUrl+"location/removeLocationBind",
+                    url : this.baseUrl+"api/location/removeLocationBind",
                     type : "post",
                     dataType : "JSON",
                     data : {id:this.current.children[this.currentEqChildIndex].id},
@@ -1181,7 +1181,7 @@
                     }
                 });
                 $.ajax({
-                    url : this.baseUrl+"location/locationBatchBound",
+                    url : this.baseUrl+"api/location/locationBatchBound",
                     type : "post",
                     dataType : "JSON",
                     data : JSON.stringify(request),
@@ -1225,7 +1225,7 @@
                 let code = this.current.code+'-'+(this.currentEqChildIndex+1);
                 this.isLoadLocation = true;
                 $.ajax({
-                    url : this.baseUrl+"location/locationBind",
+                    url : this.baseUrl+"api/location/locationBind",
                     type : "post",
                     dataType : "JSON",
                     headers:{'Content-Type':'application/json;charset=utf8'},
@@ -1264,7 +1264,7 @@
                     return;
                 }
                 $.ajax({
-                    url : this.baseUrl+"warehouse/getList",
+                    url : this.baseUrl+"api/warehouse/getList",
                     type : "get",
                     dataType : "JSON",
                     success : (res)=>{
@@ -1292,7 +1292,7 @@
             },
             addWarehouseDetail(){
                 $.ajax({
-                    url : this.baseUrl+"warehouse/detail",
+                    url : this.baseUrl+"api/warehouse/detail",
                     type : "post",
                     dataType : "JSON",
                     headers:{'Content-Type':'application/json;charset=utf8'},
@@ -1317,7 +1317,7 @@
             },
             openRepository(){
                 $.ajax({
-                    url : this.baseUrl+"repository/group",
+                    url : this.baseUrl+"api/repository/group",
                     type : "get",
                     dataType : "JSON",
                     data:{id:this.selected},
@@ -1347,7 +1347,7 @@
             addRepository(){
                 this.repository.warehouseDetailId = this.selected;
                 $.ajax({
-                    url : this.baseUrl+"repository/addRepository",
+                    url : this.baseUrl+"api/repository/addRepository",
                     type : "post",
                     dataType : "JSON",
                     headers:{'Content-Type':'application/json;charset=utf8'},

+ 1 - 1
resources/views/maintenance/containerManage/create.blade.php

@@ -145,7 +145,7 @@
                     if (env === 'local') {
                         url = 'http://127.0.0.1:8112'
                     } else if (env === 'production') {
-                        url = 'https://swms.baoshi56.com'
+                        url = 'https://api.baoshi56.com'
                     }
                     return url;
                 },

+ 1 - 1
resources/views/maintenance/containerManage/index.blade.php

@@ -206,7 +206,7 @@
                     if (env === 'local') {
                         url = 'http://127.0.0.1:8112'
                     } else if (env === 'production') {
-                        url = 'https://swms.baoshi56.com'
+                        url = 'https://api.baoshi56.com'
                     }
                     return url;
                 },

+ 910 - 0
resources/views/order/index/batchWorkOrder/index.blade.php

@@ -0,0 +1,910 @@
+@extends("layouts.app")
+@section('title','批量创建工单')
+@section('head')
+@endsection
+
+@section("content")
+    <div class="container mt-3 d-none" 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>
+            <div class="btn-group" role="group" aria-label="工单类型">
+                <button type="button" v-for="item in issueTypes" class="btn"
+                        :class="issueType === item.name ? 'btn-info' : 'btn-secondary'"
+                        @click="issueType = item.name">@{{ item.name }}</button>
+            </div>
+        </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 class="">订单:</label>
+                    <label class="text-dark" v-text="item.order_no"></label>
+                </div>
+                <div class="form-row mb-2">
+                    <label class="">破损商品价格:</label>
+                    <div class="col-sm-4">
+                        <input type="number" class="form-control form-control-sm" v-model="item.price">
+                    </div>
+                </div>
+                <div class="damage-table form-row form-group">
+                    <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>
+                            <th v-text="commodity.abnormal_type"></th>
+                            <td v-text="commodity.sku_name"></td>
+                            <td v-text="commodity.amount"></td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="commodity.abnormal_amount" @change="computerPrice(item)">
+                            </td>
+                            <td>
+                                <input type="number" class="form-control form-control-sm"
+                                       v-model="commodity.price" @change="computerPrice(item)">
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <div class="form-row">
+                    <div class="col-sm-4">
+                        <label class="text-dark"><span class="text-danger">*</span>外包装图片</label>
+                        <div class="h-auto border border-secondary bg-white rounded"
+                             style="min-height: 100px"
+                             contenteditable="true"
+                             @paste="pasteImage($event,item.packageImages)">
+                            <div v-for="(image,i) in  item.packageImages"
+                                 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.packageImages)">取消
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-4">
+                        <label class="text-dark"><span class="text-danger">*</span>内物破损图</label>
+                        <div class="h-auto border border-secondary bg-white rounded"
+                             style="min-height: 100px"
+                             contenteditable="true"
+                             @paste="pasteImage($event,item.commodityImages)">
+                            <div v-for="(image,i) in  item.commodityImages"
+                                 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.commodityImages)">取消
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-4">
+                        <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
+                        <div class="h-auto border border-secondary bg-white rounded"
+                             style="min-height: 100px"
+                             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();
+                    } else if(val==="拦截"){
+                        this.getIntercept();
+                    }
+                }
+            },
+            mounted() {
+                $("#batch_container").removeClass("d-none")
+            },
+            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()) {
+                            return false;
+                        }
+                    } else if (issueType === "错漏发") {
+                        if (!this.checkMistakes()) {
+                            return false;
+                        }
+                    } else if (issueType === "快递异常") {
+                        if (!this.checkExpressAbnormal()) {
+                            return false;
+                        }
+                    } else if (issueType === "破损") {
+                        if (!this.checkDamage()) {
+                            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()
+                    } else if (issueType === "破损") {
+                        this.damage();
+                    }
+                },
+                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} = this;
+                    let data = {
+                        logistic_numbers: logisticNumbers,
+                        data: infoChange,
+                    };
+                    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);
+                    });
+
+                },
+                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);
+                        })
+                    });
+                },
+                damage() {
+                    let {damages, remark} = this;
+                    let message = '';
+                    this.waitingTempTip("处理中");
+                    for (let i = 0; i < damages.length; i++) {
+                        let fromData = new FormData();
+                        let damage = damages[i];
+                        let price = damage.price;
+                        let commodities = damage.commodities ? damage.commodities : [];
+                        fromData.append('order_no', damage.order_no);
+                        fromData.append('price', price);
+                        fromData.append('remark', remark);
+                        let packageImages = this.getImages(damage.packageImages ? damage.packageImages : []);
+                        this.setFormDataImagePrefix(fromData, 'packageImages', packageImages);
+                        let dealImages = this.getImages(damage.dealImages ? damage.dealImages : []);
+                        this.setFormDataImagePrefix(fromData, 'dealImages', dealImages);
+                        let commodityImages = this.getImages(damage.commodityImages ? damage.commodityImages : []);
+                        this.setFormDataImagePrefix(fromData, 'commodityImages', commodityImages);
+                        commodities.filter(item=>{
+                            return Number(item.abnormal_amount) !== 0;
+                        }).forEach(e => {
+                            fromData.append('commodities[]', JSON.stringify(e));
+                        });
+                        this.syncDamage(fromData).then(res => {
+                            if (i === (damages.length - 1)) {
+                                this.cancelWaitingTempTip();
+                                this.cancelSubData();
+                            }
+                            this.successTempTip(`${damage.order_no}创建完成`);
+                        }).catch(err => {
+                            message += err + '\\n';
+                        });
+                    }
+                },
+                syncDamage(data) {
+                    let url = "{{route('workOrder.damage.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);
+                        })
+                    });
+                },
+                getIntercept(){
+                    let url = '{{route('workOrder.intercept.checkLogisticNumberApi')}}';
+                    let data = {
+                        'logistic_numbers': this.logisticNumbers,
+                    };
+                    axios.post(url, data).then(res => {
+                        if (res.data.success) {
+                            if (res.data.data) {
+                                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);
+                    });
+
+                },
+                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) {
+                            res.data.data.forEach(item => {
+                                item.commodities.forEach(i => {
+                                    i.abnormal_type = "破损";
+                                    i.abnormal_amount = i.amount;
+                                    i.price = 0;
+                                });
+                                item.commodityImages = [];
+                                item.dealImages = [];
+                                item.packageImages = [];
+                                item.price = 0;
+                            })
+                            this.damages = res.data.data;
+                        } else {
+                            this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
+                        }
+                    }).catch(err => {
+                        this.errorTempTip(err);
+                    });
+                },
+                computerPrice(item) {
+                    let {commodities} = item;
+                    item.price = commodities.map(item => {
+                        let {price, abnormal_amount} = item;
+                        return price * abnormal_amount;
+                    }).reduce((perv, next) => {
+                        return perv + next
+                    });
+                },
+                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 = [];
+                    this.damages = [];
+                },
+                checkInfoChange() {
+                    let {infoChange} = this;
+                    if(infoChange.length === 0){
+                        this.errorTempTip("请检查信息");
+                        return false;
+                    }
+                    for (let i = 0; i < infoChange.length; i++) {
+                        let info = infoChange[i];
+                        let {remark} = info;
+                        if(remark == null || remark === "" || remark.trim().length === 0){
+                            this.errorTempTip("收方信息未必填项");
+                            return false;
+                        }
+                    }
+                    return true;
+                },
+                checkMistakes() {
+                    let {mistakes,remark} = this;
+                    if (mistakes.length === 0) {
+                        this.errorTempTip("请校验提交的商品信息是否为勾选")
+                        return false;
+                    }
+                    if(remark == null || remark === "" || remark.trim().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,remark} = this;
+                    if (expressAbnormalData.length === 0) {
+                        this.errorTempTip("提交参数异常!");
+                        return false;
+                    }
+                    if(remark == null || remark === "" || remark.trim().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;
+                        }
+                    }
+                    @if(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') )
+
+                    @elseif(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑'))
+                        for (let i = 0; i < expressAbnormalData.length; i++) {
+                            let data = expressAbnormalData[i];
+                            let selectCount = data.dealImages.filter(item => item.select).length;
+                            if (selectCount === 0) {
+                                this.errorTempTip(`未上传破损图片 订单:${data.code}!`);
+                                return false;
+                            }
+                        }
+                    @endif
+                    return true;
+                },
+                checkDamage() {
+                    let {damages,remark} = this;
+                    if(remark == null || remark === "" || remark.trim().length === 0){
+                        this.errorTempTip("问题描述为必填项");
+                        return false;
+                    }
+                    for (let i = 0; i < damages.length; i++) {
+                        let damage = damages[i];
+                        let {commodities,order_no} = damage;
+                        if(commodities.length === 0){
+                            this.errorTempTip(`订单${order_no}无商品详情`);
+                            return false;
+                        }
+                        let count =  commodities.filter(item=>{
+                            return Number(item.abnormal_amount) === 0;
+                        }).length;
+                        if(count === commodities.length){
+                            this.errorTempTip(`${order_no}未填写破损数量`);
+                            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

+ 1 - 1
resources/views/order/index/delivering.blade.php

@@ -554,7 +554,7 @@
                             type: 'select',
                             tip: '是否冻结冻结',
                             placeholder: '是否冻结',
-                            data: [{name: 'H', value: '是'}, {name: '', value: '否'}]
+                            data: [{name: 'H', value: '是'}, {name: 'N', value: '否'}]
                         },
                         {name: 'checktime_start', type: 'time', tip: ['选择显示复核时间的起始日期', "选择显示复核时间的起始时间"]},
                         {name: 'checktime_end', type: 'time', tip: ['选择显示复核时间的结束日期', '选择显示复核时间的结束时间']},

+ 25 - 19
resources/views/order/workOrder/_rejected_item_equals_order_commodity.blade.php

@@ -1,37 +1,43 @@
 <el-dialog :visible.sync="dialogCommoditiesEqualsVisible" width="75%">
+    <h4 class="text-center">商品比较</h4>
     <table class="table table-bordered table-sm">
-        <tr class="text-center">
-           <th colspan="3" class="bg-light-info" style="width: 600px">
-               订单商品信息
-           </th>
-           <th colspan="3" class="bg-light-khaki" style="width: 600px">
-               退回商品信息
-           </th>
-        </tr>
         <tr>
-            <th class="bg-light-info">商品条码</th>
-            <th class="bg-light-info">商品名</th>
-            <th class="bg-light-info">数量</th>
-            <th class="bg-light-khaki">商品条码</th>
-            <th class="bg-light-khaki">商品名</th>
-            <th class="bg-light-khaki">数量</th>
+            <th class="bg-light-info">订单商品名</th>
+            <th class="bg-light-info">订单商品条码</th>
+
+            <th class="bg-light-khaki">退货商品名</th>
+            <th class="bg-light-khaki">退货商品条码</th>
+
+            <th class="bg-light-info">订单数量</th>
+            <th class="bg-light-info">退回数量</th>
+
+            <th class="bg-light-info">状态</th>
         </tr>
         <tr v-for="item in commodityEqualsMap">
-            <td class="bg-light-info" v-text="item.order_commodity_sku"></td>
             <td class="bg-light-info" v-text="item.order_commodity_name"></td>
-            <td class="bg-light-info" v-text="item.order_commodity_amount"></td>
-            <td class="bg-light-khaki" v-text="item.rejected_item_sku"></td>
+            <td class="bg-light-info" v-text="item.order_commodity_sku"></td>
+
             <td class="bg-light-khaki" v-text="item.rejected_item_name"></td>
-            <td class="bg-light-khaki">
+            <td class="bg-light-khaki" v-text="item.rejected_item_sku"></td>
+
+            <td class="bg-light-info" v-text="item.order_commodity_amount"></td>
+
+            <td class="bg-light-info">
                 <div v-for="item_quality_label in item.rejected_item_quality_label">
                     <span class="badge badge-primary"
                         v-show="item_quality_label.quality_label === '正品'" v-text="'正品数量:' + item_quality_label.amount"></span>
                     <span class="badge badge-danger"
-                        v-show="item_quality_label.quality_label === '次'" v-text="'次品数量' + item_quality_label.amount"></span>
+                        v-show="item_quality_label.quality_label === '次'" v-text="'次品数量' + item_quality_label.amount"></span>
                     <span class="badge badge-secondary"
                         v-show="item_quality_label.quality_label === '未知'" v-text="'未知数量' + item_quality_label.amount"></span>
                 </div>
             </td>
+            <td class="bg-light-info">
+                <span v-text="item.status" v-show="item.status === '全部退回'"></span>
+                <span v-text="item.status" v-show="item.status === '部分退回'" class="text-danger"></span>
+                <span v-text="item.status" v-show="item.status === '差异退回'" class="text-danger"></span>
+                <span v-text="item.status" v-show="item.status === '超量退回'" class="text-danger"></span>
+            </td>
         </tr>
     </table>
     <div slot="footer" class="dialog-footer">

+ 532 - 177
resources/views/order/workOrder/index.blade.php

@@ -92,16 +92,25 @@
                                     <input id="all" type="checkbox" @click="checkAll($event)"/>
                                 </label>
                             </th>
-                            <th style="min-width: 120px">工单号</th>
-                            <th style="min-width: 120px">操作</th>
-                            <th style="min-width: 200px">创建时间</th>
-                            <th style="min-width: 120px">工单类型</th>
-                            <th style="min-width: 200px">当前进度</th>
-                            <th style="min-width: 120px">客户</th>
-                            <th style="min-width: 200px">店铺名称</th>
-                            <th style="min-width: 200px">客户单号</th>
-                            <th style="min-width: 120px">承运人</th>
+                            <th style="min-width: 80px">工单号</th>
+                            <th style="min-width: 100px">操作</th>
+                            <th style="min-width: 100px">创建时间</th>
+                            <th style="min-width: 100px">工单类型</th>
+                            <th style="min-width: 160px">当前进度</th>
+                            <th style="min-width: 90px">客户</th>
+                            <th style="min-width: 160px">店铺名称</th>
+                            <th style="min-width: 180px">客户单号</th>
+                            <th style="min-width: 100px">承运人</th>
                             <th style="min-width: 120px">快递单号</th>
+                            <th style="min-width: 35px;max-width: 35px" v-text="receivingInfo ? '隐藏' :'展开' ">展开</th>
+                            <template v-if="receivingInfo">
+                                <th style="max-width: 120px">收货人名称</th>
+                                <th style="min-width: 120px">收货人电话</th>
+                                <th style="min-width: 120px">省</th>
+                                <th style="min-width: 120px">市</th>
+                                <th style="min-width: 120px">区</th>
+                                <th style="min-width: 120px">收货人地址</th>
+                            </template>
                             <th style="min-width: 120px">当前处理人</th>
                             <th style="min-width: 150px">情况说明</th>
                             <th style="min-width: 50px;max-width: 50px" v-text="hideRejectedBills ? '隐藏' :'展开' ">展开</th>
@@ -284,6 +293,7 @@
                                 </td>
                                 <td>
                                     <span v-text="item['last_handler_name'] + ':' + item.process_progress"></span>
+                                    <br/>
                                     <span class="badge  badge-warning" v-if="'快递异常' === item.issue_type_name"
                                           v-text="item.type"></span>
                                 </td>
@@ -296,6 +306,31 @@
                                           v-for="logistic_number in item.logistic_numbers"
                                           v-text="logistic_number"></span>
                                 </td>
+                                <td class="p-0 m-0" style="width:30px;" v-if="i===0"
+                                    :rowspan="workOrders.length">
+                                <span class="btn"
+                                      id="rejected_bill_btn"
+                                      style="max-width: 50px"
+                                      :class="receivingInfo ? 'btn-outline-info':'btn-outline-secondary'"
+                                      @click="toggleReceivingInfo()" :style="{'min-height':toggleBtnHeight+'px'}"
+                                      v-text="receivingInfo ? '隐藏收货信息' : '展开收货信息'">
+                                </span>
+                                </td>
+                                <template v-if="receivingInfo">
+                                    <td  class="text-muted text-wrap text-letter"
+                                         >
+                                        <div class="text-overflow-warp-200 warp-min-200" v-text="item.consignee_name">
+                                        </div>
+                                    </td>
+                                    <td class="text-muted text-wrap text-letter">
+                                        <div class="text-overflow-warp-200 warp-min-200"
+                                             v-text="item.consignee_phone"></div>
+                                    </td>
+                                    <td v-text="item.province"></td>
+                                    <td v-text="item.city"></td>
+                                    <td v-text="item.district"></td>
+                                    <td v-text="item.address"></td>
+                                </template>
                                 <td v-text="item.status"></td>
                                 <td v-text="item.result_explain ? item.result_explain: item.remark"></td>
                                 <td class="p-0 m-0 w-50" style="width:30px;" v-if="i===0"
@@ -405,6 +440,7 @@
                                         <select class="form-control form-control-sm"
                                                 v-model="item.logistic_express_remission"
                                                 @change="changeWorkOrderInfo(item,'logistic_express_remission',$event)">
+                                            <option value></option>
                                             <option v-for="type in workOrderRemissionType" :value="type.name"
                                                     v-text="type.name"></option>
                                         </select>
@@ -419,6 +455,7 @@
                                             class="form-control form-control-sm"
                                             v-model="item.bao_shi_express_remission"
                                             @change="changeWorkOrderInfo(item,'bao_shi_express_remission',$event)">
+                                            <option value></option>
                                             <option v-for="type in workOrderRemissionType" :value="type.name"
                                                     v-text="type.name"></option>
                                         </select>
@@ -773,6 +810,7 @@
                 ],
                 commodityEqualsMap: [],
                 hideRejectedBills: false,
+                receivingInfo: false,
                 tableHeader: null,
                 toggleBtnHeight: 0,
                 batchOthers: {
@@ -807,163 +845,430 @@
                     name: '92',
                     value: '近三月'
                 }, {name: '183', value: '近半年'}, {name: '366', value: '近一年'}, {name: '0', value: '不限'},];
-                let data = [[
-                    {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
-                    {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
-                    {
-                        name: 'logistic',
-                        type: 'select_multiple_select',
-                        data: this.logistics,
-                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
-                        placeholder: ['承运商', '定位或多选承运商']
-                    },
-                        @can('订单管理-订单问题件生成')
-                    {
-                        name: 'owner',
-                        type: 'select_multiple_select',
-                        data: this.owners,
-                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的商家'],
-                        placeholder: ['商家', '定位或多选商家']
-                    },
-                        @endcan
-                    {
-                        name: 'order_issue_type',
-                        type: 'select_multiple_select',
-                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的问题件类型'],
-                        placeholder: ['问题件类型', '定位或多选问题件类型'],
-                        data: this.orderIssueTypes
-                    },
-                    {
-                        name: 'user_work_group_id', type: 'select_multiple_select',
-                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的仓库责任方'],
-                        placeholder: ['仓库责任方', '定位或多选仓库责任方'], data: this.userWorkgroup
-                    },
-                    {
-                        name: 'status', type: 'select_multiple_select',
-                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的工单当前处理人'],
-                        placeholder: ['工单当前处理人', '定位或多选工单当前处理人'],
-                        data: [{name: '宝时处理', value: '宝时处理'},
-                            {name: '货主处理', value: '货主处理'},
-                            {name: '承运商处理', value: '承运商处理'},]
-                    },
-                ], [
-                    {name: 'review_at_start', type: 'time', tip: ['终审开始日期', '时间']},
-                    {name: 'review_at_end', type: 'time', tip: ['终审结束日期', '时间']},
-                    {
-                        name: 'logistic_number', type: 'input', placeholder: '快递单号'
-                    },
-                    {name: 'client_code', type: 'input', placeholder: '客户订单号'},
-                    {name: 'creator', type: 'input', placeholder: '创建人'},
-                    {
-                        name: 'process_progress', type: 'select', placeholder: '当前进度',
-                        data: [
-                            {name: '商家创建', value: '商家创建'},
-                            {name: '宝时创建', value: '宝时创建'},
-                            {name: '承运商处理中', value: '承运商处理中'},
-                            {name: '成功已退回,不赔偿', value: '成功已退回,不赔偿'},
-                            {name: '拦截在途丢件,赔偿', value: '拦截在途丢件,赔偿'},
-                            {name: '无法拦截', value: '无法拦截'},
-                            {name: '已签收', value: '已签收'},
-                            {name: '已退回', value: '已退回'},
-                            {name: '更改成功', value: '更改成功'},
-                            {name: '更改失败', value: '更改失败'},
-                            {name: '丢件赔偿', value: '丢件赔偿'},
-                            {name: '签收成功', value: '签收成功'},
-                            {name: '已补发', value: '已补发'},
-                            {name: '已入库', value: '已入库'},
-                            {name: '全部赔偿', value: '全部赔偿'},
-                            {name: '部分赔偿', value: '部分赔偿'},
-                            {name: '不赔偿', value: '不赔偿'},
-                            {name: '拦截失败', value: '拦截失败'},
-                            {name: '拦截退回中', value: '拦截退回中'},
-                            {name: '已处理', value: '已处理'},
-                            {name: '无法更改', value: '无法更改'},
-                            {name: '已处理', value: '已处理'},
-                            {name: '已拦截', value: '已拦截'},
-                            {name: '核实全部破损', value: '核实全部破损'},
-                            {name: '核实部分破损', value: '核实部分破损'},
-                            {name: '核实未破损', value: '核实未破损'},
-                            {name: '正常派送', value: '正常派送'},
-                            {name: '无法取消拦截', value: '无法取消拦截'},
-                            {name: '宝时创建', value: '宝时创建'},
-                            {name: '待终审', value: '待终审'},
-                            {name: '终审完成', value: '终审完成'},
-                        ]
-                    },
-                    {name: 'is_end', type: 'checkbox', tip: '是否已拦截', data: [{name: 'ture', value: '已完成'}]},
-                ], [
-                    {name: 'logistic_indemnity_money', type: 'input', placeholder: '承运商赔偿金额'},
-                    {
-                        name: 'logistic_express_remission',
-                        type: 'select',
-                        placeholder: '承运商快递减免',
-                        data: this.workOrderRemissionType
-                    },
-                    {name: 'bao_shi_indemnity_money', type: 'input', placeholder: '宝时赔偿金额'},
-                    {
-                        name: 'bao_shi_express_remission',
-                        type: 'select',
-                        placeholder: '宝时快递减免',
-                        data: this.workOrderRemissionType
-                    },
+                let data = [];
+                @if(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑'))
+                    data = [
+                    [
+                        // 客户
+                        {
+                            name: 'owner',
+                            type: 'select_multiple_select',
+                            data: this.owners,
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的商家'],
+                            placeholder: ['商家', '定位或多选商家']
+                        },
+                        // 创建时间
+                        {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
+                        {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
+                        // 问题件类型
+                        {
+                            name: 'order_issue_type',
+                            type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的问题件类型'],
+                            placeholder: ['问题件类型', '定位或多选问题件类型'],
+                            data: this.orderIssueTypes
+                        },
+                        // 当前进度
+                        {
+                            name: 'process_progress', type: 'select', placeholder: '当前进度',
+                            data: [
+                                {name: '商家创建', value: '商家创建'},
+                                {name: '宝时创建', value: '宝时创建'},
+                                {name: '承运商处理中', value: '承运商处理中'},
+                                {name: '成功已退回,不赔偿', value: '成功已退回,不赔偿'},
+                                {name: '拦截在途丢件,赔偿', value: '拦截在途丢件,赔偿'},
+                                {name: '无法拦截', value: '无法拦截'},
+                                {name: '已签收', value: '已签收'},
+                                {name: '已退回', value: '已退回'},
+                                {name: '更改成功', value: '更改成功'},
+                                {name: '更改失败', value: '更改失败'},
+                                {name: '丢件赔偿', value: '丢件赔偿'},
+                                {name: '签收成功', value: '签收成功'},
+                                {name: '已补发', value: '已补发'},
+                                {name: '已入库', value: '已入库'},
+                                {name: '全部赔偿', value: '全部赔偿'},
+                                {name: '部分赔偿', value: '部分赔偿'},
+                                {name: '不赔偿', value: '不赔偿'},
+                                {name: '拦截失败', value: '拦截失败'},
+                                {name: '拦截退回中', value: '拦截退回中'},
+                                {name: '已处理', value: '已处理'},
+                                {name: '无法更改', value: '无法更改'},
+                                {name: '已处理', value: '已处理'},
+                                {name: '已拦截', value: '已拦截'},
+                                {name: '核实全部破损', value: '核实全部破损'},
+                                {name: '核实部分破损', value: '核实部分破损'},
+                                {name: '核实未破损', value: '核实未破损'},
+                                {name: '正常派送', value: '正常派送'},
+                                {name: '无法取消拦截', value: '无法取消拦截'},
+                                {name: '宝时创建', value: '宝时创建'},
+                                {name: '待终审', value: '待终审'},
+                                {name: '终审完成', value: '终审完成'},
+                            ]
+                        },
+                        // 商铺
+                        {name: 'shop_name', type: 'input', placeholder: '商铺名'},
+                        // 客户订单号
+                        {name: 'client_code', type: 'input', placeholder: '客户订单号'},
+                        //
+                    ],
+                    [
+                        // 承运人
+                        {
+                            name: 'logistic',
+                            type: 'select_multiple_select',
+                            data: this.logistics,
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
+                            placeholder: ['承运商', '定位或多选承运商']
+                        },
+                        // 快递单号
+                        {
+                            name: 'logistic_number', type: 'input', placeholder: '快递单号'
+                        },
+                        // 当前处理人
+                        {
+                            name: 'status', type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的工单当前处理人'],
+                            placeholder: ['工单当前处理人', '定位或多选工单当前处理人'],
+                            data: [{name: '宝时处理', value: '宝时处理'},
+                                {name: '货主处理', value: '货主处理'},
+                                {name: '承运商处理', value: '承运商处理'},]
+                        },
+                        // 创建人
+                        {name: 'creator', type: 'input', placeholder: '创建人'},
+                        // 标记
+                        {
+                            name: 'tags', type: 'select', placeholder: '`新`,`滞`,`无`标签筛选',
+                            data: [
+                                {name: 3, value: '新'},
+                                {name: 2, value: '滞'},
+                                {name: 1, value: '无'},
+                            ],
+                        },
+                        // 工单处理日志
+                        {name: 'work_order_process_log', type: 'input', placeholder: '工单处理日志'},
+                        // 问题件处理日志
+                        {name: 'order_issue_log', type: 'input', placeholder: '问题件处理日志'},
+                    ],
+                    [
+                        // 承运商赔偿金额
+                        {name: 'logistic_indemnity_money', type: 'input', placeholder: '承运商赔偿金额'},
+                        // 承运商快递减免
+                        {
+                            name: 'logistic_express_remission',
+                            type: 'select',
+                            placeholder: '承运商快递减免',
+                            data: this.workOrderRemissionType
+                        },
+                        // 宝时赔偿金额
+                        {name: 'bao_shi_indemnity_money', type: 'input', placeholder: '宝时赔偿金额'},
+                        // 宝时快递减免
+                        {
+                            name: 'bao_shi_express_remission',
+                            type: 'select',
+                            placeholder: '宝时快递减免',
+                            data: this.workOrderRemissionType
+                        },
+                        // 仓库责任方
+                        {
+                            name: 'user_work_group_id', type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的仓库责任方'],
+                            placeholder: ['仓库责任方', '定位或多选仓库责任方'], data: this.userWorkgroup
+                        },
+                        // 项目责任方
+                        {name: 'user_owner_group_id', type: 'select', placeholder: '项目责任方', data: this.userOwnerGroup},
+                    ],
+                    [
+                        // 退回标记
+                        {
+                            name: 'custom_rejected_status', type: 'select', placeholder: '退回标记',
+                            data: [
+                                {name: '无', value: '无'},
+                                {name: '待退回', value: '待退回'},
+                                {name: '退回中', value: '退回中'},
+                            ]
+                        },
+                        // 退回状态
+                        {name: 'rejecting_status', type: 'select', placeholder: '退回状态', data: this.rejectingStatus},
+                        // 是否问题件
+                        {
+                            name: 'is_issue_order',
+                            type: 'select',
+                            placeholder: '问题件',
+                            data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}]
+                        },
+                        // 处理结果
+                        {
+                            name: ['log_content', 'addtime'],
+                            type: 'input_select',
+                            tip: ['处理结果:前或后加 百分号为单个模糊搜索,否则为多条件精确搜索', '查询范围越短,搜索速度越快'],
+                            placeholder: ['处理结果', ''],
+                            data: log_content_range,
+                            rules: [{
+                                son: {
+                                    addtime: {
+                                        default: '31',
+                                        required_without_all_if: ['created_at_start', 'created_at_end']
+                                    }
+                                }
+                            }],
+                        },
+                        // 已完成
+                        {name: 'is_end', type: 'checkbox', tip: '是否已拦截', data: [{name: 'ture', value: '已完成'}]},
+                        // 结束时间
+                        {name: 'review_at_start', type: 'time', tip: ['终审开始日期', '时间']},
+                        {name: 'review_at_end', type: 'time', tip: ['终审结束日期', '时间']},
+                    ],
+                    [
+                        // // 问题件
+                        // {
+                        //     name: 'is_issue_order',
+                        //     type: 'select',
+                        //     placeholder: '问题件',
+                        //     data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}]
+                        // },
+                    ]
+                ];
+                @elseif(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-货主编辑'))
+                    data = [
+                    [
+                        // 创建时间
+                        {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
+                        {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
+                        //
+                        {
+                            name: 'order_issue_type',
+                            type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的问题件类型'],
+                            placeholder: ['问题件类型', '定位或多选问题件类型'],
+                            data: this.orderIssueTypes
+                        },
+                        // 当前进度
+                        {
+                            name: 'process_progress', type: 'select', placeholder: '当前进度',
+                            data: [
+                                {name: '商家创建', value: '商家创建'},
+                                {name: '宝时创建', value: '宝时创建'},
+                                {name: '承运商处理中', value: '承运商处理中'},
+                                {name: '成功已退回,不赔偿', value: '成功已退回,不赔偿'},
+                                {name: '拦截在途丢件,赔偿', value: '拦截在途丢件,赔偿'},
+                                {name: '无法拦截', value: '无法拦截'},
+                                {name: '已签收', value: '已签收'},
+                                {name: '已退回', value: '已退回'},
+                                {name: '更改成功', value: '更改成功'},
+                                {name: '更改失败', value: '更改失败'},
+                                {name: '丢件赔偿', value: '丢件赔偿'},
+                                {name: '签收成功', value: '签收成功'},
+                                {name: '已补发', value: '已补发'},
+                                {name: '已入库', value: '已入库'},
+                                {name: '全部赔偿', value: '全部赔偿'},
+                                {name: '部分赔偿', value: '部分赔偿'},
+                                {name: '不赔偿', value: '不赔偿'},
+                                {name: '拦截失败', value: '拦截失败'},
+                                {name: '拦截退回中', value: '拦截退回中'},
+                                {name: '已处理', value: '已处理'},
+                                {name: '无法更改', value: '无法更改'},
+                                {name: '已处理', value: '已处理'},
+                                {name: '已拦截', value: '已拦截'},
+                                {name: '核实全部破损', value: '核实全部破损'},
+                                {name: '核实部分破损', value: '核实部分破损'},
+                                {name: '核实未破损', value: '核实未破损'},
+                                {name: '正常派送', value: '正常派送'},
+                                {name: '无法取消拦截', value: '无法取消拦截'},
+                                {name: '宝时创建', value: '宝时创建'},
+                                {name: '待终审', value: '待终审'},
+                                {name: '终审完成', value: '终审完成'},
+                            ]
+                        },
+                        // 商铺
+                        {name: 'shop_name', type: 'input', placeholder: '商铺名'},
+                        // 客户订单号
+                        {name: 'client_code', type: 'input', placeholder: '客户订单号'},
 
-                    {name: 'user_owner_group_id', type: 'select', placeholder: '项目责任方', data: this.userOwnerGroup},
-                    {name: 'rejecting_status', type: 'select', placeholder: '退回状态', data: this.rejectingStatus},
-                    {
-                        name: 'is_issue_order',
-                        type: 'select',
-                        placeholder: '问题件',
-                        data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}]
-                    },
-                ], [
-                    {name: 'order_issue_log', type: 'input', placeholder: '问题件处理日志'},
-                    {
-                        name: ['log_content', 'addtime'],
-                        type: 'input_select',
-                        tip: ['处理结果:前或后加 百分号为单个模糊搜索,否则为多条件精确搜索', '查询范围越短,搜索速度越快'],
-                        placeholder: ['处理结果', ''],
-                        data: log_content_range,
-                        rules: [{
-                            son: {
-                                addtime: {
-                                    default: '31',
-                                    required_without_all_if: ['created_at_start', 'created_at_end']
+                    ], [
+                        // 承运商
+                        {
+                            name: 'logistic',
+                            type: 'select_multiple_select',
+                            data: this.logistics,
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
+                            placeholder: ['承运商', '定位或多选承运商']
+                        },
+                        // 快递单号
+                        {name: 'logistic_number', type: 'input', placeholder: '快递单号'},
+                        // 当前处理人
+                        {
+                            name: 'status', type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的工单当前处理人'],
+                            placeholder: ['工单当前处理人', '定位或多选工单当前处理人'],
+                            data: [{name: '宝时处理', value: '宝时处理'},
+                                {name: '货主处理', value: '货主处理'},
+                                {name: '承运商处理', value: '承运商处理'},]
+                        },
+                        // 创建人
+                        {name: 'creator', type: 'input', placeholder: '创建人'},
+                        {name: 'work_order_process_log', type: 'input', placeholder: '工单处理日志'},
+                    ],
+                ];
+                @elseif(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-承运商编辑'))
+                    data = [
+                    [
+                        {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
+                        {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
+                        {
+                            name: 'logistic',
+                            type: 'select_multiple_select',
+                            data: this.logistics,
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
+                            placeholder: ['承运商', '定位或多选承运商']
+                        },
+                            @can('订单管理-订单问题件生成')
+                        {
+                            name: 'owner',
+                            type: 'select_multiple_select',
+                            data: this.owners,
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的商家'],
+                            placeholder: ['商家', '定位或多选商家']
+                        },
+                            @endcan
+                        {
+                            name: 'order_issue_type',
+                            type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的问题件类型'],
+                            placeholder: ['问题件类型', '定位或多选问题件类型'],
+                            data: this.orderIssueTypes
+                        },
+                        {
+                            name: 'user_work_group_id', type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的仓库责任方'],
+                            placeholder: ['仓库责任方', '定位或多选仓库责任方'], data: this.userWorkgroup
+                        },
+                        {
+                            name: 'status', type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的工单当前处理人'],
+                            placeholder: ['工单当前处理人', '定位或多选工单当前处理人'],
+                            data: [{name: '宝时处理', value: '宝时处理'},
+                                {name: '货主处理', value: '货主处理'},
+                                {name: '承运商处理', value: '承运商处理'},]
+                        },
+                    ], [
+                        {name: 'review_at_start', type: 'time', tip: ['终审开始日期', '时间']},
+                        {name: 'review_at_end', type: 'time', tip: ['终审结束日期', '时间']},
+                        {
+                            name: 'logistic_number', type: 'input', placeholder: '快递单号'
+                        },
+                        {name: 'client_code', type: 'input', placeholder: '客户订单号'},
+                        {name: 'creator', type: 'input', placeholder: '创建人'},
+                        {
+                            name: 'process_progress', type: 'select', placeholder: '当前进度',
+                            data: [
+                                {name: '商家创建', value: '商家创建'},
+                                {name: '宝时创建', value: '宝时创建'},
+                                {name: '承运商处理中', value: '承运商处理中'},
+                                {name: '成功已退回,不赔偿', value: '成功已退回,不赔偿'},
+                                {name: '拦截在途丢件,赔偿', value: '拦截在途丢件,赔偿'},
+                                {name: '无法拦截', value: '无法拦截'},
+                                {name: '已签收', value: '已签收'},
+                                {name: '已退回', value: '已退回'},
+                                {name: '更改成功', value: '更改成功'},
+                                {name: '更改失败', value: '更改失败'},
+                                {name: '丢件赔偿', value: '丢件赔偿'},
+                                {name: '签收成功', value: '签收成功'},
+                                {name: '已补发', value: '已补发'},
+                                {name: '已入库', value: '已入库'},
+                                {name: '全部赔偿', value: '全部赔偿'},
+                                {name: '部分赔偿', value: '部分赔偿'},
+                                {name: '不赔偿', value: '不赔偿'},
+                                {name: '拦截失败', value: '拦截失败'},
+                                {name: '拦截退回中', value: '拦截退回中'},
+                                {name: '已处理', value: '已处理'},
+                                {name: '无法更改', value: '无法更改'},
+                                {name: '已处理', value: '已处理'},
+                                {name: '已拦截', value: '已拦截'},
+                                {name: '核实全部破损', value: '核实全部破损'},
+                                {name: '核实部分破损', value: '核实部分破损'},
+                                {name: '核实未破损', value: '核实未破损'},
+                                {name: '正常派送', value: '正常派送'},
+                                {name: '无法取消拦截', value: '无法取消拦截'},
+                                {name: '宝时创建', value: '宝时创建'},
+                                {name: '待终审', value: '待终审'},
+                                {name: '终审完成', value: '终审完成'},
+                            ]
+                        },
+                        {name: 'is_end', type: 'checkbox', tip: '是否已拦截', data: [{name: 'ture', value: '已完成'}]},
+                    ], [
+                        {name: 'logistic_indemnity_money', type: 'input', placeholder: '承运商赔偿金额'},
+                        {
+                            name: 'logistic_express_remission',
+                            type: 'select',
+                            placeholder: '承运商快递减免',
+                            data: this.workOrderRemissionType
+                        },
+                        {name: 'bao_shi_indemnity_money', type: 'input', placeholder: '宝时赔偿金额'},
+                        {
+                            name: 'bao_shi_express_remission',
+                            type: 'select',
+                            placeholder: '宝时快递减免',
+                            data: this.workOrderRemissionType
+                        },
+
+                        {name: 'user_owner_group_id', type: 'select', placeholder: '项目责任方', data: this.userOwnerGroup},
+                        {name: 'rejecting_status', type: 'select', placeholder: '退回状态', data: this.rejectingStatus},
+                        {
+                            name: 'is_issue_order',
+                            type: 'select',
+                            placeholder: '问题件',
+                            data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}]
+                        },
+                    ], [
+                        {name: 'order_issue_log', type: 'input', placeholder: '问题件处理日志'},
+                        {
+                            name: ['log_content', 'addtime'],
+                            type: 'input_select',
+                            tip: ['处理结果:前或后加 百分号为单个模糊搜索,否则为多条件精确搜索', '查询范围越短,搜索速度越快'],
+                            placeholder: ['处理结果', ''],
+                            data: log_content_range,
+                            rules: [{
+                                son: {
+                                    addtime: {
+                                        default: '31',
+                                        required_without_all_if: ['created_at_start', 'created_at_end']
+                                    }
                                 }
-                            }
-                        }],
-                    },
-                    {
-                        name: 'tags', type: 'select', placeholder: '`新`,`滞`,`无`标签筛选',
-                        data: [
-                            {name: 3, value: '新'},
-                            {name: 2, value: '滞'},
-                            {name: 1, value: '无'},
-                        ],
-                    },
-                    {name: 'shop_name', type: 'input', placeholder: '商铺名'},
-                    {name: 'work_order_process_log', type: 'input', placeholder: '工单处理日志'},
-                    {
-                        name: "rejectingStatus", type: 'select', placeholder: '退单状态',
-                        data: [
-                            {name: '无', value: '无'},
-                            {name: '未退回', value: '未退回'},
-                            {name: '全部退回', value: '全部退回'},
-                            {name: '部分退回', value: '部分退回'},
-                            {name: '差异退回', value: '差异退回'},
-                            {name: '超量退回', value: '超量退回'},
-                        ]
-                    }
-                ], [
-                    {
-                        name: 'custom_rejected_status', type: 'select', placeholder: '退回标记',
-                        data: [
-                            {name: '无', value: '无'},
-                            {name: '待退回', value: '待退回'},
-                            {name: '退回中', value: '退回中'},
-                        ]
-                    },
-                ]];
-                this.form = new query({
+                            }],
+                        },
+                        {
+                            name: 'tags', type: 'select', placeholder: '`新`,`滞`,`无`标签筛选',
+                            data: [
+                                {name: 3, value: '新'},
+                                {name: 2, value: '滞'},
+                                {name: 1, value: '无'},
+                            ],
+                        },
+                        {name: 'shop_name', type: 'input', placeholder: '商铺名'},
+                        {name: 'work_order_process_log', type: 'input', placeholder: '工单处理日志'},
+                        {
+                            name: "rejectingStatus", type: 'select', placeholder: '退单状态',
+                            data: [
+                                {name: '无', value: '无'},
+                                {name: '未退回', value: '未退回'},
+                                {name: '全部退回', value: '全部退回'},
+                                {name: '部退回', value: '部退回'},
+                                {name: '差异退回', value: '差异退回'},
+                                {name: '超量退回', value: '超量退回'},
+                            ]
+                        }
+                    ], [
+                        {
+                            name: 'custom_rejected_status', type: 'select', placeholder: '退回标记',
+                            data: [
+                                {name: '无', value: '无'},
+                                {name: '待退回', value: '待退回'},
+                                {name: '退回', value: '退回'},
+                            ]
+                        },
+                    ]];
+                @endif
+                    this.form = new query({
                     el: '#form_div',
                     condition: data,
                     appendDom: "btn",
@@ -1077,6 +1382,12 @@
                     workOrder.owner_name = workOrder.owner ? workOrder.owner.name : '';
                     workOrder.logisitc_name = workOrder.logistic ? workOrder.logistic.name : '';
                     workOrder.order_client_code = workOrder.order ? workOrder.order.client_code : '';
+                    workOrder.consignee_name = workOrder.order ? workOrder.order.consignee_name : '';
+                    workOrder.consignee_phone = workOrder.order ? workOrder.order.consignee_phone : '';
+                    workOrder.province = workOrder.order ? workOrder.order.province : '';
+                    workOrder.city = workOrder.order ? workOrder.order.city : '';
+                    workOrder.district = workOrder.order ? workOrder.order.district : '';
+                    workOrder.address = workOrder.order ? workOrder.order.address : '';
                     workOrder.order_commodities = this.groupOrderPackageCommodities(workOrder);
                     workOrder.is_issue_order = workOrder.order_issue !== null;
                     if (workOrder.order_issue !== null) workOrder.order_issue.log_is_show = 'order_issue' in workOrder;
@@ -1150,7 +1461,7 @@
                             item.issue_type_name = detail.issue_type ? detail.issue_type.name : '';
                             return item;
                         });
-                        commodities.push(...(commodity_items ?commodity_items: []))
+                        commodities.push(...(commodity_items ? commodity_items : []))
                     });
                     return commodities.filter(item => {
                         if (!isCurrent) {
@@ -1536,8 +1847,8 @@
                         if (process_result_info && (
                             process_result_info.indexOf('商家做入库单') >= 0 ||
                             process_result_info.indexOf('商家做出库单') >= 0 ||
-                            process_result_info.indexOf('不入库')  >= 0  ||
-                            process_result_info.indexOf('不出库')  >= 0)) {
+                            process_result_info.indexOf('不入库') >= 0 ||
+                            process_result_info.indexOf('不出库') >= 0)) {
                             isAddRow = true;
                         }
                         if (cur_logistic_number === logistic_number) {
@@ -1887,25 +2198,25 @@
                 getBaoShiEndHandleResult(commodity) {
                     let {process_result} = commodity;
                     let items = [
-                        {process_result: '多发,客户买下', option: ['已完成出库','完成']},
-                        {process_result: '多发,客户退回', option: ['已退回仓库' ]},
+                        {process_result: '多发,客户买下', option: ['已完成出库', '完成']},
+                        {process_result: '多发,客户退回', option: ['已退回仓库']},
                         {process_result: '少发,宝时补发', option: ['宝时补发']},
-                        {process_result: '少发,不补发', option: ['已完成入库','完成']},
+                        {process_result: '少发,不补发', option: ['已完成入库', '完成']},
                         {process_result: '核实未错漏发', option: ['确认未错漏发']},
                     ];
-                    let shift =  items.filter(e => process_result === e.process_result).map(e => e.option).shift() ;
+                    let shift = items.filter(e => process_result === e.process_result).map(e => e.option).shift();
                     return shift ? shift : [];
                 },
                 getOwnerMistakeProcessResultInfo(process_result, item) {
                     let items = [
                         {process_result: "少发,宝时补发", option: ['商家不做单'],},
-                        {process_result: "多发,客户买下", option: ['商家做出库单(物流选自提,宝时不发货)','不出库'],},
+                        {process_result: "多发,客户买下", option: ['商家做出库单(物流选自提,宝时不发货)', '不出库'],},
                         {process_result: "多发,客户退回", option: ['客户自行退回(提供退回单号)', '宝时上门取件(提供寄件信息,地址,联系人,电话)'],},
-                        {process_result: "少发,不补发", option: ['商家做入库单,选择明细和数量','不入库'],},
+                        {process_result: "少发,不补发", option: ['商家做入库单,选择明细和数量', '不入库'],},
                         {process_result: "核实未错漏发", option: ['确认未错漏发'],},
                     ];
                     let shift = items.filter(e => e.process_result === process_result).map(e => e.option).shift();
-                    let options = shift  ? shift : []
+                    let options = shift ? shift : []
                     if (options.length === 0) {
                         item.process_result_info = options[0];
                     }
@@ -2778,12 +3089,12 @@
                                 message = '出库订单号不能为空';
                             } else if ('商家做入库单,选择明细和数量' === e.process_result_info && !e.store_in_amount) {
                                 message = '入库单不能为空';
-                            } else if (['不入库','不出库'].includes(e.process_result_info) && !e.remark){
+                            } else if (['不入库', '不出库'].includes(e.process_result_info) && !e.remark) {
                                 message = '不入库,不出库原因不能为空';
                             }
                         });
                         if (message) return {success: false, message: message};
-                        return {success:true};
+                        return {success: true};
                     } else if ('快递异常' === issue_type_name) {
                         if (is_edit) {
                             let {type, commodities, dealImages} = this.ownerEditWorkOrder;
@@ -3492,7 +3803,7 @@
                             this.successTempTip('处理完成');
                             this.showAddDiv('addWorkOrderProcessLogForm' + work_order_detail_id);
                             document.getElementById('addWorkOrderProcessLogFormInput_' + work_order_detail_id).value = '';
-                            if(tagDoc)tagDoc = false;
+                            if (tagDoc) tagDoc = false;
                             this.$forceUpdate();
                             return;
                         }
@@ -3764,6 +4075,10 @@
                     axios.post(url, data).then(res => {
                         window.tempTip.cancelWaitingTip();
                         if (res.data.success) {
+                            for (const resKey in res.data.data) {
+                                console.log(resKey,res.data.data[resKey]);
+                                this.reckonStatus(res.data.data[resKey]);
+                            }
                             this.commodityEqualsMap = res.data.data;
                             this.dialogCommoditiesEqualsVisible = true;
                             return;
@@ -3786,6 +4101,9 @@
                 toggleRejectedBill() {
                     this.hideRejectedBills = !this.hideRejectedBills;
                 },
+                toggleReceivingInfo() {
+                    this.receivingInfo = !this.receivingInfo;
+                },
                 showBatchCustomRejectedStatus() {
                     if (this.checkData.length === 0) {
                         this.errorTempTip('请勾选需要修改的工单')
@@ -3891,9 +4209,46 @@
                         window.tempTip.cancelWaitingTip()
                         this.errorTempTip(err)
                     })
+                },
+                reckonStatus(item) {
+                    let {
+                        order_commodity_sku,
+                        rejected_item_sku,
+                        order_commodity_amount,
+                        rejected_item_quality_label
+                    } = item;
+                    if (order_commodity_sku == null || order_commodity_amount === '') {
+                        item.status = "差异退回";
+                        return ;
+                    }
+                    for (const key in rejected_item_quality_label) {
+                        let date = rejected_item_quality_label[key];
+                        let amount = Number(date.amount);
+                        let order_amount = Number(order_commodity_amount);
+                        if(key === "正品"){
+                            if( amount === order_amount ){
+                                item.status = "全部退回";
+                            } else if(amount > order_amount){
+                                item.status = "超量退回";
+                            } else {
+                                item.status = "部分退回";
+                            }
+                            return;
+                        } else if(key === "残次"){
+                            item.status = "差异退回";
+                            return;
+                        } else if(key === "未知"){
+                            item.status = "差异退回";
+                            return ;
+                        }
+                    }
+                    if (rejected_item_sku == null || rejected_item_sku === '') {
+                        return item.status = "未退回";
+                    }
 
                 }
             },
+
         });
     </script>
 @endsection

+ 1 - 1
resources/views/rejected/rejectedPushTask/index.blade.php

@@ -652,7 +652,7 @@
                     if (env === 'local') {
                         url = 'http://127.0.0.1:8112'
                     } else if (env === 'production') {
-                        url = 'https://swms.baoshi56.com'
+                        url = 'https://api.baoshi56.com'
                     }
                     return url;
                 },

+ 3 - 214
resources/views/station/monitor/show.blade.php

@@ -9,15 +9,6 @@
                     <div class="col-4 text-center h3 py-2 font-weight-bold text-info position-relative">
                         宝时云仓
                     </div>
-                    <div class="col h3 py-2 text-muted row">
-                        <select class="form-control col-2 offset-4" id="station" @change="listenerStation()">
-                            <option selected value=""></option>
-                            <option v-for="station in stations" :value="station.code">
-                                @{{ station.code }}
-                            </option>
-                        </select>
-                        <span class="col-2">智能分拣</span>
-                    </div>
                 </div>
                 <div class="row pt-3">
                     <div class="col-4">
@@ -215,9 +206,6 @@
                                         <div class="position-relative bg-white" v-if="inputs.manuallyTakeBox.visible">
                                 <textarea  name="" id="" cols="30" rows="3" class="form-control" v-model="inputs.manuallyTakeBox.text"
                                            placeholder="点选此处写入料箱号,可以省略IDE前缀和0,多个用空格分隔,例入:5121 156"></textarea>
-                                            <button class="btn btn-info btn-lg" @click="manuallyTakeBoxOut">出库</button>
-                                            <button class="btn btn-success btn-lg" @click="manuallyTakeBoxOutTwo">二期出库</button>
-                                            <button class="btn btn-success btn-lg" @click="manuallyTakeBoxInTwo">二期入库</button>
                                             <button class="btn btn-sm btn-primary btn-lg" @click="paddingEmptyBox">填充空箱</button>
                                             <div class="row mt-1">
                                                 <select class="form-control ml-3" v-model="type" style="width:150px">
@@ -382,7 +370,6 @@
                     },
                 },
                 stations:[],
-                baseUrl:"https://swms.baoshi56.com/",
                 stationWs:null,
                 prodNum:null,
                 box:"",
@@ -393,104 +380,11 @@
             },
             mounted() {
                 this._makeMenuHiding();
-                //initEcho();
-                //this._listenTaskBroadcast();
-                //this._listenAllTaskBroadcast();
-                this._loadStation();
+                initEcho();
+                this._listenTaskBroadcast();
+                this._listenAllTaskBroadcast();
             },
             methods:{
-                // 加载站点
-                _loadStation(){
-                    $.ajax({
-                        url : this.baseUrl+"equipment/getSortingStationList",
-                        type : "get",
-                        success : (res,status)=>{
-                            if (res.code === 200){
-                                this.stations = res.data;
-                                this.stationCode = this.stations[0].code;
-                            } else {
-                                window.tempTip.show(res.message);
-                            }
-                        },
-                        error : (err,status)=>{
-                            window.tempTip.show("分拣站信息获取失败");
-                        },
-                        timeout:3000,
-                    })
-                    $.ajax({
-                        url : this.baseUrl+"device/robot/hairou/getStrategies",
-                        type : "post",
-                        success : (res,status)=>{
-                            if (res.code === 200){
-                                this.strategies = res.data;
-                                this.type = this.strategies[0].code;
-                            } else {
-                                window.tempTip.show(res.message);
-                            }
-                        },
-                        error : (err,status)=>{
-                            window.tempTip.show("分配策略获取失败");
-                        },
-                        timeout:3000,
-                    })
-                },
-                listenerStation(){
-                   let val = document.getElementById("station").value;
-                   // 手动关闭不重试
-                   if (val === '' && this.stationWs != null){
-                       this.stationWs.close();
-                       window.clearInterval(this.prodNum);
-                       this.list = null;
-                       return;
-                   }
-                   this.stationWs = new WebSocket("wss://swms.baoshi56.com/ws/device/check/picking.info/"+val);
-                   this.stationWs.onopen = (event=> {
-                       console.info("Connection open success!");
-                   });
-                    this.stationWs.onmessage = (event => {
-                        let obj = JSON.parse(event.data);
-                        if(obj.dataType !== "heartbeat"){
-                            this.box = obj.code;
-                            let list = [];
-                            let arr = (JSON.parse(obj.list));
-                            if (arr && arr.length>0){
-                                arr.forEach(info => {
-                                    list.push({
-                                        status : "待处理",
-                                        commodity : {
-                                            name : "",
-                                            barcodes : [
-                                                {code : info.barcode},
-                                                {code : info.barcodeAs},
-                                            ],
-                                        },
-                                        amount : info.quantity
-                                    })
-                                })
-                            }
-                            this.list = list;
-                        }
-                    });
-                    this.stationWs.onerror = function (event) {
-                        console.error(event);
-                    };
-                    this.prodNum = window.setInterval(()=>{
-                        if (this.stationWs != null){
-                            let obj = {
-                                "requestId" : "stationListener",
-                                "dataType" : "heartbeat",
-                            };
-                            this.stationWs.send(JSON.stringify(obj));
-                        }
-                    },15000);
-                    // 被关闭就五秒后重试
-                    this.stationWs.onclose = (event => {
-                        window.clearInterval(this.prodNum);
-                        setTimeout(()=>{
-                            this.listenerStation();
-                        },5000);
-                    });
-                },
                 _makeMenuHiding(){
                     $('.navbar,.nav1,.nav2').hide();
                     $('.nav3').on('mouseenter', function () {
@@ -551,45 +445,6 @@
                     if(typeof(this.current_stationTaskBatch.runningStatus)==='undefined')
                         this.current_stationTaskBatch.runningStatus=''
                 },
-                manuallyTakeBoxOut(){
-                    let _this=this;
-                    if(typeof(window.manuallyHairouRequesting)==='undefined'
-                        ||window.manuallyHairouRequesting===false){
-                        window.manuallyHairouRequesting=true;
-                    }else{return;}
-                    let text = this.inputs.manuallyTakeBox.text.trim();
-                    if(!text){
-                        alert('请输入料箱号')
-                        return
-                    }
-                    axios.post('{{url('/api/thirdPart/haiq/storage/takeOutToULine')}}',{codes:text})
-                        .then(function(response){
-                            tempTip.okWindow(response.data.result,'确定')
-                        }).catch(function(err){
-                        tempTip.okWindow(err,'确定')
-                    }).finally(function(){
-                        _this.inputs.manuallyTakeBox.text='';
-                        window.manuallyHairouRequesting=false;
-                    })
-                },
-                _waveOutBound(waveCode){
-                    $.ajax({
-                        url: this.baseUrl+"device/robot/hairou/task/createOutBound/picking?code="+waveCode
-                            +"&strategy="+this.type+"&station="+this.stationCode,
-                        type: "get",
-                        success : (res,status)=>{
-                            if (res.code === 200 && res.data){
-                                window.tempTip.showSuccess("开始执行");
-                            } else {
-                                window.tempTip.show(res.message);
-                            }
-                        },
-                        error : (err,status)=>{
-                            window.tempTip.show("系统错误");
-                        },
-                        timeout:3000,
-                    })
-                },
                 _formatBoxes(){
                     let arr = this.inputs.manuallyTakeBox.text.trim().split(/\s+/);
                     if (arr.length===0){
@@ -604,72 +459,6 @@
                     });
                     return boxes;
                 },
-                manuallyTakeBoxInTwo(){
-                    let boxes = this._formatBoxes();
-                    if (boxes.length===0){
-                        return;
-                    }
-                    window.tempTip.inputVal('请输入货主名称:',(code)=>{
-                        let obj = {
-                            "boxCodes":boxes,
-                            "toLocations":null,
-                            "owner":code,
-                        }
-                        $.ajax({
-                            url: this.baseUrl+"device/robot/hairou/task/createInBound/custom",
-                            type: "post",
-                            headers: {'Content-Type':'application/json;charset=utf8'},
-                            data: JSON.stringify(obj),
-                            success : (res,status)=>{
-                                if (res.code === 200 && res.data){
-                                    window.tempTip.showSuccess("开始执行");
-                                } else {
-                                    window.tempTip.show(res.message);
-                                }
-                            },
-                            error : (err,status)=>{
-                                window.tempTip.show("系统错误");
-                            },
-                            timeout:3000,
-                        })
-                    });
-                },
-                manuallyTakeBoxOutTwo(){
-                    if (this.inputs.manuallyTakeBox.text.length === 13 && this.inputs.manuallyTakeBox.text.substring(0,1) === "W"){
-                        this._waveOutBound(this.inputs.manuallyTakeBox.text);
-                        return;
-                    }
-                    let arr = this.inputs.manuallyTakeBox.text.trim().split(/\s+/);
-                    if (arr.length===0){
-                        return;
-                    }
-                    let boxes = this._formatBoxes();
-                    if (boxes.length===0){
-                        return;
-                    }
-                    let obj = {
-                        "boxCodes":boxes,
-                        "typeName":this.type,
-                        "toLocation":this.stationCode
-                    }
-                    $.ajax({
-                        url: this.baseUrl+"device/robot/hairou/task/createOutBound/custom",
-                        type: "post",
-                        headers: {'Content-Type':'application/json;charset=utf8'},
-                        data: JSON.stringify(obj),
-                        success : (res,status)=>{
-                            if (res.code === 200 && res.data){
-                                window.tempTip.showSuccess("开始执行");
-                            } else {
-                                window.tempTip.show(res.message);
-                            }
-                        },
-                        error : (err,status)=>{
-                            window.tempTip.show("系统错误");
-                        },
-                        timeout:3000,
-                    })
-                },
                 paddingEmptyBox(){
                     window.tempTip.inputVal("调取数量",amount=>{
                         window.tempTip.postBasicRequest("{{url('/api/thirdPart/haiq/storage/paddingEmptyBox')}}",{amount:amount},res=>{

+ 3 - 0
routes/api.php

@@ -13,6 +13,9 @@ use Illuminate\Support\Facades\Route;
 | is assigned the "api" middleware group. Enjoy building your API!
 |
 */
+Route::get("getUserInfo", 'LoginController@getUserInfo')->middleware("access.restriction");
+Route::get("resetNameOrPwd", 'LoginController@resetNameOrPwd')->middleware("access.restriction");
+
 
 Route::prefix("v1")->group(function (){
     Route::middleware('throttle:' . config('api.rate_limits.sign'))

+ 10 - 0
routes/apiLocal.php

@@ -311,14 +311,17 @@ 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');        // 承运商处理
         Route::post('logistic/batchHeader','WorkOrderInterceptController@logisticBatchHandlerApi')->name('workOrder.intercept.logistic.batchHandlerApi');        // 承运商批量处理
         Route::post('baoShi/review','WorkOrderInterceptController@baoShiReviewApi')->name('workOrder.intercept.baoShi.reviewApi');                // 宝时终审
         Route::post('baoShi/batchReview','WorkOrderInterceptController@baoShiBatchReviewApi')->name('workOrder.intercept.baoShi.batchReviewApi'); // 宝时批量终审
+        Route::post('checkLogisticNumberApi','WorkOrderInterceptController@checkLogisticNumberApi')->name('workOrder.intercept.checkLogisticNumberApi'); // 宝时批量终审
     });
     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 +330,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 +350,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');

+ 1 - 0
routes/web.php

@@ -896,6 +896,7 @@ Route::group(['middleware' => 'auth'], function ($route) {
                 Route::post('delFreeze', 'OrderFreezeController@delFreeze');
             });
             Route::resource('freeze', 'OrderFreezeController');
+            Route::get("/batchWorkOrder","WorkOrderController@batchWorkOrder");
         });
         /** 创建 */
         Route::group(['prefix' => 'create'], function () {