Просмотр исходного кода

Merge branch 'master' into Haozi

# Conflicts:
#	phpunit.xml
haozi 5 лет назад
Родитель
Сommit
c470dc2b9e
100 измененных файлов с 5900 добавлено и 477 удалено
  1. 3 3
      app/Http/Controllers/InventoryController.php
  2. 11 4
      app/Http/Controllers/OrderController.php
  3. 468 0
      app/Http/Controllers/OrderIssueController.php
  4. 66 0
      app/Http/Controllers/OrderIssueOnTopController.php
  5. 80 0
      app/Http/Controllers/OrderIssueProcessLogController.php
  6. 85 0
      app/Http/Controllers/OrderIssueTypeController.php
  7. 85 0
      app/Http/Controllers/OrderPackageCommoditiesController.php
  8. 85 0
      app/Http/Controllers/OrderPackageController.php
  9. 18 10
      app/Http/Controllers/ProcessController.php
  10. 9 0
      app/Http/Controllers/RejectedBillController.php
  11. 5 0
      app/Http/Controllers/RejectedBillItemController.php
  12. 10 1
      app/Http/Controllers/RejectedController.php
  13. 85 0
      app/Http/Controllers/ShopController.php
  14. 4 1
      app/Http/Controllers/StoreController.php
  15. 43 19
      app/Http/Controllers/TestController.php
  16. 14 2
      app/Http/Controllers/UserController.php
  17. 16 12
      app/Http/Controllers/UserDutyCheckController.php
  18. 1 1
      app/Http/Controllers/UserLaborController.php
  19. 13 2
      app/Http/Controllers/api/thirdPart/flux/ProcessController.php
  20. 100 0
      app/Imports/OrderIssueImport.php
  21. 4 0
      app/OracleDOCASNDetail.php
  22. 14 0
      app/OracleDOCASNHeader.php
  23. 5 0
      app/OracleDOCOrderDetail.php
  24. 83 0
      app/Order.php
  25. 54 0
      app/OrderIssue.php
  26. 19 0
      app/OrderIssueOnTop.php
  27. 21 0
      app/OrderIssueProcessLog.php
  28. 19 0
      app/OrderIssueType.php
  29. 24 0
      app/OrderPackage.php
  30. 22 0
      app/OrderPackageCommodities.php
  31. 10 1
      app/ProcessesContent.php
  32. 98 1
      app/RejectedBill.php
  33. 4 4
      app/Services/LogisticService.php
  34. 10 0
      app/Services/OracleDOCOrderHeaderService.php
  35. 438 0
      app/Services/OrderIssueService.php
  36. 48 0
      app/Services/OrderPackageCommoditiesService.php
  37. 45 0
      app/Services/OrderPackageService.php
  38. 134 0
      app/Services/OrderService.php
  39. 1 1
      app/Services/ProcessService.php
  40. 4 4
      app/Services/QualityLabelService.php
  41. 82 42
      app/Services/RejectedService.php
  42. 23 5
      app/Services/WaveService.php
  43. 14 0
      app/Shop.php
  44. 10 0
      app/Validators/UserDutyCheckValidator.php
  45. 452 97
      composer.lock
  46. 12 0
      database/factories/OrderFactory.php
  47. 12 0
      database/factories/OrderIssueFactory.php
  48. 12 0
      database/factories/OrderIssueOnTopFactory.php
  49. 12 0
      database/factories/OrderIssueProcessLogFactory.php
  50. 12 0
      database/factories/OrderIssueTypeFactory.php
  51. 12 0
      database/factories/OrderItemsFactory.php
  52. 12 0
      database/factories/OrderOnTopFactory.php
  53. 12 0
      database/factories/OrderPackageCommoditiesFactory.php
  54. 12 0
      database/factories/OrderPackageFactory.php
  55. 12 0
      database/factories/ShopFactory.php
  56. 1 1
      database/migrations/2020_07_24_072406_create_order_commodities_table.php
  57. 52 0
      database/migrations/2020_07_29_155624_create_orders_table.php
  58. 35 0
      database/migrations/2020_07_29_160704_create_shops_table.php
  59. 52 0
      database/migrations/2020_07_29_160826_create_order_issues_table.php
  60. 54 0
      database/migrations/2020_07_29_164130_create_order_issue_types_table.php
  61. 52 0
      database/migrations/2020_07_29_164829_add_data_authorities_issue.php
  62. 35 0
      database/migrations/2020_08_04_095621_create_order_package_commodities_table.php
  63. 33 0
      database/migrations/2020_08_04_095822_create_order_packages_table.php
  64. 34 0
      database/migrations/2020_08_04_103020_create_order_issue_on_tops_table.php
  65. 35 0
      database/migrations/2020_08_06_172655_create_order_issue_process_logs_table.php
  66. 16 0
      database/seeds/OrderIssueOnTopSeeder.php
  67. 16 0
      database/seeds/OrderIssueProcessLogSeeder.php
  68. 16 0
      database/seeds/OrderIssueSeeder.php
  69. 16 0
      database/seeds/OrderIssueTypeSeeder.php
  70. 16 0
      database/seeds/OrderItemsSeeder.php
  71. 16 0
      database/seeds/OrderOnTopSeeder.php
  72. 16 0
      database/seeds/OrderPackageCommoditiesSeeder.php
  73. 16 0
      database/seeds/OrderPackageSeeder.php
  74. 16 0
      database/seeds/OrderSeeder.php
  75. 16 0
      database/seeds/ShopSeeder.php
  76. 1 0
      phpunit-OrderIssue.bat
  77. 3 0
      phpunit.xml
  78. 2 2
      public/js/app.js
  79. 174 98
      resources/js/queryForm/header.js
  80. 103 4
      resources/js/queryForm/queryForm.js
  81. 1 0
      resources/js/utilities/sort.js
  82. 12 0
      resources/sass/layout.scss
  83. 1 1
      resources/views/inventory/statement/allInventory.blade.php
  84. 47 26
      resources/views/inventory/statement/changeInventory.blade.php
  85. 1 1
      resources/views/inventory/stockInventory/mission.blade.php
  86. 1 1
      resources/views/layouts/app.blade.php
  87. 21 9
      resources/views/maintenance/role/index.blade.php
  88. 62 38
      resources/views/maintenance/user/index.blade.php
  89. 100 49
      resources/views/order/index/delivering.blade.php
  90. 505 0
      resources/views/order/issue/create.blade.php
  91. 288 0
      resources/views/order/issue/edit.blade.php
  92. 51 0
      resources/views/order/issue/import.blade.php
  93. 855 0
      resources/views/order/issue/index.blade.php
  94. 30 0
      resources/views/order/issue/menu.blade.php
  95. 25 0
      resources/views/order/issue/performance.blade.php
  96. 15 0
      resources/views/order/issue/search.blade.php
  97. 22 0
      resources/views/order/issue/workload.blade.php
  98. 5 0
      resources/views/order/menu.blade.php
  99. 12 1
      resources/views/order/wave/search.blade.php
  100. 61 36
      resources/views/personnel/laborReport/index.blade.php

+ 3 - 3
app/Http/Controllers/InventoryController.php

@@ -19,9 +19,7 @@ class InventoryController extends Controller
     {
     {
         app()->singleton('inventoryService',InventoryService::class);
         app()->singleton('inventoryService',InventoryService::class);
     }
     }
-
-    public function conditionQuery(Request $request,$page=null,$paginate=null){
-        if(!Gate::allows("库存管理-库存")){ return redirect(url('/'));  }
+    private function conditionQuery(Request $request,$page=null,$paginate=null){
         $date_start=$request->input('date_start');
         $date_start=$request->input('date_start');
         $range = $request->input('range');
         $range = $request->input('range');
         if ($range)$date_start=date('Y-m-d',strtotime('-'.$range." day"));
         if ($range)$date_start=date('Y-m-d',strtotime('-'.$range." day"));
@@ -96,6 +94,7 @@ class InventoryController extends Controller
     }
     }
     //动库报表
     //动库报表
     public function changeInventory(Request $request){
     public function changeInventory(Request $request){
+        if(!Gate::allows("库存管理-动库报表")){ return redirect(url('/'));  }
         $page=$request->input('page')??1;
         $page=$request->input('page')??1;
         $paginate=$request->input('paginate')??50;
         $paginate=$request->input('paginate')??50;
         $oracleActTransactingLogs=$this->conditionQuery($request,$page,$paginate);
         $oracleActTransactingLogs=$this->conditionQuery($request,$page,$paginate);
@@ -114,6 +113,7 @@ class InventoryController extends Controller
         return view('inventory.statement.allInventory',compact('oracleActTransactingLogs','page','owners'));
         return view('inventory.statement.allInventory',compact('oracleActTransactingLogs','page','owners'));
     }
     }
     public function exportData(Request $request){
     public function exportData(Request $request){
+        if(!Gate::allows("库存管理-动库报表")){ return redirect(url('/'));  }
         if (!$request->checkAllSign){
         if (!$request->checkAllSign){
             $oracleActTransactingLogs=json_decode($request->input('data'),true);
             $oracleActTransactingLogs=json_decode($request->input('data'),true);
             return $this->export($oracleActTransactingLogs);
             return $this->export($oracleActTransactingLogs);

+ 11 - 4
app/Http/Controllers/OrderController.php

@@ -31,10 +31,17 @@ class OrderController extends Controller
         $waveno=$request->input('waveno');
         $waveno=$request->input('waveno');
         $edisendflag2=$request->edisendflag2;
         $edisendflag2=$request->edisendflag2;
         $edisendflag=$request->edisendflag;
         $edisendflag=$request->edisendflag;
+        if ($orderdate_start && $orderdate_end && $addtime){
+            $request->offsetUnset('orderdate_start');$request->offsetUnset('orderdate_end');
+            $orderdate_start=null;
+            $orderdate_end=null;
+        }
         if ($orderdate_start){
         if ($orderdate_start){
+            if (strlen($orderdate_start)<11)$orderdate_start .= ' 00:00';
             $sql.=" and addtime>='".$orderdate_start.":00'";
             $sql.=" and addtime>='".$orderdate_start.":00'";
         }
         }
         if ($orderdate_end){
         if ($orderdate_end){
+            if (strlen($orderdate_end)<11)$orderdate_end .= ' 23:59 ';
             $sql.=" and addtime<='".$orderdate_end.":59' ";
             $sql.=" and addtime<='".$orderdate_end.":59' ";
         }
         }
         if ($customerid){
         if ($customerid){
@@ -135,7 +142,7 @@ class OrderController extends Controller
        BAS_SKU.Alternate_SKU1,BAS_SKU.Descr_C,(select count(*) from DOC_ORDER_HEADER WHERE 1=1";
        BAS_SKU.Alternate_SKU1,BAS_SKU.Descr_C,(select count(*) from DOC_ORDER_HEADER WHERE 1=1";
         $sql=$this->preciseQuery($request,$sql);
         $sql=$this->preciseQuery($request,$sql);
         ;$sql.=" ) as counted from (";
         ;$sql.=" ) as counted from (";
-        if (!$request->input('export'))$sql.=" select * from (";
+        if (!$export)$sql.=" select * from (";
         $sql.=" select ROWNUM as rn,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
         $sql.=" select ROWNUM as rn,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
                           ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
                           ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
                          DOC_ORDER_HEADER.WaveNo,DOC_ORDER_HEADER.SOReference1
                          DOC_ORDER_HEADER.WaveNo,DOC_ORDER_HEADER.SOReference1
@@ -157,14 +164,14 @@ class OrderController extends Controller
                 $sql.=")";
                 $sql.=")";
             }
             }
         }
         }
-        if (!$request->input('export'))$sql.=" and ROWNUM<='".$page*$paginate."')";
-        if (!$request->input('export'))$sql.=" header where header.rn>'".($page-1)*$paginate."' ";
+        if (!$export)$sql.=" and ROWNUM<='".$page*$paginate."')";
+        if (!$export)$sql.=" header where header.rn>'".($page-1)*$paginate."' ";
         $sql.=")DOC_ORDER_HEADER left join DOC_ORDER_DETAILS on DOC_ORDER_DETAILS.ORDERNO=DOC_ORDER_HEADER.ORDERNO
         $sql.=")DOC_ORDER_HEADER left join DOC_ORDER_DETAILS on DOC_ORDER_DETAILS.ORDERNO=DOC_ORDER_HEADER.ORDERNO
                       left join BAS_CODES  order_code on order_code.CODE=DOC_ORDER_HEADER.sostatus and order_code.codeid='SO_STS'
                       left join BAS_CODES  order_code on order_code.CODE=DOC_ORDER_HEADER.sostatus and order_code.codeid='SO_STS'
                       left join BAS_CODES  order_detail_code on order_detail_code.CODE=DOC_ORDER_DETAILS.linestatus and order_detail_code.codeid='SO_STS'
                       left join BAS_CODES  order_detail_code on order_detail_code.CODE=DOC_ORDER_DETAILS.linestatus and order_detail_code.codeid='SO_STS'
                       left join BAS_Customer on BAS_Customer.customerid=DOC_ORDER_HEADER.customerid
                       left join BAS_Customer on BAS_Customer.customerid=DOC_ORDER_HEADER.customerid
                       left join  BAS_SKU on DOC_Order_Details.CustomerID=BAS_SKU.CustomerID and DOC_Order_Details.SKU=BAS_SKU.SKU
                       left join  BAS_SKU on DOC_Order_Details.CustomerID=BAS_SKU.CustomerID and DOC_Order_Details.SKU=BAS_SKU.SKU
-                      left join ACT_ALLOCATION_DETAILS on DOC_Order_Details.orderno=ACT_ALLOCATION_DETAILS.orderno and 
+                      left join ACT_ALLOCATION_DETAILS on DOC_Order_Details.orderno=ACT_ALLOCATION_DETAILS.orderno and
                       DOC_Order_Details.orderlineno=ACT_ALLOCATION_DETAILS.orderlineno";
                       DOC_Order_Details.orderlineno=ACT_ALLOCATION_DETAILS.orderlineno";
         if ($alternate_sku1)$sql.=" where BAS_SKU.Alternate_SKU1 like '".$alternate_sku1."%'";
         if ($alternate_sku1)$sql.=" where BAS_SKU.Alternate_SKU1 like '".$alternate_sku1."%'";
         $orders=DB::connection('oracle')->select(DB::raw($sql));
         $orders=DB::connection('oracle')->select(DB::raw($sql));

+ 468 - 0
app/Http/Controllers/OrderIssueController.php

@@ -0,0 +1,468 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Exports\Export;
+use App\Imports\OrderIssueExport;
+use App\Imports\OrderIssueImport;
+use App\Logistic;
+use App\Order;
+use App\OrderIssue;
+use App\OrderIssueProcessLog;
+use App\OrderIssueType;
+use App\OrderPackage;
+use App\Owner;
+use App\RejectedBill;
+use App\Services\OrderIssueService;
+use App\Services\OrderService;
+use App\Services\RejectedService;
+use App\Shop;
+use App\UserWorkgroup;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Validator;
+use Maatwebsite\Excel\Facades\Excel;
+
+class OrderIssueController extends Controller
+{
+
+    public function __construct()
+    {
+        app()->singleton("orderIssueService", OrderIssueService::class);
+        app()->singleton("orderService", OrderService::class);
+        app()->singleton("rejectedService", RejectedService::class);
+    }
+
+    public function index(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-查询')) {
+            return redirect(url('/'));
+        }
+        $orderIssueService = app('orderIssueService');
+        $owners = Owner::all();
+        $orderIssues = $orderIssueService->paginate($request->all());
+        return view('order.issue.index', compact('owners', 'orderIssues'));
+    }
+
+    public function create()
+    {
+        if (!Gate::allows('订单管理-订单问题件生成')) {
+            return redirect(url('/'));
+        }
+        $types = OrderIssueType::all();
+        $meg = ['success' => true];
+        $userWorkGroup = UserWorkgroup::all();
+        $logistic = Logistic::all();
+        $owners = Owner::all();
+        return view('order.issue.create', compact(['types', 'meg', 'userWorkGroup', 'logistic', 'owners']));
+    }
+
+    public function store(Request $request)
+    {
+        if (!Gate::allows('订单管理-订单问题件生成')) {
+            return redirect(url('/'));
+        }
+        $orderIssueService = app('orderIssueService');
+        $orderIssueService->validatorCreate($request)->validate();
+        $orderIssue = null;
+        if ($request->filled('logistic_number_return')) {
+            $orderIssue = $orderIssueService->createByLogisticNumber($request->all());
+        } else {
+            $orderIssue = $orderIssueService->create($request->all());
+        }
+        $msg = '';
+        if ($orderIssue == null) {
+            $msg = '创建订单问题件失败';
+        } else {
+            $msg = '创建订单问题件成功';
+        }
+        $owners = Owner::all();
+        $orderIssues = $orderIssueService->paginate($request->all());
+        OrderIssueProcessLog::create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '创建订单问题件', 'type' => '创建']);
+        return redirect('order/issue/index'); /*view('order.issue.index', compact('owners', 'orderIssues', 'msg'))*/;
+    }
+
+    public function edit($id)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) {
+            return redirect(url('/'));
+        }
+        $orderIssue = OrderIssue::where('id', $id)->first();
+        $order = Order::with(['packages' => function ($query) {
+            return $query->with(['commodities' => function ($query) {
+                return $query->with('commodity');
+            }]);
+        }])->where('id', $orderIssue->order_id)->first();
+        $secondOrder = Order::with(['packages'=>function($query){
+            return $query->with(['commodities'=>function($query){
+                return $query->with(['commodity']);
+            }]);
+        }])->where('id', $orderIssue->second_order_id)->first();
+        $rejectedBill = RejectedBill::where('id', $orderIssue->rejected_bill_id)->first();
+        $userWorkgroup = UserWorkgroup::all();
+        $orderIssueType = OrderIssueType::all();
+
+        $owners = Owner::all();
+        $shops = Shop::all();
+        $logistics = Logistic::all();
+//        return view('order/issue/edit', compact(['orderIssue', 'owners', 'userWorkgroup', 'shops', 'logistics', 'orderIssueType',]));
+        return view('order/issue/edit', compact(['orderIssue', 'owners', 'userWorkgroup', 'shops', 'logistics', 'orderIssueType', 'order', 'secondOrder', 'rejectedBill']));
+    }
+
+    public function update(Request $request)
+    {
+        //
+    }
+
+    public function destroy(Request $request)
+    {
+
+    }
+
+    public function batchImport(Request $request)
+    {
+        if (!Gate::allows('订单管理-订单问题件生成')) {
+            return redirect(url('/'));
+        }
+        $file = $request->file('file');
+        $fileSuffix = $request->file('file')->getClientOriginalExtension();
+        if (in_array($fileSuffix, ['xlsx', 'xlsm', 'xltx', 'xltm', 'xls', 'xlt', 'ods', 'ots', 'slk', 'xml', 'gnumeric', 'htm', 'html', 'csv', 'tsv'])) {
+            ini_set('max_execution_time', 2100);
+            ini_set('memory_limit', '512M');
+            $extension = $request->file()['file']->getClientOriginalExtension();
+            $extension[0] = strtoupper($extension[0]);
+            Excel::import(new OrderIssueImport(), $request->file()['file']->path(), null, $extension);
+            if (Cache::has('error')) {
+                return '<h1 class="text-danger">导入Excel失败<br><p style="color: red">' . Cache::pull('error') . '</p></h1>';
+            } else {
+                $exception = Cache::get('exception');
+                $a = '';
+                for ($i = 0; $i < count($exception); $i++) {
+                    $a .= implode(',', $exception[$i]) . '&#10';
+                };
+                $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+                return '<h1 class="text-danger">导入Excel成功<br><textarea style="width: 50%;height: 50%">' . $a . '</textarea></h1>';
+            }
+        } else {
+            return '<h1 class="text-danger">失败<br><p style="color: red">不支持该文件类型</p></h1>';
+        }
+    }
+
+    public function exportOrderIssue(Request $request)
+    {
+        $orderIssueService = app('orderIssueService');
+        $resultdata = $orderIssueService->exportExcel($request);
+
+        $row = [[
+            'id' => 'ID', 'created_at' => '状态', 'order_created_at' => '登记日期', 'owner' => '客户', 'shop' => '店铺', 'order_no' => '原始订单号',
+            'logistic' => '原始承运商', 'consignee_name' => '收货人', 'consignee_phone' => '收货电话',
+            'province' => '省', 'city' => '市', 'district' => '区', 'address' => '收货人地址',
+// 原始商品信息order -> package -> commodity
+            'commodity_code' => '商品条码', 'commodity_name' => '商品名称', 'amount' => '数量',
+// 退回商品信息 rejectedBill -> items
+            'barcode_goods' => '商品条码', 'name_goods' => '商品名称', 'goods_amount' => '数量', 'is_checked' => '是否正品', 'remark' => '备注',
+            'rejecting_status'=>'退单状态',
+            'logtype'=>'操作类型','logremark'=>'说明','user'=>'操作者',
+            'order_issue_type' => '问题类别',
+            'second_order' => '二次订单', 'second_logistic' => '二次承运商', 'second_logistic_number' => '二次运单号',
+// 二次商品信息 order -> package -> commodity
+            's_commodity_code' => '条码', 's_commodity_name' => '商品名', 's_amount' => '数量', /*'s_is_checked' => '是否正品', 's_remark' => '备注',*/
+            'final_status' => '最终状态', 'logistic_indemnity_money' => '承运商赔偿金额', 'logistic_express_remission' => '承运商快递减免',
+            'baoshi_indemnity_money' => '宝时赔偿金额', 'baoshi_express_remission' => '宝时快递减免', 'user_workgroup' => '事故责任方']];
+
+        $list = [];
+        $mergeCell = [];
+        $i = 0;
+        foreach ($resultdata as $result) {
+            $count = 0;
+            $list[$i] = [
+                'id' => $result->id,
+                'created_at' => $result->created_at,    // 登记日期
+                'order_created_at' => isset($result->order) ? $result->order->created_at : '', // 订单创建日期
+                'owner' => isset($result->owner) ? $result->owner->name : '',   // 货主
+                'shop' => isset($result->shop) ? $result->shop->name : '',      // 店铺
+                'final_status' => $result->final_status,                        // 最终处理结果
+                'order_issue_type' => isset($result->type) ? $result->type->name : '',
+                'logistic_indemnity_money' => $result->logistic_indemnity_money,
+                'logistic_express_remission' => $result->logistic_express_remission,
+                'baoshi_indemnity_money' => $result->baoshi_indemnity_money,
+                'baoshi_express_remission' => $result->baoshi_express_remission,
+                'user_workgroup' => isset($result->userWorkGroup) ? $result->userWorkGroup->name : '',
+                'rejecting_status' => isset($result->rejecting_status) ? $result->rejecting_status : '',
+            ];
+            $sign=$i+2;
+            if (isset($result->order)) {
+                $list[$i]['logistic'] = $result->order->logistic ? $result->order->logistic->name : '';
+                $list[$i]['consignee_name'] = $result->order->consignee_name;
+                $list[$i]['consignee_phone'] = $result->order->consignee_phone;
+                $list[$i]['province'] = $result->order->province;
+                $list[$i]['city'] = $result->order->city;
+                $list[$i]['district'] = $result->order->district;
+                $list[$i]['address'] = $result->order->address;
+                $list[$i]['order_no'] = $result->order->code;
+                $cell = $i;
+                if (isset($result->order->packages)) {
+                    $packages = $result->order->packages;
+                    foreach ($packages as $key => $value) {
+                        if(isset($value->commodities)){
+                            $commodities = $value->commodities;
+                            foreach($commodities as $commodity){
+                                $list[$cell]['commodity_code'] = isset($commodity->commodity)? $commodity->commodity->sku:'';
+                                $list[$cell]['commodity_name'] = isset($commodity->commodity)?$commodity->commodity->name :'';
+                                $list[$cell]['amount'] = $commodity->amount;
+                            }
+                        }
+                        $cell++;
+                    }
+                    $count = $cell - $i;
+                }
+            }
+            if(isset($result->logs)){
+                $logs = $result->logs;
+                $cell = $i;
+                foreach ($logs as $log){
+                    $list[$cell]['logtype'] = $log->type;
+                    $list[$cell]['logremark'] =$log->content;
+                    $list[$cell]['user'] = isset($log->user) ? $log->user->name:"";
+                    $cell++;
+                }
+                $count = $cell - $i > $count ?  $cell - $i : $count;
+            }
+            if (isset($result->secondOrder)) {
+                $list[$i]['second_order'] = $result->secondOrder->code;
+                $list[$i]['second_logistic'] = $result->secondOrder->logistic->name;
+                $list[$i]['second_logistic_number'] = $result->secondOrder->code;
+                $secondOrder = $result->secondOrder;
+                if (isset($secondOrder->secondOrder->packages)) {
+                    $spackages = $result->order->packages;
+                    $cell = $i;
+                    foreach ($spackages as $key => $value) {
+                        if(isset($value->commodities)){
+                            $commodities = $value->commodities;
+                            foreach($commodities as $commodity){
+                                $list[$cell]['s_commodity_code'] = isset($commodity->commodity)? $commodity->commodity->sku:'';
+                                $list[$cell]['s_commodity_name'] = isset($commodity->commodity)?$commodity->commodity->name :'';
+                                $list[$cell]['s_amount'] = $commodity->amount;
+                            }
+                        }
+                        $cell++;
+                    }
+                    $count = $cell - $i > $count ?  $cell - $i : $count;
+                }
+            }
+            if (isset($result->rejectedBill)) {
+                $items = $result->rejectedBill->items ?? [];
+                $cell = $i;
+                foreach ($items as $key => $value) {
+                    $list[$cell]['barcode_goods'] = $value['barcode_goods'];
+                    $list[$cell]['name_goods'] = $value['name_goods'];
+                    $list[$cell]['goods_amount'] = $value['amount'];
+                    $list[$cell]['is_checked'] = $value['is_checked'];
+                    $list[$cell]['remark'] = $value['remark'];
+                    $cell ++;
+                }
+                $count = $cell - $i > $count ?  $cell - $i : $count;
+            }
+            $i += $count;
+            $mergeCell[$sign] = $i+1;
+        }
+        $columnName = [
+            "A", "B", "C", "D", "E", "F",
+            "G", "H", "I",
+            "J", "K", "L", "M",
+            /*"N", "O", "P",*/
+            /*"Q", "R", "S", "T", "U",*/
+            "V",
+            /*"W", "X", "Y",*/
+            "Z",
+            "AA", "AB", "AC",
+            /*"AD", "AF", "AG",*/
+            "AH", "AI", "AJ",
+            "AK", "AL" , "AM"];
+        if(Gate::has('客户不可见')){
+            unset($row[0]['baoshi_indemnity_money']);
+            unset($columnName['AK']);
+
+        }
+        foreach ($list as $key=>&$value){
+            foreach ($row[0] as $rowKey=>$rowValue){
+                if(!isset($value[$rowKey])){
+                    $value[$rowKey] = '';
+                }
+            }
+        }
+        return Excel::download(new Export($row, $list, $mergeCell, $columnName), date('YmdHis', time()) . '-订单问题件.xlsx');
+    }
+
+    public function excelImport(Request $request)
+    {
+        if (!Gate::allows('订单管理-订单问题件生成')) {
+            return redirect(url('/'));
+        }
+        return view('order.issue.import');
+    }
+
+    public function apiOrderIssueTag(Request $request)
+    {
+        if (!Gate::allows('订单管理-订单问题件生成')) {
+            return ['success' => false, 'fail_info' => '没有对应权限'];
+        }
+        if (!$request->input('orderNos')) {
+            return ['success' => false, 'fail_info' => '没有传入的订单编号'];
+        }
+        $orderIssueService = app('orderIssueService');
+        return $orderIssueService->orderIssueTag($request->all());
+    }
+
+    public function apiDestroy(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-删除')) {
+            return ['success' => false, 'fail_info' => '没有对应权限'];
+        }
+        if (!($request->has('id'))) {
+            return ['success' => 'false', 'fail_info' => '没有问题题件相关的参数'];
+        }
+        $orderIssue = OrderIssue::where('id', $request->input('id'))->first();
+        $bool = $orderIssue->delete();
+        if ($bool) {
+            $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+            return ['success' => 'true'];
+        } else {
+            return ['success' => 'false', 'fail_info' => '删除问题单出现异常,请联系管理员'];
+        }
+    }
+
+    public function apiUpdate(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) {
+            return ['success' => false, 'fail_info' => '没有对应权限'];
+        }
+        $validator =  $this->apiUpdateValidator($request);
+        if ($validator->fails()){
+            $arr = [];
+            foreach ($validator->getMessageBag()->toArray() as $k=>$error){
+                array_push($arr, $error[0]);
+            }
+            return [
+                'success' => false,
+                'errors' => $arr
+            ];
+        }
+        $orderIssue = OrderIssue::where('id', $request->input('id'))->first();
+        if (!$orderIssue) {
+            return ['success' => false, 'fail_info' => '数据库没有相应记录,请到查询页面刷新重试'];
+        }
+        $orderIssue->fill($request->all());
+        $orderIssue->update();
+        $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+        return ['success' => true, 'id' => $orderIssue['id']];
+    }
+
+    public function apiEndOrderIssue(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) {
+            return ['success' => false, 'fail_info' => '没有对应的权限'];
+        }
+        if (!$request->has('ids')) {
+            return ['success' => false, 'fail_info' => '没有传入对应的参数'];
+        }
+        $count = OrderIssue::whereIn('id', $request->input('ids'))->where('handle_status', 2)->count();
+        if ($count > 0) {
+            return ['success' => false, 'fail_info' => '勾选的内容中已有完结的订单问题件,取消勾选后重试'];
+        } else {
+            $count = OrderIssue::whereIn('id', $request->input('ids'))->update(['handle_status' => 2]);
+            foreach ($request->input('ids') as $id) {
+                OrderIssueProcessLog::create(['order_issue_id' => $id, 'user_id' => Auth::user()['id'], 'type' => '结束', 'content' => '完结订单']);
+            }
+            $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+            return ['success' => true];
+        }
+    }
+
+    public function apiDisposeOrderIssue(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) {
+            return ['success' => false, 'fail_info' => '没有对应权限'];
+        }
+        if (!$request->has('id')) {
+            return ['success' => false, 'fail_info' => '没有传入对应参数'];
+        }
+        $bool = OrderIssue::where('id', $request->input('id'))->update(['is_new_rejecting' => '已处理']);
+        if ($bool) {
+            OrderIssueProcessLog::create(['order_issue_id' => $request->input('id'), 'user_id' => Auth::user()['id'], 'content' => '订单已处理', 'type' => '处理']);
+            return ['success' => true];
+        }
+        return ['success' => false, 'fail_info' => '修改失败'];
+    }
+
+    public function apiGetOrderInfoByWMSOrderNo(Request $request)
+    {
+        if (!$request->filled('WMSOrderNo')) {
+            return ['success' => false, 'fail_info' => '缺失WMS订单号参数无法查询'];
+        }
+        $orderService = app('orderService');
+        $orderInfo = $orderService->createOrderByWMSOrderNo($request->input('WMSOrderNo'));
+        if (!$orderInfo) {
+            return ['success' => false, 'fina_info' => '没有对应的WMS订单号'];
+        }
+        return ['success' => true, 'data' => $orderInfo];
+    }
+
+    public function apiOrderIssueHasCreate(Request $request)
+    {
+        if (!$request->filled(['type', 'id'])) {
+            return ['success' => false, 'fail_info' => '缺少对应的参数或条件'];
+        }
+        $orderService = app('orderService');
+        $rejectedService = app('rejectedService');
+        if ($request->input('type') == 'WMSOrderNo') {
+            $order = $orderService->createOrderByWMSOrderNo($request->input('id'));
+            $bool = OrderIssue::where('order_id', $order['id'])->count() > 0;
+            if ($bool) {
+                return ['success' => false, 'fail_info' => '该订单号已有问题订单件'];
+            } else {
+                $order = $orderService->createOrderByWMSOrderNo($request->input('id'));
+                $rejectedBill = $rejectedService->getRejectedByWMSOrderNo($request->input('id'));
+                return ['success' => true, 'data' => compact(['order', 'rejectedBill'])];
+            }
+        } else if ($request->input('type') == 'RejectedBill') {
+            $rejectedBill = RejectedBill::where('logistic_number_return',$request->input('id'))->first();
+            if(!$rejectedBill){
+                return ['success'=>true,'fail_info' => '没有对应的退回单号将但仍可以创建订单问题件'];
+            }
+            $bool = OrderIssue::where('rejected_bill_id',$rejectedBill['id'] )->count() > 0;
+            if ($bool) {
+                return ['success' => false, 'fail_info' => '退回单号已有对应的问题单'];
+            } else {
+                $order = $orderService->getOrderInfoByLogisticNumberReturn($request->input('id'));
+                $rejectedBill = RejectedBill::with('items')->where('logistic_number_return', $request->input('id'))->first();
+                return ['success' => true, 'data' => compact(['order', 'rejectedBill'])];
+            }
+        }
+    }
+
+    public function apiUpdateValidator(Request $request){
+        return Validator::make($request->input(), [
+            'order_issue_type_id' => ['required'],
+            'handle_status' => ['nullable'],
+            'result_explain' => ['nullable'],
+            'logistic_indemnity_money' => ['nullable','numeric'],
+            'logistic_express_remission' => ['nullable'],
+            'baoshi_indemnity_money' => ['nullable','numeric'],
+            'baoshi_express_remission' => ['nullable'],
+        ],[
+            'required' => [':attribute 为必填项',':attribute'] ,
+            'numeric' => [':attribute  为可确认的数值',':attribute']
+        ],[
+            'order_issue_type_id'=>'问题类别',
+            'handle_status' => '处理状态',
+            'result_explain' => '处理结果说明',
+            'logistic_indemnity_money' => '承运商赔偿金额',
+            'logistic_express_remission' => '承运商快递减免',
+            'baoshi_indemnity_money' => '宝时赔偿金额',
+            'baoshi_express_remission' => '宝时快递减免',
+        ]);
+    }
+}

+ 66 - 0
app/Http/Controllers/OrderIssueOnTopController.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderIssueOnTop;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class OrderIssueOnTopController extends Controller
+{
+
+    public function index()
+    {
+    }
+
+    public function create()
+    {
+    }
+
+    public function store(Request $request)
+    {
+    }
+
+    public function show(OrderIssueOnTop $orderIssueOnTop)
+    {
+    }
+
+    public function edit(OrderIssueOnTop $orderIssueOnTop)
+    {
+    }
+
+    public function update(Request $request, OrderIssueOnTop $orderIssueOnTop)
+    {
+    }
+
+    public function destroy(OrderIssueOnTop $orderIssueOnTop)
+    {
+    }
+
+    public function apiDestroy(Request $request){
+        if (!Gate::allows('订单管理-问题件-置顶')) {
+            ['success' => false, 'fail_info' => '没有对应权限'];
+        }
+        if (!$request->has('id')) {
+            return ['success' => false, 'fail_info' => '没有传入对应的id'];
+        }
+        OrderIssueOnTop::where('id', $request->input('id'))->delete();
+        return ['success' => true];
+    }
+
+    public function apiStore(Request $request){
+        if (!Gate::allows('订单管理-问题件-置顶')) {
+            return ['success' => false, 'fail_info' => '没有对应权限'];
+        }
+        if (!$request->filled('id')) {
+            return ['success' => false, 'fail_info' => '没有传入对应参数'];
+        } else if (!$request->filled('remark')) {
+            return ['success' => false, 'fail_info' => '没有写入备注'];
+        }
+        $orderIssueOnTop = OrderIssueOnTop::create(['order_issue_id' => $request->input('id'), 'remark' => $request->input('remark')]);
+        if ($orderIssueOnTop) {
+            return ['success' => true];
+        }
+        return ['success' => false, 'fail_info' => '置顶失败'];
+    }
+}

+ 80 - 0
app/Http/Controllers/OrderIssueProcessLogController.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderIssueProcessLog;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+
+class OrderIssueProcessLogController extends Controller
+{
+
+    public function index()
+    {
+        //
+    }
+
+    public function create()
+    {
+        //
+    }
+
+    public function store(Request $request)
+    {
+        //
+    }
+
+    public function show(OrderIssueProcessLog $orderIssueProcessLog)
+    {
+        //
+    }
+
+    public function edit(OrderIssueProcessLog $orderIssueProcessLog)
+    {
+        //
+    }
+
+    public function update(Request $request, OrderIssueProcessLog $orderIssueProcessLog)
+    {
+        //
+    }
+
+    public function destroy(OrderIssueProcessLog $orderIssueProcessLog)
+    {
+        //
+    }
+
+    public function apiStore(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) {
+            return ['success' => false, 'fail_info' => '没有对应的权限'];
+        }
+        if ($request->filled(['id', 'content'])) {
+            $arr = ['order_issue_id' => $request->input('id'),
+                'content' => $request->input('content'),
+                'user_id' => Auth::user()['id'],
+                'type' => '处理',
+            ];
+            $orderIssueProcessLog = OrderIssueProcessLog::create($arr);
+            if ($orderIssueProcessLog) {
+                $data = OrderIssueProcessLog::with(['user'])->where('id',$orderIssueProcessLog['id'])->first();
+                $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+                return ['success' => true, 'data' => $data];
+            } else {
+                return ['success' => false, 'fail_info' => '录入失败'];
+            }
+        } else {
+            return ['success' => false, 'fail_info' => '没有传入对应参数'];
+        }
+    }
+
+    public function apisDestroy(Request $request){
+        if(!$request->filled('id')){
+            return ['success'=>false,'fail_info'=>'没有传入对应参数'];
+        }
+        OrderIssueProcessLog::where('id',$request->input('id'))->delete();
+        $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
+        return ['success'=>true];
+    }
+}

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

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

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

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

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

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

+ 18 - 10
app/Http/Controllers/ProcessController.php

@@ -561,10 +561,12 @@ class ProcessController extends Controller
                     ]);
                     ]);
                 }
                 }
                 if (isset($processContent['commodity_barcode'])){
                 if (isset($processContent['commodity_barcode'])){
-                    CommodityBarcode::query()->firstOrCreate([
-                        'commodity_id'=>$processContent['commodity_id'],
-                        'code'=>$processContent['commodity_barcode']]
-                    );
+                    Sign::query()->create([
+                        'signable_type'=>'processes_contents',
+                        'signable_id'=>$processContentOne->id,
+                        'field'=>'commodity_barcode',
+                        'mark'=>$processContent['commodity_barcode'],
+                    ]);
                 }
                 }
                 if (isset($processContent['is_update_commodity_sku'])){
                 if (isset($processContent['is_update_commodity_sku'])){
                     Sign::query()->create([
                     Sign::query()->create([
@@ -679,7 +681,7 @@ class ProcessController extends Controller
     {
     {
         if(!Gate::allows('二次加工管理-编辑')){ return redirect(url('/'));  }
         if(!Gate::allows('二次加工管理-编辑')){ return redirect(url('/'));  }
         $process=Process::with(['processesContents'=>function($query){
         $process=Process::with(['processesContents'=>function($query){
-            return $query->with(['commodity'=>function($query){
+            return $query->with(['signCommodityName','signCommoditySku','signCommodityBarcode','commodity'=>function($query){
                 return $query->with('barcodes');
                 return $query->with('barcodes');
             }]);
             }]);
         }])->find($id);
         }])->find($id);
@@ -689,7 +691,7 @@ class ProcessController extends Controller
 
 
     public function show($id){
     public function show($id){
         $process=Process::with(['processesContents'=>function($query){
         $process=Process::with(['processesContents'=>function($query){
-            $query->with(['commodity'=>function($query){
+            $query->with(['signCommodityName','signCommoditySku','signCommodityBarcode','commodity'=>function($query){
                 $query->with('barcodes');
                 $query->with('barcodes');
             }]);
             }]);
         },'tutorials'])->find($id);
         },'tutorials'])->find($id);
@@ -763,10 +765,16 @@ class ProcessController extends Controller
                     ]);
                     ]);
                 }
                 }
                 if (isset($processContent['commodity_barcode'])){
                 if (isset($processContent['commodity_barcode'])){
-                    CommodityBarcode::query()->firstOrCreate([
-                            'commodity_id'=>$processContent['commodity_id'],
-                            'code'=>$processContent['commodity_barcode']]
-                    );
+                    Sign::query()->updateOrCreate([
+                        'signable_type'=>'processes_contents',
+                        'signable_id'=>$processContentOne->id,
+                        'field'=>'commodity_barcode',
+                    ],[
+                        'signable_type'=>'processes_contents',
+                        'signable_id'=>$processContentOne->id,
+                        'field'=>'commodity_barcode',
+                        'mark'=>$processContent['commodity_barcode'],
+                    ]);
                 }
                 }
                 if (isset($processContent['is_update_commodity_sku'])){
                 if (isset($processContent['is_update_commodity_sku'])){
                     Sign::query()->updateOrCreate([
                     Sign::query()->updateOrCreate([

+ 9 - 0
app/Http/Controllers/RejectedBillController.php

@@ -11,6 +11,7 @@ use App\QualityLabel;
 use App\Rejected;
 use App\Rejected;
 use App\RejectedBill;
 use App\RejectedBill;
 use App\RejectedBillItem;
 use App\RejectedBillItem;
+use App\Services\OrderPackageCommoditiesService;
 use Illuminate\Contracts\View\Factory;
 use Illuminate\Contracts\View\Factory;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
@@ -25,6 +26,12 @@ use Ramsey\Uuid\Uuid;
 
 
 class RejectedBillController extends Controller
 class RejectedBillController extends Controller
 {
 {
+    function __construct()
+    {
+
+//        app()->bind('orderPackageCommoditiesService',OrderPackageCommoditiesService::class);
+    }
+
     /**
     /**
      * Display a listing of the resource.
      * Display a listing of the resource.
      *
      *
@@ -83,6 +90,7 @@ class RejectedBillController extends Controller
         $rejectedBill=new RejectedBill($request->all());
         $rejectedBill=new RejectedBill($request->all());
         $rejectedBill['id_operator'] = Auth::user()['id'];
         $rejectedBill['id_operator'] = Auth::user()['id'];
         $rejectedBill->save();
         $rejectedBill->save();
+        $rejectedBill->syncOrderIssue();
 
 
         $this->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         $this->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBill['id']];
         return ['success'=>'true','id'=>$rejectedBill['id']];
@@ -101,6 +109,7 @@ class RejectedBillController extends Controller
         $rejectedBill=RejectedBill::find($request->input('id'));
         $rejectedBill=RejectedBill::find($request->input('id'));
         $rejectedBill->fill($request->all());
         $rejectedBill->fill($request->all());
         $rejectedBill->save();
         $rejectedBill->save();
+        $rejectedBill->syncOrderIssue();
 
 
         $this->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         $this->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true'];
         return ['success'=>'true'];

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

@@ -73,6 +73,8 @@ class RejectedBillItemController extends Controller
         }
         }
         $rejectedBillItem->injectCommodityName();
         $rejectedBillItem->injectCommodityName();
 
 
+        $rejectedBIll = RejectedBill::where('id',$request->input('id_rejected_bill'))->first();
+        $rejectedBIll->syncOrderIssue();
 
 
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBillItem['id']];
         return ['success'=>'true','id'=>$rejectedBillItem['id']];
@@ -94,6 +96,9 @@ class RejectedBillItemController extends Controller
             $rejectedBillItem->fill($request->all());
             $rejectedBillItem->fill($request->all());
             $rejectedBillItem->update();
             $rejectedBillItem->update();
             $rejectedBillItem->injectCommodityName();
             $rejectedBillItem->injectCommodityName();
+            $rejectedBIll = RejectedBill::where('id',$rejectedBillItem->id_rejected_bill)->with('orderIssue')->first();
+
+            $rejectedBIll->syncOrderIssue();
             $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
             $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
             return ['success'=>'true','id'=>$rejectedBillItem['id']];
             return ['success'=>'true','id'=>$rejectedBillItem['id']];
         }
         }

+ 10 - 1
app/Http/Controllers/RejectedController.php

@@ -478,7 +478,6 @@ class RejectedController extends Controller
         return $searchParams;
         return $searchParams;
     }
     }
 
 
-
     //统计页导出
     //统计页导出
     public function exportAnalyze(Request $request){
     public function exportAnalyze(Request $request){
         ini_set('max_execution_time',2500);
         ini_set('max_execution_time',2500);
@@ -489,4 +488,14 @@ class RejectedController extends Controller
         return Excel::download(new Export($row,$data),date('YmdHis', time()).'-退货统计记录单.xlsx');
         return Excel::download(new Export($row,$data),date('YmdHis', time()).'-退货统计记录单.xlsx');
     }
     }
 
 
+    public function apiGetRejectedByLogisticNumberReturn(Request $request){
+        if(!$request->filled('logisticNumberReturn')){
+            return ['success' => false,'fail_info' => '没有传入对应的参数'];
+        }
+        $data =  RejectedBill::with(['items'])->where('logistic_number_return',$request->input('logisticNumberReturn'));
+        if(!$data){
+            return ['success' => false,'fail_info' => '没有对应的退回单'];
+        }
+        return ['success'=>true,'data' => $data];
+    }
 }
 }

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

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

+ 4 - 1
app/Http/Controllers/StoreController.php

@@ -10,6 +10,7 @@ use App\StoreItems;
 use App\Warehouse;
 use App\Warehouse;
 use App\WMSReflectReceive;
 use App\WMSReflectReceive;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Support\Facades\Validator;
 
 
 class StoreController extends Controller
 class StoreController extends Controller
@@ -21,6 +22,7 @@ class StoreController extends Controller
      */
      */
     public function index()
     public function index()
     {
     {
+        if(!Gate::allows('入库管理-快速入库-查询')){ return redirect(url('/'));  }
         $stores=Store::orderBy('id','DESC')->paginate(50);
         $stores=Store::orderBy('id','DESC')->paginate(50);
         return view('store.index',['stores'=>$stores]);
         return view('store.index',['stores'=>$stores]);
     }
     }
@@ -32,6 +34,7 @@ class StoreController extends Controller
      */
      */
     public function create()
     public function create()
     {
     {
+        if(!Gate::allows('入库管理-快速入库-录入')){ return redirect(url('/'));  }
         return view('store.fast.create');
         return view('store.fast.create');
     }
     }
 
 
@@ -43,6 +46,7 @@ class StoreController extends Controller
      */
      */
     public function store(Request $request)
     public function store(Request $request)
     {
     {
+        if(!Gate::allows('入库管理-快速入库-录入')){ return redirect(url('/'));  }
         $this->validator($request);
         $this->validator($request);
         $WMSReflectReceive=WMSReflectReceive::with('skus')->where('ASNNO',$request->input('asn_code'))->first();
         $WMSReflectReceive=WMSReflectReceive::with('skus')->where('ASNNO',$request->input('asn_code'))->first();
         if (!$WMSReflectReceive)return redirect('store/fast/create')->with('successError','ASN编号不存在!');
         if (!$WMSReflectReceive)return redirect('store/fast/create')->with('successError','ASN编号不存在!');
@@ -187,7 +191,6 @@ class StoreController extends Controller
 
 
     public function validator(Request $request){
     public function validator(Request $request){
         $validator=Validator::make($request->input(),[
         $validator=Validator::make($request->input(),[
-//            'asn_code'=>['required','unique:stores,asn_code'],
             'asn_code'=>['required'],
             'asn_code'=>['required'],
             'quality'=>['required'],
             'quality'=>['required'],
             'depository_code'=>['nullable','string'],
             'depository_code'=>['nullable','string'],

+ 43 - 19
app/Http/Controllers/TestController.php

@@ -17,6 +17,7 @@ use App\OracleIdxAsrsReceive;
 use App\Order;
 use App\Order;
 use App\Package;
 use App\Package;
 use App\Process;
 use App\Process;
+use App\ProcessesContent;
 use App\ProcessStatistic;
 use App\ProcessStatistic;
 use App\Rejected;
 use App\Rejected;
 use App\RejectedBill;
 use App\RejectedBill;
@@ -29,6 +30,8 @@ use App\Waybill;
 use App\OraccleBasCustomer;
 use App\OraccleBasCustomer;
 use App\WMSReflectReceive;
 use App\WMSReflectReceive;
 use Carbon\Carbon;
 use Carbon\Carbon;
+use Faker\Factory;
+use Illuminate\Support\Facades\Cache;
 use function Couchbase\zlibCompress;
 use function Couchbase\zlibCompress;
 use function Couchbase\zlibDecompress;
 use function Couchbase\zlibDecompress;
 use Endroid\QrCode\Response\QrCodeResponse;
 use Endroid\QrCode\Response\QrCodeResponse;
@@ -85,27 +88,21 @@ class TestController extends Controller
     function t2(Request $request)
     function t2(Request $request)
     { //x        $packagesBatch=Package::where('batch_number',$batch_number)->first();
     { //x        $packagesBatch=Package::where('batch_number',$batch_number)->first();
 
 
-
-        $objs=OracleDOCOrderHeader::select(['EDI_RESENDTIME'])->where('edisendflag','W')
-            ->where('EDI_RESENDTIME','>',Carbon::now()->subDays(2))
-            ->where('edisendtime','>',Carbon::now()->subDays(2))
-            ->where('ediremarks2','<>','不支持的单据类型')
-            ->get();
-//        ->update(['edisendflag'=>'N','manualflag'=>'N','EDI_RESENDTIME'=>Carbon::now()]);
-        dd($objs);
-
+        $user = factory(User::class)->create();
+        dd($user);
 
 
     }
     }
 
 
-    function tFixWithoutWaveno(Request $request)
+    function setCache(Request $request)
     {
     {
-//        $re=OracleDOCWaveDetails::select(['doc_wave_details.waveno','doc_wave_details.orderno'])->where('doc_order_header.WAVENO','*')
-//            ->leftJoin('DOC_ORDER_HEADER','DOC_ORDER_HEADER.orderno','doc_wave_details.orderno')->get();
-//        dd($re);
-//        $re->each(function($waveDetail){
-//            $o=OracleDOCOrderHeader::where('orderno',$waveDetail['orderno'])->update(['waveno'=>$waveDetail['waveno']]);
-//        });
-////        $orderHeader=OracleDOCOrderHeader::where('waveno',)
+        $today = now();
+        Cache::put('storedTest', $today);
+        return "cacheing:'$today'<script>localStorage.setItem('storedTest','{$today}')</script>";
+    }
+    function getCache(Request $request)
+    {
+        $cache=Cache::get('storedTest');
+        return "cacheing get:'$cache'<script>document.write('<br>localStorage:'+localStorage.getItem('storedTest'))</script>";
     }
     }
     function t1(Request $request)
     function t1(Request $request)
     {
     {
@@ -275,8 +272,35 @@ class TestController extends Controller
     /*1*/
     /*1*/
     function test(Request $request)
     function test(Request $request)
     {/**/
     {/**/
-        $str = (int)'b';
-        dd($str);
+        $units=ProcessesContent::with('signCommodity')->get();
+        foreach ($units as $unit){
+            if ($unit->sign_commodity_name_mark)dd($unit->sign_commodity_name_mark);
+        }
+
+        header("Content-type:text/html;charset=utf-8");
+
+        $stuid = "201301013";
+        $pwd = "136";
+        $uri = "127.0.0.1/login.php";//这里换成你服务器的地址
+        // 参数数组
+        $data = array (
+            'stuid' => $stuid,
+            'pwd' => $pwd
+        );
+
+        $ch = curl_init();  //初始化curl
+
+        curl_setopt ( $ch, CURLOPT_URL, $uri );
+        curl_setopt ( $ch, CURLOPT_POST, 1 );  //使用post请求
+        curl_setopt ( $ch, CURLOPT_HEADER, 0 );
+        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
+        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data);  //提交数据
+        curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, true);  //重定向地址也输出
+        $return = curl_exec ( $ch ); //得到返回值
+
+        curl_close ( $ch );  //关闭
+
+        print_r($return);  //输出返回值
     }
     }
 
 
 }
 }

+ 14 - 2
app/Http/Controllers/UserController.php

@@ -22,10 +22,22 @@ class UserController extends Controller
      *
      *
      * @return Response
      * @return Response
      */
      */
-    public function index()
+    public function index(Request $request)
     {
     {
         if(!Gate::allows('用户-查询')){ return redirect(url('/'));  }
         if(!Gate::allows('用户-查询')){ return redirect(url('/'));  }
-        $users=User::with(['roles','carriers','userWorkgroups'])->orderBy('id','desc')->paginate(35);
+        $query = User::with(['roles','carriers','userWorkgroups']);
+        if($request->has('name')){
+           $query->where('name','like',$request->input('name'));
+        }
+        if($request->has('role')){
+            $role = $request->input('role');
+            $query->whereHas('roles',function($query) use ($role){
+                return $query->where('name','like',$role);
+            });
+        }
+
+//        $users=User::with(['roles','carriers','userWorkgroups'])->orderBy('id','desc')->paginate(35);
+        $users = $query->orderBy('id','desc')->paginate(35);
         $users->each(function (User $user){
         $users->each(function (User $user){
             $user['isSuperAdmin']=$user->isSuperAdmin();
             $user['isSuperAdmin']=$user->isSuperAdmin();
         });
         });

+ 16 - 12
app/Http/Controllers/UserDutyCheckController.php

@@ -48,18 +48,21 @@ class UserDutyCheckController extends Controller
         $user_id = Cache::get('dutyCheckTokenStr_'.$userLaborToken);
         $user_id = Cache::get('dutyCheckTokenStr_'.$userLaborToken);
         if ($userLaborToken && $user_id) {
         if ($userLaborToken && $user_id) {
             $userDetail = UserDetail::find($user_id);
             $userDetail = UserDetail::find($user_id);
-            if (!$userDetail) return redirect('personnel/checking-in/userDutyCheck/createUserDetail/' . $userDetail->mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
-            if($importAndExportQRCodeType=='import') return redirect('personnel/checking-in/userDutyCheck/updateUserLaborCompanies/' . $userDetail->mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
-            $userDutyCheck = $this->importAndExportDutyCheck($user_id, $importAndExportQRCodeType);
-            if ($userDutyCheck && $userDutyCheck->isNotImport == true) return "<h1 style='color: darkred;text-align:center'>当前还未入场,不可出场!</h1>";
-            if ($userDutyCheck && $userDutyCheck->import == true) return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
-            if ($userDutyCheck && $userDutyCheck->export == true) return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
-            if (!$userDutyCheck) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-            $laborReportService = app('LaborReportService');
-            $errorMessage = $laborReportService->makeOrChangeLaborReportByUserDutyCheck($userDutyCheck, $importAndExportQRCodeType);
-            if ($errorMessage) return $errorMessage;
-            $laravelEchoPrefix = config('database.redis.options.prefix');
-            return response()->view('personnel/checking-in/importAndExportSuccess', ['full_name' => $userDetail->full_name, 'checked_at' => $userDutyCheck->checked_at, 'type' => $userDutyCheck->type, 'laravelEchoPrefix' => $laravelEchoPrefix]);
+            if($userDetail){
+//                if (!$userDetail) return redirect('personnel/checking-in/userDutyCheck/createUserDetail/' . $userDetail->mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
+                if($importAndExportQRCodeType=='import') return redirect('personnel/checking-in/userDutyCheck/updateUserLaborCompanies/' . $userDetail->mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
+                $userDutyCheck = $this->importAndExportDutyCheck($user_id, $importAndExportQRCodeType);
+                if ($userDutyCheck && $userDutyCheck->isNotImport == true) return "<h1 style='color: darkred;text-align:center'>当前还未入场,不可出场!</h1>";
+                if ($userDutyCheck && $userDutyCheck->import == true) return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
+                if ($userDutyCheck && $userDutyCheck->export == true) return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
+                if (!$userDutyCheck) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+                $laborReportService = app('LaborReportService');
+                $errorMessage = $laborReportService->makeOrChangeLaborReportByUserDutyCheck($userDutyCheck, $importAndExportQRCodeType);
+                if ($errorMessage) return $errorMessage;
+                $laravelEchoPrefix = config('database.redis.options.prefix');
+                return response()->view('personnel/checking-in/importAndExportSuccess', ['full_name' => $userDetail->full_name, 'checked_at' => $userDutyCheck->checked_at, 'type' => $userDutyCheck->type, 'laravelEchoPrefix' => $laravelEchoPrefix]);
+
+            }
         }
         }
         return view("personnel/checking-in/importAndExportClock", compact('importAndExportQRCodeType'));
         return view("personnel/checking-in/importAndExportClock", compact('importAndExportQRCodeType'));
     }
     }
@@ -297,6 +300,7 @@ class UserDutyCheckController extends Controller
         }
         }
         return "<h1 style='color: red;text-align:center'>进场还未打卡,暂无法进组!</h1>";
         return "<h1 style='color: red;text-align:center'>进场还未打卡,暂无法进组!</h1>";
     }
     }
+
     public function updateLaborReport($user_id,$userWorkgroupID)
     public function updateLaborReport($user_id,$userWorkgroupID)
     {
     {
         $userDetail = UserDetail::find($user_id);
         $userDetail = UserDetail::find($user_id);

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

@@ -25,7 +25,7 @@ class UserLaborController extends Controller
      */
      */
     public function index()
     public function index()
     {
     {
-        $userLabors=UserLabor::with('userDetail')->paginate(50);
+        $userLabors=UserLabor::with('userDetail')->orderBy('user_id','desc')->paginate(50);
 
 
         foreach ($userLabors as $userLabor){
         foreach ($userLabors as $userLabor){
             if($userLabor->userDetail){
             if($userLabor->userDetail){

+ 13 - 2
app/Http/Controllers/api/thirdPart/flux/ProcessController.php

@@ -140,6 +140,7 @@ class ProcessController extends Controller
         //处理重组数据
         //处理重组数据
         $docs=['owner_code'=>[],'sku'=>[]];
         $docs=['owner_code'=>[],'sku'=>[]];
         $commodities=[];
         $commodities=[];
+        $commodity_ids=[];
         $i=0;
         $i=0;
         $docSKUs=array_column($doc->toArray(),'sku');
         $docSKUs=array_column($doc->toArray(),'sku');
         $docOwnerCodes=array_column($docHeader?$docHeader->toArray():$doc->toArray(),'customerid');
         $docOwnerCodes=array_column($docHeader?$docHeader->toArray():$doc->toArray(),'customerid');
@@ -162,7 +163,12 @@ class ProcessController extends Controller
             }
             }
             $commodity->amount=$docOne[$amountColumn];
             $commodity->amount=$docOne[$amountColumn];
             $commodity->lineNo=$docOne[$lineNoColumn];
             $commodity->lineNo=$docOne[$lineNoColumn];
-            array_push($commodities,$commodity->toArray());
+            if (isset($commodity_ids[$commodity->id]))
+                $commodities[$commodity_ids[$commodity->id]]['amount'] += $commodity->amount;
+            else{
+                array_push($commodities,$commodity->toArray());
+                $commodity_ids[$commodity->id] = count($commodities)-1;
+            }
             unset($doc[$i]);
             unset($doc[$i]);
             $i++;
             $i++;
         }
         }
@@ -185,7 +191,12 @@ class ProcessController extends Controller
                 if (!$commodity)continue;
                 if (!$commodity)continue;
                 $commodity->amount=$docOne[$amountColumn];
                 $commodity->amount=$docOne[$amountColumn];
                 $commodity->lineNo=$docOne[$lineNoColumn];
                 $commodity->lineNo=$docOne[$lineNoColumn];
-                array_push($commodities,$commodity->toArray());
+                if (isset($commodity_ids[$commodity->id]))
+                    $commodities[$commodity_ids[$commodity->id]]['amount'] += $commodity->amount;
+                else{
+                    array_push($commodities,$commodity->toArray());
+                    $commodity_ids[$commodity->id] = count($commodities)-1;
+                }
             }
             }
         }
         }
         return $commodities;
         return $commodities;

+ 100 - 0
app/Imports/OrderIssueImport.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Imports;
+
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderIssue;
+use App\OrderIssueProcessLog;
+use App\OrderIssueType;
+use Doctrine\DBAL\Connection;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
+use Maatwebsite\Excel\Concerns\ToCollection;
+use Maatwebsite\Excel\Concerns\WithHeadingRow;
+use Maatwebsite\Excel\Concerns\WithMultipleSheets;
+use Maatwebsite\Excel\Imports\HeadingRowFormatter;
+
+HeadingRowFormatter::default('none');
+
+class OrderIssueImport implements ToCollection, WithHeadingRow,WithMultipleSheets
+{
+
+    public function Collection(Collection $collection)
+    {
+        $endIS = false;
+        if (!isset($collection->toArray()[0]['原始运单号']) || !isset($collection->toArray()[0]['情况说明']) || !isset($collection->toArray()[0]['问题类别']))
+            Cache::put('error', '请检查您第一行标题是否存在原始运单号,情况说明,问题类别');
+        else $endIS = true;
+        $exception = [];
+        $sum = 2;
+        $orderService = app('orderService');
+        $orderIssueService = app('orderIssueService');
+        $orderIssues = [];
+        if ($endIS) {
+            foreach ($collection as $row) {
+
+                if (!$row['原始运单号']) {
+                    array_push($exception, ['第' . $sum . '行数据运单号为空!']);
+                    $sum++;
+                    continue;
+                }
+                if (!$row['情况说明']) {
+                    array_push($exception, ['第' . $sum . '行问题说明为空!']);
+                    $sum++;
+                    continue;
+                }
+                if (!$row['问题类别']) {
+                    array_push($exception, ['第' . $sum . '行问题类别为空!']);
+                    $sum++;
+                    continue;
+                }
+                if(OracleDOCOrderHeader::where('orderNo',$row['原始运单号'])->count() == 0){
+                    array_push($exception, ['订单' . $row['原始运单号'] . '运单号不存在']);
+                    continue;
+                }
+                $order = Order::with('issue')->where('code', $row['原始运单号'])->first();
+
+                $orderHeader =OracleDOCOrderHeader::where('orderNo',$row['原始运单号'])->first();
+                if (!$row['问题类别']) {
+                    array_push($exception, ['订单' . $row['原始运单号'] . '没有对应的问题类别']);
+                } else if (!$orderHeader) {
+                    array_push($exception, ['订单' . $row['原始运单号'] . '对应的WMS运单不存在']);
+                } else if (isset($order->issue) ) {
+                    array_push($exception, ['订单' . $row['原始运单号'] . '对应的问题件已存在']);
+                } else {
+                    $type = OrderIssueType::where('name',$row['问题类别'])->first();
+                    if ($type == null) {
+                        array_push($exception, ['订单' . $row['原始运单号'] . '没有对应的问题类别']);
+                        continue;
+                    }
+                    $order = $orderService->createOrderByWMSOrderNo($row['原始运单号']);
+                    if (!$order) {
+
+                        $orderIssue = $orderIssueService->createOrFind($row['原始运单号']);
+                        $orderIssue->order_issue_type_id = $type->id;
+                        $orderIssue->save();
+
+                        if (!$orderIssue) {
+                            array_push($exception, ['订单' . $row['原始运单号'] . '问题件创建失败']);
+                        }
+                        OrderIssueProcessLog::create(['order_issue_id'=>$orderIssue['id'],'user_id'=>Auth::user()['id'],'content'=>'创建订单问题件','type'=>'创建']);
+                        array_push($orderIssues, $orderIssue);
+                    }
+                }
+                $sum++;
+            }
+        }
+        Cache::put('exception', $exception, 86400);
+    }
+
+    /**
+     * 该方法是实现上传文件只选中 第一个表
+     * ExcelImprot 默认是有多少个分表就执行多少次的分表
+     * @return OrderIssueImport[]|array
+     */
+    public function sheets():array{
+        return [0=>new OrderIssueImport()];
+    }
+}

+ 4 - 0
app/OracleDOCASNDetail.php

@@ -10,4 +10,8 @@ class OracleDOCASNDetail extends Model
     use ModelTimeFormat;
     use ModelTimeFormat;
     protected $connection="oracle";
     protected $connection="oracle";
     protected $table="Doc_ASN_Details";
     protected $table="Doc_ASN_Details";
+
+    public function sku(){
+        return OracleBasSKU::where(['sku'=>$this->sku,'customerId'=>$this->customerId])->get();
+    }
 }
 }

+ 14 - 0
app/OracleDOCASNHeader.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class OracleDOCASNHeader extends Model
+{
+    //
+    use ModelTimeFormat;
+    protected $connection="oracle";
+    protected $table="Doc_ASN_Header";
+}

+ 5 - 0
app/OracleDOCOrderDetail.php

@@ -8,4 +8,9 @@ class OracleDOCOrderDetail extends Model
 {
 {
     protected $connection="oracle";
     protected $connection="oracle";
     protected $table="DOC_Order_Details";
     protected $table="DOC_Order_Details";
+    protected $fillable = ['sku','customerId'];
+
+    public function sku(){
+        return $this->belongsTo('App\OracleBasSKU','sku','sku');
+    }
 }
 }

+ 83 - 0
app/Order.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class Order extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = [
+        'created_at','code','shop_id','owner_id',
+        'logistic_id','consignee_name','consignee_phone','province',
+        'city','district','address','wms_status'];
+
+    protected $appends = [
+        'creator',
+        'logisticNumbers',
+        'amount',
+    ];
+
+    public function logistic(){
+        return $this->belongsTo('App\Logistic','logistic_id','id');
+    }
+
+    public function issue(){
+        return $this->hasOne('App\OrderIssue','id','order_id');
+    }
+
+    public function shop(){
+        return $this->belongsTo('App\Shop','shop_id','id');
+    }
+
+    public function owner(){
+        return $this->belongsTo('App\Owner','owner_id','id');
+    }
+
+    public function packages(){
+        return $this->hasMany('App\OrderPackage','order_id','id');
+    }
+
+    public function setCreatorAttribute ($id,$user_id){
+        Sign::updateOrCreate(['signable_type'=>'orders','signable_id'=>$id,'field'=>'creator','mark'=>$user_id]);
+    }
+
+    public function getCreatorAttribute(){
+       return  $this->hasOne('App\Sign','signable_id','id')
+            ->where('signable_type','orders')
+            ->where('field','creator')
+            ->value('mark');
+    }
+
+    public function getlogisticNumbersAttribute(){
+        $packages = $this->packages();
+        if(!$packages){
+            return [];
+        }else{
+            $arr = [];
+           foreach ( $packages->get() as $package){
+               $arr[] = $package->logistic_number;
+           }
+           return $arr;
+        }
+    }
+
+    public function getAmountAttribute(){
+        $packages = $this->packages();
+        if(!$packages){
+            return 0;
+        }else{
+            $count = 0;
+            foreach ( $packages->get() as $package){
+                foreach ($package->commodities as $item){
+                    $count += $item->amount;
+                }
+            }
+            return $count;
+        }
+    }
+
+}

+ 54 - 0
app/OrderIssue.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderIssue extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = [
+        'order_id','handle_status','create_at','rejected_bill_id','rejecting_status','result_explain',
+        'situation_explain', 'order_issue_type_id','second_order_id','is_new_rejecting',
+        'final_status','logistic_indemnity_money','logistic_express_remission','baoshi_indemnity_money','baoshi_express_remission','user_workgroup_id'];
+
+    protected $appends = [
+        'secondLogisticNumber',
+    ];
+
+    public function order(){
+        return $this->belongsTo('App\Order','order_id','id');
+    }
+
+    public function rejectedBill(){
+        return $this->belongsTo('App\RejectedBill','rejected_bill_id','id');
+    }
+
+    public function issueType(){
+        return $this->belongsTo('App\OrderIssueType','order_issue_type_id','id');
+    }
+
+    public function logs(){
+        return $this->hasMany('App\OrderIssueProcessLog','order_issue_id','id');
+    }
+
+    public function top(){
+        return $this->hasOne('App\OrderIssueOnTop','order_issue_id','id');
+    }
+
+    public function userWorkGroup(){
+        return $this->belongsTo('App\UserWorkgroup','user_workgroup_id','id');
+    }
+
+    public function secondOrder(){
+        return $this->belongsTo('App\Order','second_order_id','id');
+    }
+
+    public function getSecondLogisticNumberAttribute(){
+        return $this['secondOrder'] ? $this['secondOrder']['code'] : null;
+    }
+
+}

+ 19 - 0
app/OrderIssueOnTop.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderIssueOnTop extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = [ 'order_issue_id','remark'];
+
+    public function OrderIssue(){
+        return $this->belongsTo('App\OrderIssue','order_issue_id','id');
+    }
+
+}

+ 21 - 0
app/OrderIssueProcessLog.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderIssueProcessLog extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = ['order_issue_id','user_id','content','type'];
+
+    public function orderIssue(){
+        return $this->belongsTo('App\OrderIssue','order_issue_id','id');
+    }
+    public function user(){
+        return $this->belongsTo('App\User','user_id','id');
+    }
+}

+ 19 - 0
app/OrderIssueType.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderIssueType extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = ['name'];
+
+    public function orderIssue(){
+        return $this->hasMany('App/OrderIssue','order_issue_type_id','id');
+    }
+
+}

+ 24 - 0
app/OrderPackage.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderPackage extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = ['order_id','logistic_number'];
+
+
+    public function order(){
+        return $this->belongsTo('App\Order','order_id','id');
+    }
+
+    public function commodities(){
+        return $this->hasMany('App\OrderPackageCommodities','order_package_id','id');
+    }
+
+}

+ 22 - 0
app/OrderPackageCommodities.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderPackageCommodities extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = ['order_package_id','commodity_id','amount'];
+
+    public function package(){
+        return $this->belongsTo('App\OrderPackage','order_package_id','id');
+    }
+
+    public function commodity(){
+        return $this->belongsTo('App\Commodity','commodity_id','id');
+    }
+}

+ 10 - 1
app/ProcessesContent.php

@@ -15,6 +15,7 @@ class ProcessesContent extends Model
         'commodity_name',
         'commodity_name',
         'sign_commodity_name_mark',
         'sign_commodity_name_mark',
         'sign_commodity_sku_mark',
         'sign_commodity_sku_mark',
+        'sign_commodity_barcode_mark',
     ];
     ];
 
 
     public function process(){
     public function process(){
@@ -31,6 +32,10 @@ class ProcessesContent extends Model
         return $this->hasOne('App\Sign','signable_id','id')
         return $this->hasOne('App\Sign','signable_id','id')
             ->where('signable_type','processes_contents')->where('field','commodity_sku');
             ->where('signable_type','processes_contents')->where('field','commodity_sku');
     }
     }
+    public function signCommodityBarcode(){
+        return $this->hasOne('App\Sign','signable_id','id')
+            ->where('signable_type','processes_contents')->where('field','commodity_barcode');
+    }
 
 
     public function getCommodityNameAttribute()
     public function getCommodityNameAttribute()
     {
     {
@@ -42,6 +47,10 @@ class ProcessesContent extends Model
     }
     }
     public function getSignCommoditySkuMarkAttribute()
     public function getSignCommoditySkuMarkAttribute()
     {
     {
-        return $this['signCommodityName']? $this['signCommoditySku']['mark']:null;
+        return $this['signCommoditySku']? $this['signCommoditySku']['mark']:null;
+    }
+    public function getSignCommodityBarcodeMarkAttribute()
+    {
+        return $this['signCommodityBarcode']? $this['signCommodityBarcode']['mark']:null;
     }
     }
 }
 }

+ 98 - 1
app/RejectedBill.php

@@ -4,10 +4,11 @@ namespace App;
 
 
 use App\Http\Controllers\Controller;
 use App\Http\Controllers\Controller;
 use App\Http\Controllers\LogisticNumberFeatureController;
 use App\Http\Controllers\LogisticNumberFeatureController;
+use App\Services\OrderPackageCommoditiesService;
 use Carbon\Carbon;
 use Carbon\Carbon;
-use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Auth;
 use Overtrue\LaravelPinyin\Facades\Pinyin;
 use Overtrue\LaravelPinyin\Facades\Pinyin;
 
 
@@ -62,6 +63,9 @@ class RejectedBill extends Model
         $this['checked_numbers']=$initials.Carbon::now()->format('Ymd').$owner->getIncreasedCheckingCount();
         $this['checked_numbers']=$initials.Carbon::now()->format('Ymd').$owner->getIncreasedCheckingCount();
         return $this['checked_numbers'];
         return $this['checked_numbers'];
     }
     }
+    function orderIssue(){
+        return $this->hasOne('App\OrderIssue','rejected_bill_id','id');
+    }
 
 
     function update(array $attributes = [], array $options = [])
     function update(array $attributes = [], array $options = [])
     {
     {
@@ -132,4 +136,97 @@ class RejectedBill extends Model
         $this->update();
         $this->update();
         return $this['is_loaded'];
         return $this['is_loaded'];
     }
     }
+
+    public function syncOrderIssue(){
+        $orderIssue = $this->orderIssue()->first();
+        if(isset($orderIssue)){
+           $this-> judgeRejectingStatus($orderIssue);
+           OrderIssue::where('id',$orderIssue['id'])->update(['is_new_rejecting'=>'有']);
+        }
+    }
+
+    private function judgeRejectingStatus(OrderIssue $orderIssue)
+    {
+        $orderPackageCommoditiesService = new OrderPackageCommoditiesService();
+        $rejectedItems = [];
+        $orderItems = [];
+        if ($orderIssue->rejected_bill_id) {
+            $rejectedBill = RejectedBill::find($orderIssue->rejected_bill_id)->first();
+            $rejectedBillItems = RejectedBillItem::where('id_rejected_bill', $rejectedBill->id)->get();
+            if ($rejectedBillItems) {
+                foreach ($rejectedBillItems as $item) {
+                    if(!isset($rejectedItems[$item->barcode_goods])){
+                        $rejectedItems[$item->barcode_goods]  =0;
+                    }
+                    $rejectedItems[$item->barcode_goods] = $item->amount + $rejectedItems[$item->barcode_goods] ?? 0;
+                }
+            }
+        } else {
+            $orderIssue->update(['rejecting' => '无']);
+            $orderIssue->save();
+            return;
+        }
+        if ($orderIssue->order_id) {
+            $orderPackageCommodities = $orderPackageCommoditiesService->getOrderPackageCommoditiesByOrderId($orderIssue->order_id);
+            if ($orderPackageCommodities) {
+                foreach ($orderPackageCommodities as $key => $item) {
+                    if (!isset($orderItems[$item->commodity->sku])) {
+                        Arr::add($orderItems,$item->commodity->sku,0);
+                    }
+                    $orderItems[$item->commodity->sku] = $orderItems[$item->commodity->sku] ?? 0 + $item->amount;
+                }
+            } else {
+                $orderIssue->update(['rejecting_status' => '未退回']);
+                $orderIssue->save();
+                return;
+            }
+        }
+
+        $rejectedExcess = 0;    // 退回差异
+        $rejectedReview = 0;    // 退回复核  $rejectedItems == $orderItems
+        foreach ($rejectedItems as $key => $items) {
+            if (!isset($orderItems[$key])) {
+                $rejectedExcess++;
+            } else {
+                if ($rejectedItems[$key] == $orderItems[$key]) {
+                    $rejectedReview++;
+                }
+            }
+        }
+        if ($rejectedExcess > 0) {
+            $orderIssue->update(['rejecting_status' => '差异退回']);
+            $orderIssue->save();
+            return;
+        }
+        $isExcess = 0; // 超量 $orderItems < $rejectedItems
+        $isDiff = 0;   // 部分 $orderItems > $rejectedItems
+        $isAccord = 0; // 相同 $orderItems == $rejectedItems
+        $isLack = 0;   // 缺少 $orderItems != $rejectedItems
+        foreach ($orderItems as $key => $item) {
+            if (isset($rejectedItems[$key])) {
+                if ($orderItems[$key] > $rejectedItems[$key]) {
+                    $isExcess++;
+                } else if ($orderItems[$key] < $rejectedItems[$key]) {
+                    $isDiff++;
+                } else if ($orderItems[$key] == $rejectedItems[$key]) {
+                    $isAccord++;
+                }
+            } else {
+                $isLack++;
+            }
+        }
+        if ($isAccord == $rejectedReview) {
+            $orderIssue->update(['rejecting_status' => '全部退回']);
+            $orderIssue->save();
+            return;
+        } else if ($isDiff > 0 and $isLack >= 0) {
+            $orderIssue->update(['rejecting_status' => '部分退回']);
+            $orderIssue->save();
+            return;
+        } else if ($isExcess > 0 and $isDiff == 0) {
+            $orderIssue->update(['rejecting_status' => '超量退回']);
+            $orderIssue->save();
+            return;
+        }
+    }
 }
 }

+ 4 - 4
app/Services/LogisticService.php

@@ -1,13 +1,13 @@
-<?php 
+<?php
 
 
-namespace App\Services; 
+namespace App\Services;
 
 
 use App\Logistic;
 use App\Logistic;
 
 
 Class LogisticService
 Class LogisticService
-{ 
+{
     public function get(){
     public function get(){
         return Logistic::get();
         return Logistic::get();
     }
     }
 
 
-}
+}

+ 10 - 0
app/Services/OracleDOCOrderHeaderService.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Services;
+
+use App\OracleDOCOrderHeader;
+
+Class OracleDOCOrderHeaderService
+{
+
+}

+ 438 - 0
app/Services/OrderIssueService.php

@@ -0,0 +1,438 @@
+<?php
+
+namespace App\Services;
+
+use App\OracleDOCASNDetail;
+use App\OracleDOCASNHeader;
+use App\OracleDOCOrderDetail;
+use App\OracleDOCOrderHeader;
+use App\OrderIssue;
+use App\OrderIssueOnTop;
+use App\OrderIssueProcessLog;
+use App\OrderPackage;
+use App\Order;
+use App\OrderPackageCommodities;
+use App\RejectedBill;
+use App\RejectedBillItem;
+use App\Sign;
+use Illuminate\Http\Request;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Validator;
+
+class OrderIssueService
+{
+
+    public function __construct()
+    {
+        app()->bind("orderService", OrderService::class);
+        app()->bind("rejectedService", RejectedService::class);
+        app()->bind("orderPackageCommoditiesService", OrderPackageCommoditiesService::class);
+    }
+
+    public function getQuery(array $arr, array $condition = null)
+    {
+        if (!isset($condition)) {
+            $condition = $arr;
+        }
+        $user = Auth::user();
+        $owner_ids = $user ? $user->getPermittingOwnerIdsAttribute() : [];
+        $order_ids = [];
+        if (isset($condition['owner_id'])) {
+            $owner_ids = explode(',', $condition['owner_id']);
+        }
+        $orderIssues = OrderIssue::whereHas('order', function ($query) use ($owner_ids) {
+            $query->whereHas('owner', function ($query) use ($owner_ids) {
+                return $query->whereIn('id', $owner_ids);
+            });
+        })->get();
+
+        $orders = Order::select('id')->whereIn('owner_id', $owner_ids)->get();
+        foreach ($orders as $order) {
+            array_push($order_ids, $order['id']);
+        }
+        $query = OrderIssue::with(['top', 'userWorkGroup', 'issueType', 'logs' => function ($query) {
+            return $query->with(['user'])->orderByDesc('created_at');
+        }, 'order' => function ($query) use ($order_ids) {
+            return $query->whereIn('id', $order_ids)->with(['shop', 'logistic', 'owner', 'packages' => function ($query) {
+                return $query->with(['commodities' => function ($query) {
+                    return $query->with('commodity');
+                }]);
+            }]);
+        }, 'rejectedBill' => function ($query) {
+            return $query->with(['items']);
+        }, 'secondOrder' => function ($query) {
+            return $query->with(['shop', 'logistic', 'owner', 'packages' => function ($query) {
+                return $query->with(['commodities' => function ($query) {
+                    return $query->with('commodity');
+                }]);
+            }]);
+        }])->whereHas('order', function ($query) use ($owner_ids) {
+            $query->whereHas('owner', function ($query) use ($owner_ids) {
+                return $query->whereIn('id', $owner_ids);
+            });
+        });
+        // ->whereIn('order_id', $order_ids)
+        $query->selectRaw('order_issues.* ,order_issue_on_tops.id top_id ,order_issue_on_tops.remark,order_issue_on_tops.updated_at top_update')
+            ->leftJoin('order_issue_on_tops', 'order_issue_on_tops.order_issue_id', '=', 'order_issues.id')
+            ->whereNull('order_issue_on_tops.deleted_at')
+            ->orderBy('order_issue_on_tops.updated_at', 'desc')
+            ->orderBy('order_issues.id', 'desc');
+        return $query;
+    }
+
+    public function getConditionQuery(array $arr , array $condition = null)
+    {
+        $query = $this->getQuery($arr, $condition);
+        if (!isset($condition)) {
+            $condition = $arr;
+        }
+        if (isset($condition['created_at_start'])) {
+            $query->where('created_at', '>=', $condition['created_at_start'] . " 00:00:00");
+        }
+        if (isset($condition['created_at_end'])) {
+            $query->where('created_at', '<=', $condition['created_at_end'] . " 23:59:59");
+        }
+        if (isset($condition['final_status'])) {
+            $query->where('final_status', $condition['final_status']);
+        }
+        if (isset($condition['handle_status'])) {
+            $query->where('handle_status', intval($condition['handle_status']));
+        }
+        if (isset($condition['logistic_indemnity_money'])) {
+            $query->where('logistic_indemnity_money', $condition['logistic_indemnity_money']);
+        }
+        if (isset($condition['baoshi_express_remission'])) {
+            $query->where('baoshi_express_remission', $condition['baoshi_express_remission']);
+        }
+        if (isset($condition['is_new_rejecting'])) {
+            $query->where('is_new_rejecting', $condition['is_new_rejecting']);
+        }
+        if (isset($condition['order_issue_ids'])) {
+            $orderIssuesId = $condition['order_issue_ids'];
+            if (is_string($orderIssuesId)) {
+                $orderIssuesId = explode(',', $orderIssuesId);
+            }
+            $query->whereIn('order_issues.id', $orderIssuesId);
+        }
+//        dd($query->toSql());
+        return $query;
+    }
+
+    public function paginate(array $arr)
+    {
+        return $this->getConditionQuery($arr)->paginate(isset($arr['paginate'])??50);
+    }
+
+    public function orderIssueTag(array $arr)
+    {
+        $orderNos = $arr['orderNos'];
+        $meg = ['success' => false];
+        if ($this->verifyOrderIssue($arr)) {
+            $meg['fail_info'] = '传入订单编号中对应的订单问题已有生成';
+            return $meg;
+        }
+        foreach ($orderNos as $orderNo) {
+            $orderIssue = $this->createOrFind($orderNo);
+            OrderIssueProcessLog::create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '标记创建订单问题件', 'type' => '创建']);
+        }
+        $meg['success'] = true;
+        return $meg;
+    }
+
+    public function createOrFind($orderNo)
+    {
+        $orderService = app('orderService');
+        $rejectedService = app('rejectedService');
+        $order = $orderService->createOrderByWMSOrderNo($orderNo);
+        $arr = [
+            'order_id' => $order->id,
+        ];
+        $orderIssue = OrderIssue::create($arr);
+        if ($order->code) {
+            $rejectedBill = $rejectedService->getRejectedByWMSOrderNo($order->code);
+            if ($rejectedBill) {
+                $orderIssue->rejected_bill_id = $rejectedBill['id'];
+                $orderIssue->save();
+            }
+        }
+        $this->judgeRejectingStatus($orderIssue);
+        $orderIssue->order = $order;
+        return $orderIssue;
+    }
+
+    /*    public function createOrderIssue(Request $request)
+        {
+            $orderService = app('orderService');
+            $this->validatorCreate($request)->validate();
+            $oracleOrderNo = $request->input('order_id');
+            $logistic_number = $request->input('logistic_number');
+            $order = $orderService->creted($oracleOrderNo);
+            $this->create($request);
+        }*/
+
+    public function validatorCreate(Request $request)
+    {
+        return Validator::make($request->input(), [
+            'rejected_bill_id' => ['nullable'],
+            'order_id' => ['nullable'],
+            'owner_id'=>['required'],
+            'second_order_id' => ['nullable'],
+            'logistic_id' => ['nullable'],
+            'order_issue_type_id' => ['required'],
+            'baoshi_indemnity_money' => ['numeric', 'nullable'],
+            'logistic_indemnity_money' => ['numeric', 'nullable'],
+            'final_status' => ['nullable'],
+            'result_explain' => ['nullable']
+        ], [
+            'required' => ':attribute 为必填项',
+            'unique' => ':attribute 已存在',
+            'numeric' => ':attribute 为数组',
+        ], [
+            'owner_id'=>'货主',
+            'rejected_bill_id' => '退回单号',
+            'order_id' => '订单ID',
+            'second_order_id' => '退回订单id',
+            'logistic_id' => '承运人',
+            'order_issue_type_id' => '问题类别',
+            'baoshi_indemnity_money' => '宝时赔偿金额',
+            'logistic_indemnity_money' => '承运商赔偿金额',
+            'final_status' => '最终状态',
+            'result_explain' => '处理结果说明',
+        ]);
+    }
+
+    public function create(array $arr)
+    {
+        $orderIssue = OrderIssue::create($arr);
+        if (!$arr['order_id']) {
+            $order = Order::create($arr);
+            $orderIssue->order_id = $order['id'];
+            $orderIssue->save();
+        }
+        if (!$arr['rejected_bill_id']) {
+            $orderIssue->update(['rejecting_status' => '无']);
+        } else {
+            $this->judgeRejectingStatus($orderIssue);
+        }
+        return $orderIssue;
+    }
+
+    public function judgeRejectingStatus(OrderIssue $orderIssue)
+    {
+        $orderPackageCommoditiesService = new OrderPackageCommoditiesService();
+        $rejectedItems = [];
+        $orderItems = [];
+        if ($orderIssue->rejected_bill_id) {
+            $rejectedBill = RejectedBill::find($orderIssue->rejected_bill_id)->first();
+            $rejectedBillItems = RejectedBillItem::where('id_rejected_bill', $rejectedBill->id)->get();
+            if ($rejectedBillItems) {
+                foreach ($rejectedBillItems as $item) {
+                    if (!isset($rejectedItems[$item->barcode_goods])) {
+                        $rejectedItems[$item->barcode_goods] = 0;
+                    }
+                    $rejectedItems[$item->barcode_goods] = $item->amount + $rejectedItems[$item->barcode_goods] ?? 0;
+                }
+            }
+        } else {
+            $orderIssue->update(['rejecting' => '无']);
+            $orderIssue->save();
+            return;
+        }
+        if ($orderIssue->order_id) {
+            $orderPackageCommodities = $orderPackageCommoditiesService->getOrderPackageCommoditiesByOrderId($orderIssue->order_id);
+            if ($orderPackageCommodities) {
+                foreach ($orderPackageCommodities as $key => $item) {
+                    if (!isset($orderItems[$item->commodity->sku])) {
+                        Arr::add($orderItems, $item->commodity->sku, 0);
+                    }
+                    $orderItems[$item->commodity->sku] = $orderItems[$item->commodity->sku] ?? 0 + $item->amount;
+                }
+            } else {
+                $orderIssue->update(['rejecting_status' => '未退回']);
+                $orderIssue->save();
+                return;
+            }
+        }
+
+        $rejectedExcess = 0;    // 退回差异
+        $rejectedReview = 0;    // 退回复核  $rejectedItems == $orderItems
+        foreach ($rejectedItems as $key => $items) {
+            if (!isset($orderItems[$key])) {
+                $rejectedExcess++;
+            } else {
+                if ($rejectedItems[$key] == $orderItems[$key]) {
+                    $rejectedReview++;
+                }
+            }
+        }
+        if ($rejectedExcess > 0) {
+            $orderIssue->update(['rejecting_status' => '差异退回']);
+            $orderIssue->save();
+            return;
+        }
+        $isExcess = 0; // 超量 $orderItems < $rejectedItems
+        $isDiff = 0;   // 部分 $orderItems > $rejectedItems
+        $isAccord = 0; // 相同 $orderItems == $rejectedItems
+        $isLack = 0;   // 缺少 $orderItems != $rejectedItems
+        foreach ($orderItems as $key => $item) {
+            if (isset($rejectedItems[$key])) {
+                if ($orderItems[$key] > $rejectedItems[$key]) {
+                    $isExcess++;
+                } else if ($orderItems[$key] < $rejectedItems[$key]) {
+                    $isDiff++;
+                } else if ($orderItems[$key] == $rejectedItems[$key]) {
+                    $isAccord++;
+                }
+            } else {
+                $isLack++;
+            }
+        }
+        if ($isAccord == $rejectedReview) {
+            $orderIssue->update(['rejecting_status' => '全部退回']);
+            $orderIssue->save();
+            return;
+        } else if ($isDiff > 0 and $isLack >= 0) {
+            $orderIssue->update(['rejecting_status' => '部分退回']);
+            $orderIssue->save();
+            return;
+        } else if ($isExcess > 0 and $isDiff == 0) {
+            $orderIssue->update(['rejecting_status' => '超量退回']);
+            $orderIssue->save();
+            return;
+        }
+    }
+
+    public function createByLogisticNumber(array $arr)
+    {
+        $orderService = app('orderService');
+        $order = Order::create($arr);
+        $orderIssue = OrderIssue::create($arr);
+        $orderIssue->order_id = $order['id'];
+        OrderPackage::create(['order_id' => $order->id, 'logistic_number' => $arr['logistic_number_return']]);
+        $orderIssue->update();
+        return $orderIssue;
+    }
+
+    public function verifyOrderIssue( array $arr)
+    {
+        $orderIds = $arr['orderNos'];
+        $orders = Order::whereIn('code', $orderIds)->get();
+        if (count($orders) == 0) {
+            return false;
+        }
+        $order_ids = [];
+        foreach ($orders as $order) {
+            $order_ids[] = $order->id;
+        }
+        $count = OrderIssue::whereIn('order_id', $order_ids)->count();
+        return $count != 0;
+    }
+
+    /*    public function verifyOracleOrderNo(Request $request)
+        {
+            $meg = ['success' => false];
+            $oracleOrderNo = $request->input('oracleOrderNo');
+            $type = $request->input('type');
+            $orderHeader = OracleDOCOrderHeader::where('OrderNo', trim($oracleOrderNo, "'"))->first();
+            if ($orderHeader == null) {
+                $meg['fail_info'] = '没有编号对应的订单信息';
+            } else {
+                if ($type == 'backExpressNumber') {
+
+                    $orderASNHeader = OracleDOCASNHeader::where('ASNReference2', $orderHeader->soreference1)->first();
+
+                    if ($orderASNHeader == null) {
+                        $meg['fail_info'] = '没有对应的退件信息';
+                    } else {
+                        $express_number = $orderASNHeader->asnreference3; // 快递单号
+                        $express_number == null ? $meg['fail_info'] = '没有对应的快递单号' : ($meg['success'] = true && $meg['expressNumber'] = $express_number);
+                    }
+                } else if ($type == 'verify') {
+                    if (!$orderHeader) {
+                        $mes['fail_info'] = '编号对应的订单信息不存在';
+                    } else {
+                        $mes['success'] = true;
+                    }
+                }
+            }
+            return $meg;
+        }*/
+
+    /*    public function verifyLogisticNumber(Request $request)
+        {
+            $logisticNumber = $request->input('logisticNumber');
+            $ASNHeader = OracleDOCASNHeader::where('ASNReference2', $logisticNumber)->first();
+            $orderHeader = OracleDOCOrderHeader::where('soreference1', $ASNHeader->asnreference3)->first();
+            $meg = ['success' => false];
+            if (!$orderHeader) {
+                $meg['fail_info'] = '快递单号没有对应的订单';
+            }
+            return $meg['success'] = true;
+        }*/
+
+//    public function getOrderHead(Request $request)
+//    {
+//        $data = ['orderHeader' => null, 'orderDetails' => null, 'rejectedBill' => null];
+//        $logisticNumberReturn = $request->input('logisticNumberReturn');
+//        $ASNOrderHeaders = OracleDOCASNHeader::where('ASNReference3', $logisticNumberReturn)->get();
+//        if (count($ASNOrderHeaders) == 0) {
+//            return $data;
+//        }
+//        $orderHeader = OracleDOCOrderHeader::where('SOReference1', $ASNOrderHeaders->asnreference3)->get();
+//        $data['orderHeader'] = $orderHeader;
+//        $orderDetails = OracleDOCASNDetail::with(['sku'])->where('OrderNo', $orderHeader)->get();
+//        $data['orderDetails'] = $orderDetails;
+//
+//        return $data;
+//    }
+
+    public function getReturnLogisticInfo(Request $request)
+    {
+        $logisticNumberReturn = $request->input('logisticNumberReturn');
+        $ASNOrderHeaders = OracleDOCASNHeader::where('ASNReference3', $logisticNumberReturn)->get();
+        $ASNNo = [];
+        foreach ($ASNOrderHeaders as $ASNOrderHeader) {
+            $ASNNo[] = $ASNOrderHeader->asnno;
+        }
+        return OracleDOCASNDetail::whereIn('asnno', $ASNNo)->get();
+    }
+
+    public function getOrderHeadByOrderNo(Request $request)
+    {
+        $orderNo = $request->input('orderNo');
+        $orderHeader = OracleDOCOrderHeader::where('orderNo', $orderNo)->get();
+        $orderDetails = OracleDOCOrderDetail::with(['sku'])->where('orderNo', $orderNo)->get();
+        return ['orderHeader' => $orderHeader, 'orderDetails' => $orderDetails];
+    }
+
+    public function exportExcel(Request $request)
+    {
+        $result = null;
+        if ($request->getMethod() == 'GET') {
+// 所有页
+            if ($request->has('checkAllSign')) {
+                $result = $this->getConditionQuery($request, null)->get();
+            }
+        } else if ($request->getMethod() == 'POST') {
+// 选中
+            $orderIssueIds = $request->input('data');
+            $ids = explode(',', $orderIssueIds);
+            $result = $this->getConditionQuery($request, ['order_issue_ids' => $ids])->get();
+        }
+        return $result;
+    }
+
+    public function paddingData(array $row, array $rowData)
+    {
+        foreach ($rowData as $key => $value) {
+            foreach ($row as $rowKey) {
+                if (!isset($value[$rowKey])) {
+                    $value[$rowKey] = '';
+                }
+            }
+        }
+        return $rowData;
+    }
+
+}

+ 48 - 0
app/Services/OrderPackageCommoditiesService.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Services;
+
+use App\Commodity;
+use App\OracleActAllocationDetails;
+use App\OracleBasSKU;
+use App\OracleDOCOrderDetail;
+use App\Order;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\Owner;
+
+class OrderPackageCommoditiesService
+{
+    public function createdOrderPackage(OrderPackage $orderPackage)
+    {
+        $detail = OracleActAllocationDetails::where('picktotraceid',$orderPackage->logistic_number)->first();
+        $owner = Owner::where(['code' => $detail->customerid])->first();      // 货主
+        $sku = $detail->sku;
+        $owner_id = $owner->id;
+        $commodity = Commodity::where(['sku' => $sku, 'owner_id' => $owner_id])->first();
+        if ($commodity == null) {
+            $basSku = OracleBasSKU::where(['sku' => $sku, 'customerid' => $detail->customerid])->first();
+            $commodity = Commodity::create(['sku' => $sku, 'owner_id' => $owner_id, 'name' => $basSku->descr_c]);
+        }
+        $arr = [
+            'order_package_id' => $orderPackage->id,      // 包裹id
+            'commodity_id' => $commodity->id,             // 商品id
+            'amount' => $detail->qty,                     // 商品数量
+        ];
+        $OrderPackageCommodities = OrderPackageCommodities::create($arr);
+        $OrderPackageCommodities->commodity = $commodity;
+        return $OrderPackageCommodities;
+    }
+
+    public function getOrderPackageCommoditiesByOrderId($orderId){
+        $order =  Order::where('id',$orderId)->first();
+        if(!$order){
+            return null;
+        }
+        $orderPackageIds = OrderPackage::select('id')->where('order_id',$order['id'])->get();
+        if(!$orderPackageIds){
+            return null;
+        }
+        return  OrderPackageCommodities::with('commodity')->whereIn('order_package_id',$orderPackageIds)->get();
+    }
+}

+ 45 - 0
app/Services/OrderPackageService.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Services;
+
+use App\OracleActAllocationDetails;
+use App\OracleDOCOrderDetail;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderPackage;
+
+class OrderPackageService
+{
+
+    public function __construct()
+    {
+        app()->bind('orderPackageCommoditiesService', OrderPackageCommoditiesService::class);
+    }
+
+    public function createdByOrder(Order $order, OracleDOCOrderHeader $orderHeader = null)
+    {
+        $orderPackageCommoditiesService = app('orderPackageCommoditiesService');
+        if (!$orderHeader) {
+            $orderHeader = OracleDOCOrderHeader::where('OrderNo', trim($order->code, "'"))->first();
+        }
+// 获取orderNo 对应的打包详情
+        $orderActAllocationDetails = OracleActAllocationDetails::where(['OrderNo' => $order->code])->get();
+        if (!$orderActAllocationDetails) {
+            return [];
+        }
+        $orderPackages = [];
+        foreach ($orderActAllocationDetails as $detail){
+            $logistic_number = $detail->picktotraceid;
+            $orderPackage = OrderPackage::where(['logistic_number'=>$logistic_number])->first();
+            if(!$orderPackage){
+                $orderPackage = OrderPackage::firstOrCreate(['order_id'=>$order['id'],'logistic_number'=>$logistic_number]);
+            }
+            $orderPackageCommoditiesService->createdOrderPackage($orderPackage,$detail);
+        }
+       $orderPackages =  OrderPackage::with(['commodities' => function($query){
+            return $query->with(['commodity']);
+        }])->get();
+        return  $orderPackages;
+    }
+
+}

+ 134 - 0
app/Services/OrderService.php

@@ -0,0 +1,134 @@
+<?php
+
+namespace App\Services;
+
+use App\Logistic;
+use App\OracleActAllocationDetails;
+use App\OracleBasCustomer;
+use App\OracleDOCASNHeader;
+use App\OracleDOCOrderDetail;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderItems;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\Owner;
+use App\Shop;
+
+class OrderService
+{
+    public function __construct()
+    {
+        app()->bind("orderPackageService", OrderPackageService::class);
+    }
+
+//createOrFindBy
+    public function createOrderByWMSOrderNo($oracleOrderNo)
+    {
+        $order = Order::where('code', $oracleOrderNo)->first();
+        $orderHeader = OracleDOCOrderHeader::where('OrderNo', trim($oracleOrderNo, "'"))->first();
+        if ($orderHeader == null) {
+            return null;
+        }
+        $orderHeadAttr = $orderHeader->toArray();
+        if ($order == null) {
+            $customer_name = $orderHeadAttr['oracleBASCustomer_descr_c'];
+            $owner = Owner::firstOrCreate(['name' => $customer_name, 'code' => $orderHeadAttr['customerid']]);
+            $owner_id = $owner->id;
+            $shop_name = $orderHeadAttr['issuepartyname'];
+            $shop_Id = null;
+            if ($shop_name) {
+                $shop = Shop::firstOrCreate(['name' => $shop_name, 'owner_id' => $owner_id]);
+                $shop_Id = $shop->id;
+            }
+
+            $logistics = Logistic::where(['name' => $orderHeadAttr['carriername']])->first();
+/*            if ($logistics == null) {
+                $oracleBasCustomer = OracleBasCustomer::where(['descr_c' => $orderHeadAttr['carriername'], 'Customer_Type' => 'CA'])->first();
+                if ($oracleBasCustomer) {
+                    $logistics = Logistic::firstOrCreate(['code' => $oracleBasCustomer->customerid, 'name' => $oracleBasCustomer->descr_c]);
+                }
+            }*/
+            $logistics_id = null;
+            if ($logistics) {
+                $logistics_id = $logistics->id;
+            }
+            $arr = [
+                'code' => $orderHeadAttr['orderno'],
+                'owner_id' => $owner_id,
+                'wms_status' => $orderHeadAttr['oracleBASCode_codename_c'],
+                'created_at' => $orderHeadAttr['addtime'],
+                'logistic_id' => $logistics_id,
+                'shop_id' => $shop_Id,
+                'consignee_name' => $orderHeadAttr['c_contact'],
+                'consignee_phone' => $orderHeadAttr['c_tel2'],
+                'province' => $orderHeadAttr['c_province'],
+                'city' => $orderHeadAttr['c_city'],
+                'district' => $orderHeadAttr['c_district'],
+                'address' => $orderHeadAttr['c_address1'],
+            ];
+
+            $order = Order::create($arr);
+            // $order = Order::create([]);
+            $orderPackageService = app('orderPackageService');
+            $order->packages = $orderPackageService->createdByOrder($order, $orderHeader);
+        } else {
+            return $this->getOrderInfo($order['id']);
+        }
+        return $order;
+    }
+
+    public function getOrderInfoByLogisticNumberReturn($logisticNumberReturn){
+        $ASNHeader =  OracleDOCASNHeader::where('ASNReference3',$logisticNumberReturn)->first();
+        if(!$ASNHeader){
+            return null;
+        }
+        $OrderHeader = OracleDOCOrderHeader::where('SOReference1',$ASNHeader->asnreference2)->first();
+        if(!$OrderHeader){
+            return null;
+        }
+        return $this->createOrderByWMSOrderNo($OrderHeader->orderno);
+    }
+
+    public function getOrderInfo($orderId)
+    {
+        return Order::with(['packages' => function ($query) {
+            return $query->with(['commodities' => function ($query) {
+                return $query->with(['commodity']);
+            }]);
+        }])->where('id', $orderId)->first();
+    }
+
+    public function getOrderInfoByWMSNo($code)
+    {
+        return Order::with(['packages' => function ($query) {
+            return $query->with(['commodities' => function ($query) {
+                return $query->with(['commodity']);
+            }]);
+        }])->where('code', $code)->first();
+    }
+
+    public function getWMSOrderInfoByWMSOrderNo($WMSOrderNo)
+    {
+        if(!OracleDOCOrderHeader::where('orderNo',$WMSOrderNo)->count()){
+            return [];
+        }
+        $orderHeader = $this->getWMSOrderHeaderByWMSOrderNo($WMSOrderNo);
+        $orderDetails = $this->getWMSOrderDetailsByWMSOrderNo($WMSOrderNo);
+        $allocationDetails = $this->getWMSOrderAllDetailsByWMSOrderNo($WMSOrderNo);
+        return compact('orderHeader','orderDetails','allocationDetails');
+    }
+
+    public function getWMSOrderHeaderByWMSOrderNo($WMSOrderNo){
+        return OracleDOCOrderHeader::where('orderNo',$WMSOrderNo)->first();
+    }
+
+    public function getWMSOrderDetailsByWMSOrderNo($WMSOrderNo){
+        return OracleDOCOrderDetail::where('orderNo',$WMSOrderNo)->get();
+    }
+
+    public function getWMSOrderAllDetailsByWMSOrderNo($WMSOrderNo){
+        return OracleActAllocationDetails::where('orderNo',$WMSOrderNo)->get();
+    }
+
+}

+ 1 - 1
app/Services/ProcessService.php

@@ -12,7 +12,7 @@ Class ProcessService
     private function conditionQuery(Request $request){
     private function conditionQuery(Request $request){
         $processes=Process::filterAuthorities()->with(['tutorials','signs',
         $processes=Process::filterAuthorities()->with(['tutorials','signs',
             'signUnitPrice','processesContents'=>function($query){
             'signUnitPrice','processesContents'=>function($query){
-            return $query->with(['signCommodityName','signCommoditySku','commodity'=>function($query){
+            return $query->with(['signCommodityName','signCommoditySku','signCommodityBarcode','commodity'=>function($query){
                 return $query->with('barcodes');
                 return $query->with('barcodes');
             }]);
             }]);
         }])->orderBy('processes.id','DESC');
         }])->orderBy('processes.id','DESC');

+ 4 - 4
app/Services/QualityLabelService.php

@@ -1,13 +1,13 @@
-<?php 
+<?php
 
 
-namespace App\Services; 
+namespace App\Services;
 
 
 use App\QualityLabel;
 use App\QualityLabel;
 
 
 Class QualityLabelService
 Class QualityLabelService
-{ 
+{
     public function get(){
     public function get(){
         return QualityLabel::get();
         return QualityLabel::get();
     }
     }
 
 
-}
+}

+ 82 - 42
app/Services/RejectedService.php

@@ -1,92 +1,132 @@
-<?php 
+<?php
 
 
-namespace App\Services; 
+namespace App\Services;
 
 
 use App\Exports\RejectedExport;
 use App\Exports\RejectedExport;
+use App\Logistic;
+use App\OracleDOCASNDetail;
+use App\OracleDOCASNHeader;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderIssue;
+use App\Owner;
 use App\RejectedBill;
 use App\RejectedBill;
 use App\Services\common\QueryService;
 use App\Services\common\QueryService;
 use Carbon\Carbon;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Auth;
 
 
-Class RejectedService
+class RejectedService
 {
 {
-    private function conditionQuery(Request $request){
+    private function conditionQuery(Request $request)
+    {
         $user = Auth::user();
         $user = Auth::user();
-        $rejectedBills=RejectedBill::query()->with('owner','logistic','items')->orderBy('id','desc')->whereIn('id_owner',
-            $user?$user->getPermittingOwnerIdsAttribute():[]);
-        $columnQueryRules=[
-            'created_at_start' => ['alias' => 'created_at' , 'startDate' => ' 00:00:00'],
-            'created_at_end' => ['alias' => 'created_at' , 'endDate' => ' 23:59:59'],
-            'owner_id' => ['alias' => 'id_owner','multi' => ','],
+        $rejectedBills = RejectedBill::query()->with('owner', 'logistic', 'items')->orderBy('id', 'desc')->whereIn('id_owner',
+            $user ? $user->getPermittingOwnerIdsAttribute() : []);
+        $columnQueryRules = [
+            'created_at_start' => ['alias' => 'created_at', 'startDate' => ' 00:00:00'],
+            'created_at_end' => ['alias' => 'created_at', 'endDate' => ' 23:59:59'],
+            'owner_id' => ['alias' => 'id_owner', 'multi' => ','],
             'order_number' => ['like' => ''],
             'order_number' => ['like' => ''],
             'logistic_number' => ['like' => ''],
             'logistic_number' => ['like' => ''],
             'mobile_sender' => ['like' => ''],
             'mobile_sender' => ['like' => ''],
             'checked_numbers' => ['like' => ''],
             'checked_numbers' => ['like' => ''],
         ];
         ];
-        if($request->id_quality_label!=''){
-            if($request->id_quality_label==1){
-                $rejectedBills->whereDoesntHave('items',function ($query){
-                    $query->where('id_quality_label',2);
+        if ($request->id_quality_label != '') {
+            if ($request->id_quality_label == 1) {
+                $rejectedBills->whereDoesntHave('items', function ($query) {
+                    $query->where('id_quality_label', 2);
                 });
                 });
-            }else{
-                $rejectedBills->whereHas('items',function ($query){
-                    $query->where('id_quality_label',2);
+            } else {
+                $rejectedBills->whereHas('items', function ($query) {
+                    $query->where('id_quality_label', 2);
                 });
                 });
             }
             }
             $request->offsetUnset('id_quality_label');
             $request->offsetUnset('id_quality_label');
         }
         }
-        if($request->is_checked!=''){
-            if(!$request->is_checked)
-                $rejectedBills=$rejectedBills->where(function ($query) {
+        if ($request->is_checked != '') {
+            if (!$request->is_checked)
+                $rejectedBills = $rejectedBills->where(function ($query) {
                     $query->where('is_checked', false)
                     $query->where('is_checked', false)
                         ->orWhere('is_checked', null);
                         ->orWhere('is_checked', null);
                 });
                 });
-            else{
-                $rejectedBills=$rejectedBills->where('is_checked', true);
+            else {
+                $rejectedBills = $rejectedBills->where('is_checked', true);
             }
             }
             $request->offsetUnset('is_checked');
             $request->offsetUnset('is_checked');
         }
         }
-        if($request->is_loaded!=''){
-            $is_loaded=$request->is_loaded;
-            if($is_loaded=='null')$is_loaded=null;
-            $rejectedBills=$rejectedBills->where('is_loaded', $is_loaded);
+        if ($request->is_loaded != '') {
+            $is_loaded = $request->is_loaded;
+            if ($is_loaded == 'null') $is_loaded = null;
+            $rejectedBills = $rejectedBills->where('is_loaded', $is_loaded);
             $request->offsetUnset('is_loaded');
             $request->offsetUnset('is_loaded');
         }
         }
-        if($request->barcode_goods!=''){
+        if ($request->barcode_goods != '') {
             $barcode_goods = $request->barcode_goods;
             $barcode_goods = $request->barcode_goods;
-            $rejectedBills->whereHas('items',function ($query)use($barcode_goods){
-                $query->where('barcode_goods','like',trim($barcode_goods).'%');
+            $rejectedBills->whereHas('items', function ($query) use ($barcode_goods) {
+                $query->where('barcode_goods', 'like', trim($barcode_goods) . '%');
             });
             });
             $request->offsetUnset('barcode_goods');
             $request->offsetUnset('barcode_goods');
         }
         }
-        if($request->logistic_number_return){
-            if(strpos($request->logistic_number_return,',')||strpos($request->logistic_number_return,',')||strpos($request->logistic_number_return,' ')){
-                $arr=array_filter(preg_split('/[,, ]+/is', $request->logistic_number_return));
-                $rejectedBills=$rejectedBills->whereIn('logistic_number_return',$arr);
+        if ($request->logistic_number_return) {
+            if (strpos($request->logistic_number_return, ',') || strpos($request->logistic_number_return, ',') || strpos($request->logistic_number_return, ' ')) {
+                $arr = array_filter(preg_split('/[,, ]+/is', $request->logistic_number_return));
+                $rejectedBills = $rejectedBills->whereIn('logistic_number_return', $arr);
                 $request->offsetUnset('logistic_number_return');
                 $request->offsetUnset('logistic_number_return');
-            }else{
+            } else {
                 $columnQueryRules['logistic_number_return'] = ['timeLimit' => 15];
                 $columnQueryRules['logistic_number_return'] = ['timeLimit' => 15];
             }
             }
         }
         }
-        $rejectedBills = app(QueryService::class)->query($request,$rejectedBills,$columnQueryRules);
+        $rejectedBills = app(QueryService::class)->query($request, $rejectedBills, $columnQueryRules);
         return $rejectedBills;
         return $rejectedBills;
     }
     }
 
 
-    public function paginate(Request $request){
+    public function paginate(Request $request)
+    {
         return $this->conditionQuery($request)->paginate($request->paginate ?? 50);
         return $this->conditionQuery($request)->paginate($request->paginate ?? 50);
     }
     }
 
 
-    public function get(Request $request){
+    public function get(Request $request)
+    {
         return $this->conditionQuery($request)->get();
         return $this->conditionQuery($request)->get();
     }
     }
 
 
-    public function exportData(Request $request){
-        $rejectedBills=$this->conditionQuery($request);
-        if($rejectedBills->count()>RejectedExport::$max){
-            $rejectedBills->where('is_finished',false);
+    public function exportData(Request $request)
+    {
+        $rejectedBills = $this->conditionQuery($request);
+        if ($rejectedBills->count() > RejectedExport::$max) {
+            $rejectedBills->where('is_finished', false);
         }
         }
         return $rejectedBills;
         return $rejectedBills;
     }
     }
 
 
-}
+    public function syncOrderIssue($rejectedBillId)
+    {
+        $rejectedBIll = RejectedBill::where('id', $rejectedBillId)->first();
+        $ASNHeader = OracleDOCASNHeader::where('asnreference3', $rejectedBIll->logistic_number_return)->first();
+        if (!$ASNHeader) {
+            return;
+        }
+        $orderHeader = OracleDOCOrderHeader::where('soreference1', $ASNHeader->asnreference2)->first();
+        if (!$orderHeader) {
+            return;
+        }
+        $order = Order::where('code', $orderHeader->orderno)->first;
+        if (!$order) {
+            return;
+        }
+        OrderIssue::where('order_id', $order->id)->where('is_new_rejecting', '<>', 2)->update('is_new_rejecting', 2);
+    }
+
+    public function getRejectedByWMSOrderNo($WMSOrderNo){
+        $orderHeader = OracleDOCOrderHeader::where('orderNo',$WMSOrderNo)->first();
+        if(!$orderHeader){
+            return null;
+        }
+        $ASNHeader =  OracleDOCASNHeader::where('ASNReference3',$orderHeader->sorefernce1)->first();
+        if(!$ASNHeader){
+            return null;
+        }
+        return RejectedBill::with('items')->where('logistic_number_return',$ASNHeader->asnrefernce3)->first();
+    }
+}

+ 23 - 5
app/Services/WaveService.php

@@ -53,7 +53,6 @@ class WaveService
     // cancel Print
     // cancel Print
     public function cancelPrint($ids)
     public function cancelPrint($ids)
     {
     {
-        DB::enableQueryLog();
         $meg = ['success' => false, 'fail_info' => null];
         $meg = ['success' => false, 'fail_info' => null];
         if (!$ids) {
         if (!$ids) {
             $meg['fail_info'] = '没有选中需要重置打印标记的波次!';
             $meg['fail_info'] = '没有选中需要重置打印标记的波次!';
@@ -62,6 +61,11 @@ class WaveService
         if (is_string($ids)) {
         if (is_string($ids)) {
             $ids = [$ids];
             $ids = [$ids];
         }
         }
+        $count = $this->verfifyIds($ids);
+        if(!$count) {
+            $meg['fail_info'] = "取消打印的波次中有不符合条件的波次";
+            return $meg;
+        }
         $cancelPrint = OracleDOCWaveHeader::whereIn("WAVENO", $ids)->update(['udfprintflag2' => 'N','UserDefine2'=>'']);
         $cancelPrint = OracleDOCWaveHeader::whereIn("WAVENO", $ids)->update(['udfprintflag2' => 'N','UserDefine2'=>'']);
         if (!$cancelPrint) {
         if (!$cancelPrint) {
             $meg['fail_info'] = '没有选中需要重置打印标记的波次!';
             $meg['fail_info'] = '没有选中需要重置打印标记的波次!';
@@ -92,7 +96,7 @@ class WaveService
             $childSql .= " and addTime < '" . $end_time . " 23:59:59'";
             $childSql .= " and addTime < '" . $end_time . " 23:59:59'";
         }
         }
         if ($wave_num) {
         if ($wave_num) {
-            $childSql .= " and waveNo like '" . $wave_num . "'";
+            $childSql .= " and waveNo like '" .trim($wave_num). "'";
         }
         }
         if ($wave_status) {
         if ($wave_status) {
             $childSql .= " and waveStatus = " . $wave_status;
             $childSql .= " and waveStatus = " . $wave_status;
@@ -129,8 +133,13 @@ class WaveService
             $childSql .= " and addTime < '" . $request->input('end_time') . " 23:59:59' ";
             $childSql .= " and addTime < '" . $request->input('end_time') . " 23:59:59' ";
         }
         }
         if ($request->input('wave_num')) {
         if ($request->input('wave_num')) {
-            $sql = $this->getWaveNoString($request->input('wave_num'));
-            $childSql .= " and WaveNo in (" .$sql . ") ";
+            $wave_num = $request->input('wave_num');
+            $wave_num = $this->getWaveNoString($wave_num);
+            if(strpos($wave_num,',')){
+                $childSql .= " and WaveNo in (" .$wave_num . ") ";
+            }else{
+                $childSql .= " and WaveNo like '" .$wave_num . "' ";
+            }
         }
         }
         if ($request->input('wave_status')) {
         if ($request->input('wave_status')) {
             $childSql .= " and WaveStatus =  '" . $request->input('wave_status') . "' ";
             $childSql .= " and WaveStatus =  '" . $request->input('wave_status') . "' ";
@@ -173,11 +182,14 @@ class WaveService
         ]];
         ]];
         return $arr;
         return $arr;
     }
     }
-    public  function getWaveNoString($wave_num){
+    public function getWaveNoString($wave_num){
         $sqlString = '';
         $sqlString = '';
         if(!$wave_num){
         if(!$wave_num){
             return $sqlString;
             return $sqlString;
         }
         }
+        if(strpos($wave_num,"%")){
+            return $wave_num;
+        }
         if(strpos($wave_num,",") ){
         if(strpos($wave_num,",") ){
 
 
             $arr = explode(',',$wave_num);
             $arr = explode(',',$wave_num);
@@ -193,4 +205,10 @@ class WaveService
         }
         }
         return $sqlString;
         return $sqlString;
     }
     }
+
+    public function verfifyIds($ids){
+        $sql =  "select count(1) count from DOC_WAVE_HEADER where  WaveNo in (".$this->getWaveNoString(implode(',',$ids)).") and WAVESTATUS ='99' and UdfPrintFlag2 ='Y'";
+        $count=  DB::connection('oracle')->select(DB::raw($sql))[0]->count;
+        return $count = 0;
+    }
 }
 }

+ 14 - 0
app/Shop.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class Shop extends Model
+{
+    //
+    use ModelTimeFormat;
+
+    protected $fillable = ['name','owner_id'];
+}

+ 10 - 0
app/Validators/UserDutyCheckValidator.php

@@ -0,0 +1,10 @@
+<?php
+
+
+namespace App\Validators;
+
+
+class UserDutyCheckValidator
+{
+
+}

Разница между файлами не показана из-за своего большого размера
+ 452 - 97
composer.lock


+ 12 - 0
database/factories/OrderFactory.php

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

+ 12 - 0
database/factories/OrderIssueFactory.php

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

+ 12 - 0
database/factories/OrderIssueOnTopFactory.php

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

+ 12 - 0
database/factories/OrderIssueProcessLogFactory.php

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

+ 12 - 0
database/factories/OrderIssueTypeFactory.php

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

+ 12 - 0
database/factories/OrderItemsFactory.php

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

+ 12 - 0
database/factories/OrderOnTopFactory.php

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

+ 12 - 0
database/factories/OrderPackageCommoditiesFactory.php

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

+ 12 - 0
database/factories/OrderPackageFactory.php

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

+ 12 - 0
database/factories/ShopFactory.php

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

+ 1 - 1
database/migrations/2020_07_24_072406_create_order_commodities_table.php

@@ -30,6 +30,6 @@ class CreateOrderCommoditiesTable extends Migration
      */
      */
     public function down()
     public function down()
     {
     {
-        Schema::dropIfExists('order_barcodes');
+        Schema::dropIfExists('order_commodities');
     }
     }
 }
 }

+ 52 - 0
database/migrations/2020_07_29_155624_create_orders_table.php

@@ -0,0 +1,52 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrdersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('orders', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string("batch_id")->index()->nullable();
+            $table->string("code")->index()->nullable();
+            $table->integer("owner_id")->nullable();
+            $table->enum("status",['处理中','未处理','已处理','取消','异常'])->default('未处理');
+            $table->string("wms_status");
+
+            $table->integer('shop_id')->index()->nullable()->comment('商铺');
+
+            $table->integer("logistic_id")->index()->nullable()->comment('承运商');
+            $table->string("consignee_name")->index()->nullable()->comment('收件人');
+            $table->string("consignee_phone")->index()->nullable()->comment('收件人电话');
+
+            $table->String("province")->nullable()->comment('省');
+            $table->String("city")->nullable()->comment('市');
+            $table->String("district")->nullable()->comment('区');
+
+            $table->string("address")->nullable()->comment('地址');
+            $table->timestamp('created_at')->index();
+            $table->timestamp('updated_at')->index();
+
+//            $table->string("logistic_number")->index()->nullable()->comment('承运单号');
+//            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('orders');
+    }
+}

+ 35 - 0
database/migrations/2020_07_29_160704_create_shops_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateShopsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('shops', function (Blueprint $table) {
+            $table->id();
+            $table->timestamps();
+
+            $table->string('owner_id')->index()->comment('客户');
+
+            $table->string('name')->unique()->comment('名称');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('shops');
+    }
+}

+ 52 - 0
database/migrations/2020_07_29_160826_create_order_issues_table.php

@@ -0,0 +1,52 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderIssuesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_issues', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->timestamp('created_at')->index();
+            $table->timestamp('updated_at')->index();
+            $table->integer('order_id')->index()->nullable()->comment('订单');
+            $table->enum('handle_status', ['处理中', '已完结'])->default('处理中')->comment('处理状态');
+            $table->string('send_back_number')->nullable()->index()->comment('退回单号');
+            $table->enum('is_new_rejecting',['无','有','已处理'])->default('无')->index()->comment('有新退件');
+            $table->integer('rejected_bill_id')->index()->nullable()->comment('退回单');
+            $table->enum('rejecting_status', ['无', '未退回', '全部退回', '部分退回', '差异退回', '超量退回', '全部退回'])->default('无')->index()->comment('退回状态');
+            $table->string('order_issue_type_id')->nullable()->comment('问题类别');
+            $table->string('result_explain')->nullable()->comment('处理结果说明');
+            $table->integer('second_order_id')->nullable()->comment('二次订单号');
+            $table->enum('final_status', ['已解决', '待退回', '退回中'])->index()->nullable()->comment('最终转态');
+            $table->decimal('logistic_indemnity_money')->index()->nullable()->comment('承运商赔偿金额');
+            $table->enum('logistic_express_remission', ['原单减免', '部分减免', '全部减免'])->index()->nullable()->comment('承运商快递减免');
+            $table->decimal('baoshi_indemnity_money')->index()->nullable()->comment('宝时赔偿金额');
+            $table->enum('baoshi_express_remission', ['原单减免', '部分减免', '全部减免'])->index()->nullable()->comment('宝时快递减免');
+            $table->integer('user_workgroup_id')->index()->nullable()->comment('事故责任方');
+
+
+//            $table->string('situation_explain')->nullable()->comment('情况说明');
+//            $table->integer('second_logistic_id')->nullable()->comment('二次承运商');
+//            $table->String('second_logistic_number')->nullable()->comment('二次运单号');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_issues');
+    }
+}

+ 54 - 0
database/migrations/2020_07_29_164130_create_order_issue_types_table.php

@@ -0,0 +1,54 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderIssueTypesTable extends Migration
+{
+    protected $types = [
+        '拦截',
+        '快递异常',
+        '信息更改',
+        '联系不上',
+        '其他',
+        '错漏发',
+        '仓库问题',
+        '快递丢件',
+        '破损',
+        '撤销丢件',
+        '二次加工',
+        '全检问题',
+        '系统问题',
+        '延迟发货',
+        '仓库丢件',
+    ];
+
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_issue_types', function (Blueprint $table) {
+            $table->id();
+            $table->timestamps();
+            $table->String('name')->unique();
+        });
+
+        foreach ($this->types as $type){
+            \App\OrderIssueType::create(['name'=>$type]);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_issue_types');
+    }
+}

+ 52 - 0
database/migrations/2020_07_29_164829_add_data_authorities_issue.php

@@ -0,0 +1,52 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddDataAuthoritiesIssue extends Migration
+{
+    protected $authNames = [
+        "订单管理-订单问题件生成",
+        "订单管理-问题件-查询",
+//        "订单管理-问题件-工作量",
+//        "订单管理-问题件-绩效统计",
+        "订单管理-问题件-置顶",
+        "订单管理-问题件-删除",
+        "订单管理-问题件-编辑",
+    ];
+
+    protected $forbidAuthName =[
+        '客户不可见'
+    ];
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        //
+        foreach ($this->authNames as $authName){
+           \App\Authority::create(['name'=>$authName,'alias_name'=>$authName,'permission'=>'允许']);
+        }
+        foreach ($this->forbidAuthName as $bidAuthName){
+            \App\Authority::create(['name'=>$bidAuthName,'alias_name'=>$bidAuthName,'permission'=>'禁止']);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        foreach ($this->authNames as $authName){
+            \App\Authority::where(['name'=>$authName,'alias_name'=>$authName])->delete();
+        }
+        foreach ($this->forbidAuthName as $bidAuthName){
+            \App\Authority::where(['name'=>$bidAuthName,'alias_name'=>$bidAuthName])->delete();
+        }
+    }
+}

+ 35 - 0
database/migrations/2020_08_04_095621_create_order_package_commodities_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderPackageCommoditiesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_package_commodities', function (Blueprint $table) {
+            $table->id();
+            $table->timestamps();
+
+            $table->integer('order_package_id')->index()->comment('包裹表');
+            $table->integer('commodity_id')->index()->comment('商品');
+            $table->integer('amount')->comment('数量');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_package_commodities');
+    }
+}

+ 33 - 0
database/migrations/2020_08_04_095822_create_order_packages_table.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderPackagesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_packages', function (Blueprint $table) {
+            $table->id();
+            $table->timestamps();
+            $table->integer('order_id')->index()->comment('订单号');
+            $table->string('logistic_number')->unique()->comment('快递单号/运单号');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_packages');
+    }
+}

+ 34 - 0
database/migrations/2020_08_04_103020_create_order_issue_on_tops_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderIssueOnTopsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_issue_on_tops', function (Blueprint $table) {
+            $table->id();
+            $table->timestamps();
+            $table->integer('order_issue_id')->index()->comment('订单号');
+            $table->string('remark')->comment('备注');
+            $table->softDeletes()->index();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_issue_on_tops');
+    }
+}

+ 35 - 0
database/migrations/2020_08_06_172655_create_order_issue_process_logs_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderIssueProcessLogsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_issue_process_logs', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->timestamps();
+            $table->integer('order_issue_id')->index()->comment('订单问题件');
+            $table->integer('user_id')->nullable()->comment('操作人');
+            $table->string('content')->nullable()->comment('说明');
+            $table->enum('type',['创建','结束','处理'])->nullable()->comment('类别');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_issue_process_logs');
+    }
+}

+ 16 - 0
database/seeds/OrderIssueOnTopSeeder.php

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

+ 16 - 0
database/seeds/OrderIssueProcessLogSeeder.php

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

+ 16 - 0
database/seeds/OrderIssueSeeder.php

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

+ 16 - 0
database/seeds/OrderIssueTypeSeeder.php

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

+ 16 - 0
database/seeds/OrderItemsSeeder.php

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

+ 16 - 0
database/seeds/OrderOnTopSeeder.php

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

+ 16 - 0
database/seeds/OrderPackageCommoditiesSeeder.php

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

+ 16 - 0
database/seeds/OrderPackageSeeder.php

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

+ 16 - 0
database/seeds/OrderSeeder.php

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

+ 16 - 0
database/seeds/ShopSeeder.php

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

+ 1 - 0
phpunit-OrderIssue.bat

@@ -0,0 +1 @@
+vendor\bin\phpunit.bat --testsuite=OrderIssues

+ 3 - 0
phpunit.xml

@@ -21,6 +21,9 @@
         <testsuite name="Inventory">
         <testsuite name="Inventory">
             <directory suffix="Test.php">./tests/Inventory</directory>
             <directory suffix="Test.php">./tests/Inventory</directory>
         </testsuite>
         </testsuite>
+        <testsuite name="OrderIssues">
+            <directory suffix="Test.php">./tests/OrderIssues</directory>
+        </testsuite>
     </testsuites>
     </testsuites>
     <filter>
     <filter>
         <whitelist processUncoveredFilesFromWhitelist="true">
         <whitelist processUncoveredFilesFromWhitelist="true">

+ 2 - 2
public/js/app.js

@@ -61974,8 +61974,8 @@ module.exports = tempTip;
 /*! no static exports found */
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 /***/ (function(module, exports, __webpack_require__) {
 
 
-__webpack_require__(/*! D:\wamp64\www\bswas\resources\js\app.js */"./resources/js/app.js");
-module.exports = __webpack_require__(/*! D:\wamp64\www\bswas\resources\sass\app.scss */"./resources/sass/app.scss");
+__webpack_require__(/*! D:\phpstudy_pro\WWW\bswas\resources\js\app.js */"./resources/js/app.js");
+module.exports = __webpack_require__(/*! D:\phpstudy_pro\WWW\bswas\resources\sass\app.scss */"./resources/sass/app.scss");
 
 
 
 
 /***/ }),
 /***/ }),

+ 174 - 98
resources/js/queryForm/header.js

@@ -1,11 +1,21 @@
+/**
+ * 需在页面定义三个元素 tr的元素当作当前元素 id 自定义 默认header
+ * tr的父级元素 table id默认为tr的id加Parent后缀
+ * 浮动表格元素 table id默认为tr的id加Roll后缀
+ * */
+
 window.sort=require('../utilities/sort');
 window.sort=require('../utilities/sort');
 window.Header = function getHeader(object) {
 window.Header = function getHeader(object) {
-    this.object = object;
-    this._header = object.el || '#header';
-    this._column = object.column;
-    this._data = object.data;
-    this._restorationColumn = object.restorationColumn;
-    this._fixedTop = object.fixedTop || 0;
+    this._header = object.el || '#header';  //基点元素
+    this._column = object.column;   //列名
+    this._data = object.data;   //被排序数据
+    this._restorationColumn = object.restorationColumn; //恢复原数据基准字段
+    this._fixedTop = object.fixedTop || 0;  //同级浮动元素高度,使当前元素追加该元素高度浮动
+    this._offset = object.offset || 0;  //偏移量
+    this._is_restorationColumn_asc = object.is_restorationColumn_asc || false;    //恢复原数据基准字段的排序类型 true:asc false:desc
+    this._vue = object.vue || null; //vue容器
+    this._checkbox = object.checkbox || 'checkData';    //全选数据列名
+    this._closeFloat = object.closeFloat || false;  //是否开启浮动
 
 
     let _this = this;
     let _this = this;
     let _parentNode = $(_this._header);
     let _parentNode = $(_this._header);
@@ -14,23 +24,22 @@ window.Header = function getHeader(object) {
     // form fixed
     // form fixed
     let _headerParent = $(_this._header+"Parent");
     let _headerParent = $(_this._header+"Parent");
     let _parentNodeTemp = _parentNode.clone();
     let _parentNodeTemp = _parentNode.clone();
+    //滚动监听
     function fixed() {
     function fixed() {
         let _parentNode_top = _parentNode.offset().top;
         let _parentNode_top = _parentNode.offset().top;
-        let height = _parentNode.height();
-        _parentNodeTemp.css('position',"fixed");
-        _parentNodeTemp.css('top',_this._fixedTop+"px");
-        _parentNodeTemp.css('z-index',"1030");
-        _parentNodeTemp.css('width',_headerParent.width()+"px");
-        _parentNodeTemp.height(height);
-        _parentNodeTemp.attr('id',_this._header+"Temp");
-        $(_this._header+"Roll").append(_parentNodeTemp);
         $(window).scroll(function(){
         $(window).scroll(function(){
             let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
             let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
-            if (scrollTop > _parentNode_top) {
+            if (scrollTop > _parentNode_top-_this._fixedTop) {
                 $(_this._header+"Roll").removeClass('d-none');
                 $(_this._header+"Roll").removeClass('d-none');
             } else {
             } else {
                 $(_this._header+"Roll").addClass('d-none');
                 $(_this._header+"Roll").addClass('d-none');
             }
             }
+            let scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
+            if (scrollLeft > 0){
+                _parentNodeTemp.css('margin-left',0-(scrollLeft));
+            }else{
+                _parentNodeTemp.css('margin-left',"");
+            }
         });
         });
     }
     }
 
 
@@ -43,110 +52,177 @@ window.Header = function getHeader(object) {
      *          neglect : null || bool          --是否忽略排序
      *          neglect : null || bool          --是否忽略排序
      *         }
      *         }
      * */
      * */
+    //点击事件触发的排序规则
+    function rule(column,column_sort,column_sort_temp=null) {
+        return function () {
+            if (!sortType[column.name]){
+                sortType[column.name] = 'asc';
+                columnArr.push(column.name);
+                column_sort.removeClass('fa-sort').addClass('fa-sort-asc');
+                if (column_sort_temp) column_sort_temp.removeClass('fa-sort').addClass('fa-sort-asc');
+                let columnArrTemp = [];
+                columnArrTemp.push.apply(columnArrTemp,columnArr);
+                window.sort.sort(_this._data,columnArrTemp,sortType);
+                return ;
+            }
+            if (sortType[column.name] === 'asc'){
+                sortType[column.name] = 'desc';
+                column_sort.removeClass('fa-sort-asc').addClass('fa-sort-desc');
+                if (column_sort_temp)column_sort_temp.removeClass('fa-sort-asc').addClass('fa-sort-desc');
+                let columnArrTemp = [];
+                columnArrTemp.push.apply(columnArrTemp,columnArr);
+                window.sort.sort(_this._data,columnArrTemp,sortType);
+                return ;
+            }
+            if (sortType[column.name] === 'desc'){
+                delete sortType[column.name];
+                columnArr.some(function (name, index) {
+                    if (name === column.name){
+                        columnArr.splice(index,1);
+                        return true;
+                    }
+                });
+                column_sort.removeClass('fa-sort-desc').addClass('fa-sort');
+                if (column_sort_temp)column_sort_temp.removeClass('fa-sort-desc').addClass('fa-sort');
+                if (columnArr.length === 0){
+                    //希尔排序
+                    let arr = [];
+                    arr.push.apply(arr,_this._data);
+                    let len = arr.length;
+                    for(let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
+                        for(let i = gap; i < len; i++) {
+                            let j = i;
+                            let current = arr[i];
+                            if (_this._is_restorationColumn_asc){
+                                while(j - gap >= 0 && Number(current[_this._restorationColumn]) < Number(arr[j - gap][_this._restorationColumn])) {
+                                    arr[j] = arr[j - gap];
+                                    j = j - gap;
+                                }
+                            }else{
+                                while(j - gap >= 0 && Number(current[_this._restorationColumn]) > Number(arr[j - gap][_this._restorationColumn])) {
+                                    arr[j] = arr[j - gap];
+                                    j = j - gap;
+                                }
+                            }
+                            arr[j] = current;
+                        }
+                    }
+                    //插入排序
+                    /*let preIndex, current;
+                    for(let i = 1; i < len; i++) {
+                        preIndex = i - 1;
+                        current = arr[i];
+                        while(preIndex >= 0 && arr[preIndex][_this._restorationColumn] > current[_this._restorationColumn]) {
+                            arr[preIndex + 1] = arr[preIndex];
+                            preIndex--;
+                        }
+                        arr[preIndex + 1] = current;
+                    }*/
+                    _this._data.length = 0;
+                    _this._data.push.apply(_this._data,arr);
+                    return;
+                }
+                let columnArrTemp = [];
+                columnArrTemp.push.apply(columnArrTemp,columnArr);
+                window.sort.sort(_this._data,columnArrTemp,sortType);
+            }
+        }
+    };
+    //追加表头字段
     function append() {
     function append() {
         _this._column.forEach(function (column) {
         _this._column.forEach(function (column) {
             if (column.customization){
             if (column.customization){
-                _parentNode.append(column.dom);
+                let _th = $("<th id='dom_"+column.name+"'><span style='display: inline-block'></span></th>");
+                $(_th.children()[0]).append(column.dom);
+                _parentNode.append(_th);
             }else{
             }else{
                 let _td = "<th id='dom_"+column.name+"' style='";
                 let _td = "<th id='dom_"+column.name+"' style='";
                 if(!column.neglect){
                 if(!column.neglect){
                     _td += "cursor: pointer;"
                     _td += "cursor: pointer;"
                 }
                 }
                 if (column.style) _td += column.style;
                 if (column.style) _td += column.style;
-                _td += "'>";
+                _td += "' ";
+                if (column.class) _td += "class='"+column.class+"'";
+                _td += ">";
+                _td += "<span style='display: inline-block'>";
                 if(!column.neglect){
                 if(!column.neglect){
                     _td += "<span id='sort_"+column.name+"' class='fa fa-sort'></span>";
                     _td += "<span id='sort_"+column.name+"' class='fa fa-sort'></span>";
                 }
                 }
-                _td += "<span style='display: inline-block'>"+column.value+"</span>";
+                _td += column.value+"</span>";
                 _td += "</th>";
                 _td += "</th>";
                 _parentNode.append(_td);
                 _parentNode.append(_td);
-                let column_dom = $('#dom_'+column.name);
-                let column_dom_temp = column_dom.clone();
-                let columnNameDom = column_dom_temp.children()[0];
-                if (!column.neglect){
-                    column_dom_temp.children()[0].id = 'sort_'+column.name+"_temp";
-                    columnNameDom = column_dom_temp.children()[1];
+                if (!column.neglect) {
+                    let column_sort = $('#sort_' + column.name);
+                    let column_dom = $('#dom_'+column.name);
+                    column_dom.on('click',rule(column,column_sort));
                 }
                 }
-                console.log(columnNameDom);
-                column_dom_temp.attr('id','dom_'+column.name+"_temp");
-                $(columnNameDom).css('width',column_dom.width());
-                _parentNodeTemp.append(column_dom_temp);
-                if (!column.neglect){
-                    let column_sort = $('#sort_'+column.name);
-                    let rule=function () {
-                        if (!sortType[column.name]){
-                            sortType[column.name] = 'asc';
-                            columnArr.push(column.name);
-                            column_sort.removeClass('fa-sort').addClass('fa-sort-asc');
-                            column_dom_temp.children()[0].className = 'fa fa-sort-asc';
-                            let columnArrTemp = [];
-                            columnArrTemp.push.apply(columnArrTemp,columnArr);
-                            window.sort.sort(_this._data,columnArrTemp,sortType);
-                            return ;
-                        }
-                        if (sortType[column.name] === 'asc'){
-                            sortType[column.name] = 'desc';
-                            column_sort.removeClass('fa-sort-asc').addClass('fa-sort-desc');
-                            column_dom_temp.children()[0].className = 'fa fa-sort-desc';
-                            let columnArrTemp = [];
-                            columnArrTemp.push.apply(columnArrTemp,columnArr);
-                            window.sort.sort(_this._data,columnArrTemp,sortType);
-                            return ;
-                        }
-                        if (sortType[column.name] === 'desc'){
-                            delete sortType[column.name];
-                            columnArr.some(function (name, index) {
-                                if (name === column.name){
-                                    columnArr.splice(index,1);
-                                    return true;
-                                }
-                            });
-                            column_sort.removeClass('fa-sort-desc').addClass('fa-sort');
-                            column_dom_temp.children()[0].className = 'fa fa-sort';
-                            if (columnArr.length === 0){
-                                //希尔排序
-                                let arr = [];
-                                arr.push.apply(arr,_this._data);
-                                let len = arr.length;
-                                for(let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
-                                    for(let i = gap; i < len; i++) {
-                                        let j = i;
-                                        let current = arr[i];
-                                        while(j - gap >= 0 && current[_this._restorationColumn] < arr[j - gap][_this._restorationColumn]) {
-                                            arr[j] = arr[j - gap];
-                                            j = j - gap;
-                                        }
-                                        arr[j] = current;
-                                    }
-                                }
-                                //插入排序
-                                /*let preIndex, current;
-                                for(let i = 1; i < len; i++) {
-                                    preIndex = i - 1;
-                                    current = arr[i];
-                                    while(preIndex >= 0 && arr[preIndex][_this._restorationColumn] > current[_this._restorationColumn]) {
-                                        arr[preIndex + 1] = arr[preIndex];
-                                        preIndex--;
-                                    }
-                                    arr[preIndex + 1] = current;
-                                }*/
-                                _this._data.length = 0;
-                                _this._data.push.apply(_this._data,arr);
-                                return;
-                            }
-                            let columnArrTemp = [];
-                            columnArrTemp.push.apply(columnArrTemp,columnArr);
-                            window.sort.sort(_this._data,columnArrTemp,sortType);
-                        }
-                    };
-                    column_dom.on('click',rule);
-                    column_dom_temp.on('click',rule);
+            }
+        });
+    }
+    //追加浮动表头:克隆表头元素,改变元素属性
+    function cloneDom(){
+        let height = _parentNode.height();
+        _parentNodeTemp.css('position',"fixed");
+        _parentNodeTemp.css('top',_this._fixedTop+"px");
+        _parentNodeTemp.css('z-index',"1030");
+        _parentNodeTemp.css('width',_headerParent.width()+"px");
+        _parentNodeTemp.css('background',"rgb(255, 255, 255)");
+        _parentNodeTemp.addClass('text-center');
+        _parentNodeTemp.height(height);
+        _parentNodeTemp.attr('id',_parentNode.attr('id')+"Temp");
+        $(_this._header+"Roll").append(_parentNodeTemp);
+        _this._column.forEach(function (column) {
+            let column_dom = $('#dom_'+column.name);
+            let column_dom_temp = column_dom.clone();
+            let columnNameDom = column_dom_temp.children()[0];
+            if (column.customization){
+                if (column.type === 'checkAll'){
+                    var checkbox = $($(columnNameDom).children()[0]).children()[0];
+                    checkbox.id = checkbox.id+"_temp";
+                }
+            }
+            if (!column.neglect){
+                $(columnNameDom).children()[0].id = 'sort_'+column.name+"_temp";
+            }
+            column_dom_temp.attr('id','dom_'+column.name+"_temp");
+            $(columnNameDom).css('width',column_dom.width()+_this._offset);
+            _parentNodeTemp.append(column_dom_temp);
+            if (!column.neglect){
+                let column_sort = $('#sort_'+column.name);
+                let column_sort_temp = $('#sort_'+column.name+"_temp");
+                column_dom.off('click');
+                column_dom.on('click',rule(column,column_sort,column_sort_temp));
+                column_dom_temp.on('click',rule(column,column_sort,column_sort_temp));
+            }
+            if (column.customization){
+                if (column.type === 'checkAll'){
+                    checkAll($(checkbox),column.column);
                 }
                 }
             }
             }
         });
         });
     }
     }
+    //初始化
     this.init = function() {
     this.init = function() {
         append();
         append();
+        if (_this._closeFloat)return;
         fixed();
         fixed();
+        cloneDom();
+    };
+
+    function checkAll(dom,column){
+        dom.on('click',function () {
+            if ($(this).is(":checked")== true) {
+                _this._vue[_this._checkbox].length = 0;
+                _this._data.forEach(function (object) {
+                    if (column) {
+                        object = object[column];
+                    }
+                    _this._vue[_this._checkbox].push(object);
+                });
+            } else {
+                _this._vue[_this._checkbox].length = 0;
+                _this._vue.$forceUpdate();
+            }
+        });
     }
     }
 };
 };

+ 103 - 4
resources/js/queryForm/queryForm.js

@@ -17,6 +17,7 @@ const query = function getQueryForm(data) {
         this.tip = data.tip || '';
         this.tip = data.tip || '';
         this.nextPage = nextPage;
         this.nextPage = nextPage;
         this.pervPage = pervPage;
         this.pervPage = pervPage;
+        this.goPage = goPage;
         this.getSearchData = getSearchData;
         this.getSearchData = getSearchData;
         this.autoSubmit = (data.autoSubmit !== false) ;
         this.autoSubmit = (data.autoSubmit !== false) ;
         this.param = data.param || [];
         this.param = data.param || [];
@@ -684,8 +685,101 @@ const query = function getQueryForm(data) {
                 redenerSearchFormOnData(_data[targetName].name, '', _data[targetName].mold);
                 redenerSearchFormOnData(_data[targetName].name, '', _data[targetName].mold);
             })
             })
         }
         }
+
+        /* rules 规则
+        *  son 子级元素 对象形式多传递 子级元素不存在时且 required_without_all_if 忽略列表内元素皆无值时使子级元素设置默认值
+        *       {son:{key:{required_without_all_if:[],default:''}}}
+        * date_relevance 时间关联 对象形式传递 date为起终时间 relevance为关联元素name
+        *   killing为标记干掉哪种类型元素(enum('date','relevance')) default为relevance列表值,时间差存在于该值中才会去选中
+        *   {date_relevance:{date:['',''],relevance:'',killing:'',default:[]}}
+        * */
+        let rules = _data[dom.name].rules;
+        if (rules && JSON.stringify(rules) !== '{}'){
+            if (rules['son']){
+                for (let key in rules['son']){
+                    if (!dom.value){
+                        redenerSearchFormOnData(_data[key].name, '', _data[key].mold);
+                        continue;
+                    }
+                    if (!_data[key].value){
+                        if (rules['son'][key].required_without_all_if && Array.isArray(rules['son'][key].required_without_all_if)){
+                            let sign = true;
+                            rules['son'][key].required_without_all_if.forEach(function (name) {
+                                if (_data[name].value) sign=false;
+                            });
+                            if (sign) redenerSearchFormOnData(_data[key].name, rules['son'][key].default, _data[key].mold);
+                        }
+                    }
+                }
+            }
+            if (rules['date_relevance']){
+                if (!rules['date_relevance']['date']
+                    || !Array.isArray(rules['date_relevance']['date'])
+                    || rules['date_relevance']['date'].length !== 2
+                    || !rules['date_relevance']['relevance']) return;
+                let start = _data[rules['date_relevance']['date'][0]];
+                let end = _data[rules['date_relevance']['date'][1]];
+                let relevance = _data[rules['date_relevance']['relevance']];
+                if (dom.name === rules['date_relevance']['relevance']){
+                    if (relevance.value){
+                        let today = getToday();
+                        let tarDate = getSubDate(getToday(),relevance.value);
+                        _data[end.name].value = today;
+                        _data[start.name].value = tarDate;
+                        redenerSearchFormOnData(end.name, tarDate, end.mold);
+                        redenerSearchFormOnData(start.name, tarDate, start.mold);
+                    }
+                    return;
+                }
+                if (!start.value || !end.value){
+                    if (rules['date_relevance']['killing'] === 'date'){
+                        _data[start.name].value = '';
+                        redenerSearchFormOnData(start.name, '', start.mold);
+                        _data[start.name].value = '';
+                        redenerSearchFormOnData(end.name, '', end.mold);
+                    }else{
+                        _data[relevance.name].value = '';
+                        redenerSearchFormOnData(relevance.name, '', relevance.mold);
+                    }
+                }
+                if (start.value && end.value){
+                    start.value = start.value.replace('+',' ');
+                    end.value = end.value.replace('+',' ');
+                    let diff = getDiffDay(start.value,end.value);
+                    if (rules['date_relevance']['default'] && rules['date_relevance']['default'].includes(diff)){
+                        _data[relevance.name].value = diff;
+                        redenerSearchFormOnData(relevance.name, diff, relevance.mold);}
+                    else {
+                        _data[relevance.name].value = '';
+                        redenerSearchFormOnData(relevance.name, '', relevance.mold);
+                    }
+                }
+            }
+        }
+    }
+    function getDiffDay(startDate,endDate) {
+        startDate = new Date(startDate);
+        endDate = new Date(endDate);
+        return Math.floor((endDate.getTime() - startDate.getTime())/(24*3600*1000));
+    }
+
+    function getSubDate(date,value) {
+        date = new Date(date);
+        date.setDate(date.getDate() - value);
+        return dateFormat(date);
+    }
+
+    function getToday() {
+        let myDate = new Date();
+        return dateFormat(myDate);
     }
     }
 
 
+    function dateFormat(date) {
+        let year=date.getFullYear();
+        let month=(date.getMonth()+1)<10 ? '0'+(date.getMonth()+1) : date.getMonth()+1;
+        let day=date.getDate()<10 ? '0'+date.getDate() : date.getDate();
+        return  year+"-"+month+"-"+day;
+    }
 
 
     // save search on cookie
     // save search on cookie
     function saveSearchOnCookie() {
     function saveSearchOnCookie() {
@@ -861,13 +955,13 @@ const query = function getQueryForm(data) {
     }
     }
 
 
     function rendererSearchFormOnTime(key, value, mold) {
     function rendererSearchFormOnTime(key, value, mold) {
-        if ([undefined, null, ''].includes(value)) {
-            $(_form).find("input[name='+key+']").val(value.substring(0, 10)).addClass('bg-warning');
+        if (![undefined, null, ''].includes(value)) {
+            $(_form).find("input[name="+key+"]").val(value.substring(0, 10)).addClass('bg-warning');
             if (value.length > 11 + 5) {
             if (value.length > 11 + 5) {
                 $(_form).find("input[name='" + key + "_tim']").val(value.substring(11, 5));
                 $(_form).find("input[name='" + key + "_tim']").val(value.substring(11, 5));
             }
             }
         } else {
         } else {
-            $(_form).find("input[name='+key+']").val("").removeClass('bg-warning');
+            $(_form).find("input[name="+key+"]").val("").removeClass('bg-warning');
             $(_form).find("input[name='" + key + "_tim']").val("");
             $(_form).find("input[name='" + key + "_tim']").val("");
         }
         }
     }
     }
@@ -954,6 +1048,7 @@ const query = function getQueryForm(data) {
                         mold: ['input', 'dateTime'].includes(condition.type) ? 'input' : condition.type,
                         mold: ['input', 'dateTime'].includes(condition.type) ? 'input' : condition.type,
                         data:condition.data,
                         data:condition.data,
                         killings:condition.killings,
                         killings:condition.killings,
+                        rules:condition.rules,
                     }
                     }
                     if (condition.type === 'search_select') {
                     if (condition.type === 'search_select') {
                         data.mold = 'select';
                         data.mold = 'select';
@@ -978,10 +1073,14 @@ const query = function getQueryForm(data) {
                             select: condition.select[index],
                             select: condition.select[index],
                             mold: ['input', 'dateTime'].includes(types[index]) ? 'input' : types[index],
                             mold: ['input', 'dateTime'].includes(types[index]) ? 'input' : types[index],
                             killings:condition.killings,
                             killings:condition.killings,
+                            rules:condition.rules,
                         }
                         }
                         if(condition.killings&&Array.isArray(condition.killings)){
                         if(condition.killings&&Array.isArray(condition.killings)){
                             data.killings=condition.killings[index];
                             data.killings=condition.killings[index];
                         }
                         }
+                        if(condition.rules&&Array.isArray(condition.rules)){
+                            data.rules=condition.rules[index];
+                        }
                         _data[_name] = data;
                         _data[_name] = data;
                     })
                     })
                 }
                 }
@@ -1040,7 +1139,7 @@ const query = function getQueryForm(data) {
                     rendererSearchFormOnMultipleSelect(key, value, mold);
                     rendererSearchFormOnMultipleSelect(key, value, mold);
                 }
                 }
             } else if (['time'].includes(type) && value !== undefined) {
             } else if (['time'].includes(type) && value !== undefined) {
-                $(_form).find("input[name='" + key + "']").val(value.substr(0, 10));
+                $(_form).find("input[name='" + key + "']").val(value.substr(0, 10)).addClass('bg-warning');
                 $(_form).find("input[id='" + key + "_min']").val(value.substr(11, value.length));
                 $(_form).find("input[id='" + key + "_min']").val(value.substr(11, value.length));
             }
             }
         }
         }

+ 1 - 0
resources/js/utilities/sort.js

@@ -12,6 +12,7 @@ const  sortData = {
         data['J']='';data['K']='';data['L']='';data['M']='';data['N']='';data['O']='';data['P']='';data['Q']='';data['R']='';
         data['J']='';data['K']='';data['L']='';data['M']='';data['N']='';data['O']='';data['P']='';data['Q']='';data['R']='';
         data['S']='';data['T']='';data['U']='';data['V']='';data['W']='';data['X']='';data['Y']='';data['Z']='';
         data['S']='';data['T']='';data['U']='';data['V']='';data['W']='';data['X']='';data['Y']='';data['Z']='';
         array.forEach(function (obj) {
         array.forEach(function (obj) {
+            if (!obj[column]) obj[column]='';
             if (!data[obj[column].charAt(i)])  data[obj[column].charAt(i)] = [obj];
             if (!data[obj[column].charAt(i)])  data[obj[column].charAt(i)] = [obj];
             else data[obj[column].charAt(i)].push(obj);
             else data[obj[column].charAt(i)].push(obj);
         });
         });

+ 12 - 0
resources/sass/layout.scss

@@ -55,6 +55,9 @@ table{
         &.td-helpful{
         &.td-helpful{
             background: #aaeace;
             background: #aaeace;
         }
         }
+        &.td-yellow{
+            background: #f8eea0;
+        }
     }
     }
     td{
     td{
         &.td-warm{
         &.td-warm{
@@ -66,6 +69,9 @@ table{
         &.td-helpful{
         &.td-helpful{
             background: #e7f5ee;
             background: #e7f5ee;
         }
         }
+        &.td-yellow{
+            background: #fcfaec;
+        }
     }
     }
 
 
     tr:nth-child(even) td{
     tr:nth-child(even) td{
@@ -78,6 +84,9 @@ table{
         &.td-helpful{
         &.td-helpful{
             background:  #ecf3ef;
             background:  #ecf3ef;
         }
         }
+        &.td-yellow{
+            background: #f8f5e4;
+        }
     }
     }
     tr:hover{
     tr:hover{
         td{
         td{
@@ -90,6 +99,9 @@ table{
             &.td-helpful{
             &.td-helpful{
                 background: #d7f3e5;
                 background: #d7f3e5;
             }
             }
+            &.td-yellow{
+                background: #fdf3db;
+            }
         }
         }
     }
     }
 }
 }

+ 1 - 1
resources/views/inventory/statement/allInventory.blade.php

@@ -65,7 +65,7 @@
 @endsection
 @endsection
 
 
 @section('lastScript')
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/export200813.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm200805b.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm200805b.js')}}"></script>
     <script>
     <script>
         $.cookie('xxx', 2223);
         $.cookie('xxx', 2223);

+ 47 - 26
resources/views/inventory/statement/changeInventory.blade.php

@@ -16,28 +16,12 @@
             <a class="dropdown-item" @click="processExport(true)" href="javascript:">导出所有页</a>
             <a class="dropdown-item" @click="processExport(true)" href="javascript:">导出所有页</a>
         </div>
         </div>
     </span>
     </span>
-    <table class="table table-sm table-striped table-bordered table-hover text-nowrap card-body mt-2">
-        <tr>
-            <th>
-                <label for="all">
-                    <input id="all" type="checkbox" @click="checkAll($event)">全选
-                </label>
-            </th>
-            <th>序号</th>
-            <th>货主</th>
-            <th>库位</th>
-            <th>产品编码</th>
-            <th>产品条码</th>
-            <th>商品名称</th>
-            <th>属性仓</th>
-            <th>质量状态</th>
-            <th>失效日期</th>
-            <th>批号</th>
-            <th>移出数量</th>
-            <th>移入数量</th>
-            <th>在库数量</th>
-            <th>占用数量</th>
-        </tr>
+    <label for="all" id="cloneCheckAll" class="d-none">
+        <input id="all" type="checkbox" @click="checkAll($event)">全选
+    </label>
+    <table class="table table-sm table-bordered text-nowrap d-none" id="headerRoll"></table>
+    <table class="table table-sm table-striped table-bordered table-hover text-nowrap card-body mt-2" id="headerParent">
+        <tr id="header"></tr>
         <tr v-for="(oracleActTransactingLog,i) in oracleActTransactingLogs">
         <tr v-for="(oracleActTransactingLog,i) in oracleActTransactingLogs">
             <td>
             <td>
                 <input class="checkItem" type="checkbox" :value="oracleActTransactingLog" v-model="checkData">
                 <input class="checkItem" type="checkbox" :value="oracleActTransactingLog" v-model="checkData">
@@ -71,11 +55,11 @@
 @endsection
 @endsection
 
 
 @section('lastScript')
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/export200813.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200813.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/header200819.js')}}"></script>
     <script>
     <script>
-        $.cookie('xxx', 2223);
-        new Vue({
+        let vue=new Vue({
             el:"#list",
             el:"#list",
             data:{
             data:{
                 oracleActTransactingLogs:{!! $oracleActTransactingLogs !!},
                 oracleActTransactingLogs:{!! $oracleActTransactingLogs !!},
@@ -137,14 +121,51 @@
                         return true;
                         return true;
                     });
                     });
                 }
                 }
+                let column = [
+                    {name:'cloneCheckAll',customization:true,type:'checkAll',
+                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
+                    {name:'index',value: '序号', neglect: true},
+                    {name:'货主',value: '货主', class:'text-primary'},
+                    {name:'库位',value: '库位', class:'text-muted'},
+                    {name:'产品编码',value: '产品编码', class:'text-muted'},
+                    {name:'产品条码',value: '产品条码', class:'text-muted'},
+                    {name:'商品名称',value: '商品名称'},
+                    {name:'属性仓',value: '属性仓', class:'text-muted'},
+                    {name:'质量状态',value: '质量状态', class:'text-muted'},
+                    {name:'失效日期',value: '失效日期', class:'text-muted'},
+                    {name:'批号',value: '批号', class:'text-muted'},
+                    {name:'移出数量',value: '移出数量', neglect: true},
+                    {name:'移入数量',value: '移入数量', neglect: true},
+                    {name:'在库数量',value: '在库数量', neglect: true},
+                    {name:'占用数量',value: '占用数量', neglect: true},
+                ];
+
+                let header=null;
+                let _this = this;
+                setTimeout(function () {
+                    header = new Header({
+                        el: "#header",
+                        column: column,
+                        data: _this.oracleActTransactingLogs,
+                        restorationColumn: 'rn',
+                        is_restorationColumn_asc:true,
+                        fixedTop:($('#form_div').height())+2,
+                        offset:0.5,
+                        vue:vue
+                    });
+                    header.init();
+                },0);
+
             },
             },
             watch:{
             watch:{
                 checkData:{
                 checkData:{
                     handler(){
                     handler(){
                         if (this.checkData.length === this.oracleActTransactingLogs.length){
                         if (this.checkData.length === this.oracleActTransactingLogs.length){
                             document.querySelector('#all').checked = true;
                             document.querySelector('#all').checked = true;
+                            document.querySelector('#all_temp').checked = true;
                         }else {
                         }else {
                             document.querySelector('#all').checked = false;
                             document.querySelector('#all').checked = false;
+                            document.querySelector('#all_temp').checked = false;
                         }
                         }
                     },
                     },
                     deep:true
                     deep:true

+ 1 - 1
resources/views/inventory/stockInventory/mission.blade.php

@@ -73,7 +73,7 @@
 @endsection
 @endsection
 
 
 @section('lastScript')
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/export200813.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm200805b.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm200805b.js')}}"></script>
     <script>
     <script>
         new Vue({
         new Vue({

+ 1 - 1
resources/views/layouts/app.blade.php

@@ -10,7 +10,7 @@
     <title>@yield('title') {{ config('app.name', '宝时WAS') }}</title>
     <title>@yield('title') {{ config('app.name', '宝时WAS') }}</title>
     @yield('head')
     @yield('head')
     <!-- Styles -->
     <!-- Styles -->
-    <link href="{{ asset('css/app200721.css') }}" rel="stylesheet">
+    <link href="{{ asset('css/app200811.css') }}" rel="stylesheet">
 </head>
 </head>
 <body>
 <body>
 <div id="app">
 <div id="app">

+ 21 - 9
resources/views/maintenance/role/index.blade.php

@@ -8,18 +8,13 @@
     </span>
     </span>
     <div class="container-fluid">
     <div class="container-fluid">
         <div class="card">
         <div class="card">
-            <div class="card-body">
+            <div class="card-body" id="list">
                 @if(Session::has('successTip'))
                 @if(Session::has('successTip'))
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                 @endif
                 @endif
-                <table class="table table-striped table-sm" id="list">
-                    <tr>
-                        <th>ID</th>
-                        <th>角色名</th>
-                        <th>允许权限</th>
-                        <th>禁止权限</th>
-                        <th>创建时间</th>
-                        <th>操作</th>
+                <table class="table table-bordered table-sm d-none" id="headerRoll"></table>
+                <table class="table table-striped table-sm" id="headerParent">
+                    <tr id="header">
                     </tr>
                     </tr>
                     <tr v-for="role in roles">
                     <tr v-for="role in roles">
                         <td class="text-muted">@{{role.id}}</td>
                         <td class="text-muted">@{{role.id}}</td>
@@ -54,6 +49,7 @@
 @endsection
 @endsection
 
 
 @section('lastScript')
 @section('lastScript')
+    <script type="text/javascript" src="{{asset('js/queryForm/header200819.js')}}"></script>
     <script>
     <script>
         new Vue({
         new Vue({
             el:"#list",
             el:"#list",
@@ -66,6 +62,22 @@
                     @endforeach
                     @endforeach
                 ],
                 ],
             },
             },
+            mounted:function(){
+                let column = [
+                    {name:'id',value: 'ID'},
+                    {name:'name',value: '用户名'},
+                    {name:'alias_name',value: '允许权限', neglect: true},
+                    {name:'alias_name_false',value: '禁止权限', neglect: true},
+                    {name:'created_at',value: '创建时间'},
+                    {name:'operation',value: '操作', neglect: true},
+                ];
+                let header = new Header({
+                    column: column,
+                    data: this.roles,
+                    restorationColumn: 'id',
+                });
+                header.init();
+            },
             methods:{
             methods:{
                 edit:function(id){
                 edit:function(id){
                     location.href = "{{url('maintenance/role')}}/"+id+"/edit";
                     location.href = "{{url('maintenance/role')}}/"+id+"/edit";

+ 62 - 38
resources/views/maintenance/user/index.blade.php

@@ -8,53 +8,50 @@
     </span>
     </span>
     <div class="container-fluid">
     <div class="container-fluid">
         <div class="card">
         <div class="card">
+            <div id="form_div"></div>
             <div class="card-body">
             <div class="card-body">
                 @if(Session::has('successTip'))
                 @if(Session::has('successTip'))
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                 @endif
                 @endif
-                <table class="table table-striped table-sm" id="list">
-                    <tr>
-                        <th>ID</th>
-                        <th>用户名</th>
-                        <th>角色</th>
-                        <th>工作组</th>
-                        <th>配置承运商</th>
-                        <th>邮件地址</th>
-                        <th>创建时间</th>
-                        <th>操作</th>
-                    </tr>
-                    <tr v-for="user in users">
-                        <td class="text-muted">@{{user.id}}</td>
-                        <td>@{{user.name}}</td>
-                        <td>
-                            <span class="text-danger" v-if="user.isSuperAdmin">超级管理员</span>
-                            <ul v-if="user.roles.length>0" class="list-group">
-                                <li v-for="role in user.roles" style="list-style: none">@{{ role.name }}</li>
-                            </ul>
-                        </td>
-                        <td><span v-if="user.workgroup&&user.workgroup.length>0">@{{ user.workgroup[0].name }}</span></td>
-                        <td>
-                            <ul v-if="user.carriers.length>0" class="list-group">
-                                <li v-for="carrier in user.carriers" style="list-style: none">@{{ carrier.name }}</li>
-                            </ul>
-                        </td>
-                        <td>@{{user.email}}</td>
-                        <td class="text-muted">@{{user.created_at}}</td>
-                        <td>
-                            @can('用户-编辑')
-                            <button class="btn btn-sm btn-outline-primary" @click="edit(user.id)">改</button> @endcan
-                            @can('用户-删除')
-                            <button class="btn btn-sm btn-outline-dark" @click="destroy(user)">删</button> @endcan
-                        </td>
-                    </tr>
-                </table>
-                {{$users->links()}}
+                <div id="list">
+                    <table class="table table-bordered table-sm d-none" id="headerRoll"></table>
+                    <table class="table table-striped table-sm" id="headerParent">
+                        <tr id="header"></tr>
+                        <tr v-for="user in users">
+                            <td class="text-muted">@{{user.id}}</td>
+                            <td>@{{user.name}}</td>
+                            <td>
+                                <span class="text-danger" v-if="user.isSuperAdmin">超级管理员</span>
+                                <ul v-if="user.roles.length>0" class="list-group">
+                                    <li v-for="role in user.roles" style="list-style: none">@{{ role.name }}</li>
+                                </ul>
+                            </td>
+                            <td><span v-if="user.workgroup&&user.workgroup.length>0">@{{ user.workgroup[0].name }}</span></td>
+                            <td>
+                                <ul v-if="user.carriers.length>0" class="list-group">
+                                    <li v-for="carrier in user.carriers" style="list-style: none">@{{ carrier.name }}</li>
+                                </ul>
+                            </td>
+                            <td>@{{user.email}}</td>
+                            <td class="text-muted">@{{user.created_at}}</td>
+                            <td>
+                                @can('用户-编辑')
+                                <button class="btn btn-sm btn-outline-primary" @click="edit(user.id)">改</button> @endcan
+                                @can('用户-删除')
+                                <button class="btn btn-sm btn-outline-dark" @click="destroy(user)">删</button> @endcan
+                            </td>
+                        </tr>
+                    </table>
+                    {{$users->links()}}
+                </div>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>
 @endsection
 @endsection
 
 
 @section('lastScript')
 @section('lastScript')
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/header200819.js')}}"></script>
     <script>
     <script>
         new Vue({
         new Vue({
             el:"#list",
             el:"#list",
@@ -66,13 +63,40 @@
                         roles:{!! $user->roles !!},carriers:{!! $user->carriers !!},workgroup:{!! $user->userWorkgroups !!},created_at:'{{$user->created_at}}'},
                         roles:{!! $user->roles !!},carriers:{!! $user->carriers !!},workgroup:{!! $user->userWorkgroups !!},created_at:'{{$user->created_at}}'},
                     @endforeach
                     @endforeach
                 ],
                 ],
+                form:'',
+            },
+            mounted:function(){
+                let data = [[{name:'name',type:'input',tip:'用户名:可在两侧添加百分号(%)进行模糊搜索',placeholder:'用户名'},
+                    {name:'role',type:'input',tip:'角色名:可在两侧添加百分号(%)进行模糊搜索',placeholder:'角色名'}]];
+                this.form = new query({
+                    el: '#form_div',
+                    condition: data,
+                })
+                this.form.init();
+                let column = [
+                    {name:'id',value: 'ID'},
+                    {name:'name',value: '用户名'},
+                    {name:'role_name',value: '角色', neglect: true},
+                    {name:'workgroup_name',value: '工作组', neglect: true},
+                    {name:'carrier_name',value: '配置承运商', neglect: true},
+                    {name:'email',value: '邮件地址'},
+                    {name:'created_at',value: '创建时间'},
+                    {name:'operation',value: '操作', neglect: true},
+                ];
+                let header = new Header({
+                    column: column,
+                    data: this.users,
+                    restorationColumn: 'id',
+                    is_restorationColumn_asc:true,
+                });
+                header.init();
             },
             },
             methods:{
             methods:{
                 edit:function(id){
                 edit:function(id){
                     location.href = "{{url('maintenance/user')}}/"+id+"/edit";
                     location.href = "{{url('maintenance/user')}}/"+id+"/edit";
                 },
                 },
                 destroy:function(user){
                 destroy:function(user){
-                    if(!confirm('确定要删除用户“' + user.name + '”吗?')){return};
+                    if(!confirm('确定要删除用户“' + user.name + '”吗?'))return;
                     let data=this;
                     let data=this;
                     let url = "{{url('maintenance/user')}}/"+user.id;
                     let url = "{{url('maintenance/user')}}/"+user.id;
                     axios.delete(url,{id:user.id})
                     axios.delete(url,{id:user.id})

+ 100 - 49
resources/views/order/index/delivering.blade.php

@@ -25,6 +25,8 @@
                         <span class="btn btn-sm tooltipTarget ml-2" @click="deAllocationAll" style="cursor: pointer"  title="订单的取消分配条件要只局限在“分配完成”或“部分分配”"
                         <span class="btn btn-sm tooltipTarget ml-2" @click="deAllocationAll" style="cursor: pointer"  title="订单的取消分配条件要只局限在“分配完成”或“部分分配”"
                               :class="[checkData.length>0?'btn-dark':'btn-outline-dark']">取消分配</span>
                               :class="[checkData.length>0?'btn-dark':'btn-outline-dark']">取消分配</span>
                     @endcan
                     @endcan
+                    @can('订单管理-订单问题件生成')<button type="button"  @click="orderIssueTag()" type="button" class="btn btn-sm ml-2 btn-outline-primary ">标记问题件</button>@endcan
+
                 </div>
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
                     <div class="modal-dialog">
@@ -42,47 +44,12 @@
                         </div><!-- /.modal-content -->
                         </div><!-- /.modal-content -->
                     </div><!-- /.modal -->
                     </div><!-- /.modal -->
                 </div>
                 </div>
-                <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ml-3">
-                    <tr class="text-nowrap">
-                        <th>
-                            <label for="all">
-                                <input id="all" type="checkbox" @click="checkAll($event)">全选
-                            </label>
-                        </th>
-                        <th>序号</th>
-                        <th>编号</th>
-                        <th>订单状态</th>
-                        <th>接口下发时间</th>
-                        <th>店铺名称</th>
-                        <th>客户</th>
-                        <th>客户订单号</th>
-                        <th>承运人</th>
-                        <th>快递单号</th>
-                        <th>收货人名称</th>
-                        <th>收货人电话</th>
-                        <th>省</th>
-                        <th>市</th>
-                        <th>区</th>
-                        <th style="min-width:320px;">收货人地址</th>
-                        <th>波次编号</th>
-                        <th>仓库</th>
-                        <th>快递获取标记</th>
-                        <th>快递获取时间</th>
-                        <th style="min-width: 150px">产品代码</th>
-                        <th style="min-width: 150px">产品条码</th>
-                        <th style="min-width: 180px">产品名称</th>
-                        <th>订单数量</th>
-                        <th style="min-width: 150px">明细状态</th>
-                        <th>复核时间</th>
-                        <th style="min-width:260px;">备注</th>
-                        <th>接口取消标记</th>
-                        <th>拣货单打印标记</th>
-                        <th>接口回传标记</th>
-                        <th>接口回传异常备注</th>
-                        <th>订单冻结</th>
-                        <th>取消分配</th>
-
-                    </tr>
+                <label for="all" id="cloneCheckAll" class="d-none">
+                    <input id="all" type="checkbox" @click="checkAll($event)">全选
+                </label>
+                <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ml-3 d-none" id="headerRoll"></table>
+                <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ml-3" id="headerParent">
+                    <tr class="text-nowrap" id="header"></tr>
                     <tr v-for="(order,i) in orders" @click="selectedColor(order.orderno)" :style="{'font-weight': order.orderno==selectedStyle?'bold':''}">
                     <tr v-for="(order,i) in orders" @click="selectedColor(order.orderno)" :style="{'font-weight': order.orderno==selectedStyle?'bold':''}">
                         <td>
                         <td>
                             <input class="checkItem" type="checkbox" :value="order.orderno" v-model="checkData">
                             <input class="checkItem" type="checkbox" :value="order.orderno" v-model="checkData">
@@ -172,10 +139,11 @@
 @endsection
 @endsection
 
 
 @section('lastScript')
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/export200813.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200813.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/header200819.js')}}"></script>
     <script>
     <script>
-        new Vue({
+        let vue=new Vue({
             el:"#list",
             el:"#list",
             data:{
             data:{
                 page:Number('{{$page}}'),
                 page:Number('{{$page}}'),
@@ -208,18 +176,22 @@
                 }
                 }
                 let data=[
                 let data=[
                     [   {name:'codename_c',type:'select',placeholder:'订单状态',data:this.codes},
                     [   {name:'codename_c',type:'select',placeholder:'订单状态',data:this.codes},
-                        {name:'orderdate_start',type:'time',tip:['选择显示日期的起始时间','选择显示日期的起始时间']},
+                        {name:'orderdate_start',type:'time',tip:['选择显示日期的起始时间','选择显示日期的起始时间'],
+                            rules:{date_relevance:{date:['orderdate_start','orderdate_end'],relevance:'addtime',killing:'relevance',default:[31,92,183,366]}}},
                         {name:'orderno',type:'input',tip:'编号,糊模查找需要在左边打上%符号',placeholder: '编号'},
                         {name:'orderno',type:'input',tip:'编号,糊模查找需要在左边打上%符号',placeholder: '编号'},
                         {name:'carriername',type:'input',tip:'',placeholder:'承运人'},
                         {name:'carriername',type:'input',tip:'',placeholder:'承运人'},
-                        {name:['notes','addtime'],type:'input_select',tip:['右侧选择查询范围,默认为一天内','查询范围,范围越短搜索越快'],placeholder: ['客户',''],
-                            data:[{name:'31',value:'近一月'},{name:'92',value:'近三月'},{name:'183',value:'近半年'},{name:'366',value:'近一年'},{name:'0',value:'不限'},]},
+                        {name:['notes','addtime'],type:'input_select',tip:['右侧选择查询范围,默认为一天内','查询范围,范围越短搜索越快'],placeholder: ['备注',''],
+                            data:[{name:'31',value:'近一月'},{name:'92',value:'近三月'},{name:'183',value:'近半年'},{name:'366',value:'近一年'},{name:'0',value:'不限'},],
+                            rules:[{son:{addtime:{default:'31',required_without_all_if:['orderdate_start','orderdate_end']}}},
+                                {date_relevance:{date:['orderdate_start','orderdate_end'],relevance:'addtime',killing:'relevance',default:[31,92,183,366]}}]},
                         {name:'issuepartyname',type:'input',tip:'',placeholder: '店铺名称'},
                         {name:'issuepartyname',type:'input',tip:'',placeholder: '店铺名称'},
                         {name:'edisendflag2',type:'select',tip:'快递获取标记',placeholder: '快递获取标记',data:[{name:'Y',value:'是'},{name:'N',value:'否'},{name:'W',value:'错误'},]},
                         {name:'edisendflag2',type:'select',tip:'快递获取标记',placeholder: '快递获取标记',data:[{name:'Y',value:'是'},{name:'N',value:'否'},{name:'W',value:'错误'},]},
                         {name:'edisendflag',type:'select',tip:'接口回传标记',placeholder: '接口回传标记',data:[{name:'Y',value:'Y'},{name:'N',value:'N'},{name:'W',value:'W'},{name:'R',value:'R'},]}
                         {name:'edisendflag',type:'select',tip:'接口回传标记',placeholder: '接口回传标记',data:[{name:'Y',value:'Y'},{name:'N',value:'N'},{name:'W',value:'W'},{name:'R',value:'R'},]}
                     ],
                     ],
                     [
                     [
                         {name:'codename_c_end',type:'select',placeholder:'订单状态范围',data:this.codes},
                         {name:'codename_c_end',type:'select',placeholder:'订单状态范围',data:this.codes},
-                        {name:'orderdate_end',type:'time',tip:['选择显示指定日期的结束时间','选择显示指定日期的结束时间']},
+                        {name:'orderdate_end',type:'time',tip:['选择显示指定日期的结束时间','选择显示指定日期的结束时间'],
+                            rules:{date_relevance:{date:['orderdate_start','orderdate_end'],relevance:'addtime',killing:'date',default:[31,92,183,366]}}},
                         {name:'customerid',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的客户'],
                         {name:'customerid',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的客户'],
                             placeholder:['货主','定位或多选货主'],data:this.owners},
                             placeholder:['货主','定位或多选货主'],data:this.owners},
                         {name:'soreference5',type:'input',tip:'可支持多快递单号,糊模查找需要在左边打上%符号',placeholder: '多快递单号'},
                         {name:'soreference5',type:'input',tip:'可支持多快递单号,糊模查找需要在左边打上%符号',placeholder: '多快递单号'},
@@ -233,14 +205,65 @@
                     condition:data,
                     condition:data,
                 });
                 });
                 this.form.init();
                 this.form.init();
+                let column = [
+                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'orderno',
+                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
+                    {name:'index',value: '序号', neglect: true},
+                    {name:'orderno',value: '编号'},
+                    {name:'ordercodename',value: '订单状态'},
+                    {name:'addtime',value: '接口下发时间'},
+                    {name:'issuepartyname',value: '店铺名称'},
+                    {name:'customer_descr_c',value: '客户'},
+                    {name:'soreference1',value: '客户订单号'},
+                    {name:'carriername',value: '承运人'},
+                    {name:'soreference5',value: '快递单号'},
+                    {name:'c_contact',value: '收货人名称'},
+                    {name:'c_tel2',value: '收货人电话'},
+                    {name:'c_province',value: '省'},
+                    {name:'c_city',value: '市'},
+                    {name:'c_district',value: '区'},
+                    {name:'c_address1',value: '收货人地址', style:"min-width:320px;"},
+                    {name:'waveno',value: '波次编号'},
+                    {name:'warehouseid',value: '仓库'},
+                    {name:'edisendflag2',value: '快递获取标记'},
+                    {name:'edisendtime2',value: '快递获取时间'},
+                    {name:'sku',value: '产品代码', neglect: true, style:"min-width: 150px"},
+                    {name:'alternate_sku1',value: '产品条码', neglect: true, style:"min-width: 150px"},
+                    {name:'descr_c',value: '产品名称', neglect: true, style:"min-width: 180px"},
+                    {name:'qtyordered',value: '订单数量', neglect: true},
+                    {name:'orderdetailcodename',value: '明细状态', neglect: true, style:"min-width: 150px"},
+                    {name:'checktime',value: '复核时间', neglect: true},
+                    {name:'notes',value: '备注', style:"min-width: 260px"},
+                    {name:'erpcancelflag',value: '接口取消标记'},
+                    {name:'picking_print_flag',value: '拣货单打印标记'},
+                    {name:'edisendflag',value: '接口回传标记'},
+                    {name:'ediremarks2',value: '接口回传异常备注'},
+                    {name:'update',value: '订单冻结', neglect: true},
+                    {name:'remove',value: '取消分配', neglect: true},
+                ];
+                let _this=this;
+                setTimeout(function () {
+                    let header = new Header({
+                        el: "#header",
+                        column: column,
+                        data: _this.orders,
+                        restorationColumn: 'addtime',
+                        fixedTop:($('#form_div').height())+2,
+                        offset:0.5,
+                        vue:vue
+                    });
+                    header.init();
+                },0);
             },
             },
             watch:{
             watch:{
                 checkData:{
                 checkData:{
                     handler(){
                     handler(){
                         if (this.checkData.length === this.orders.length){
                         if (this.checkData.length === this.orders.length){
                             document.querySelector('#all').checked = true;
                             document.querySelector('#all').checked = true;
+                            document.querySelector('#all_temp').checked = true;
                         }else {
                         }else {
                             document.querySelector('#all').checked = false;
                             document.querySelector('#all').checked = false;
+                            document.querySelector('#all_temp').checked = false;
                         }
                         }
                     },
                     },
                     deep:true
                     deep:true
@@ -469,7 +492,35 @@
                         return
                         return
                     }
                     }
                     order.is_unfold=false;
                     order.is_unfold=false;
-                }
+                },
+                orderIssueTag(){
+                   // 标记问题单
+                    let _this = this;
+                    if( _this.checkData.length === 0){
+                        tempTip.show('没有勾选记录');
+                        return
+                    }
+                    tempTip.setDuration(99999);
+                    tempTip.waitingTip('处理中,请稍候')
+                    axios.post("{{url('apiLocal/order/issue/orderIssueTag')}}",{orderNos:_this.checkData}).then(function(res){
+                        tempTip.setDuration(5000)
+                        tempTip.cancelWaitingTip();
+                        if(res.data.success){
+                            tempTip.setDuration(3000);
+                            tempTip.showSuccess('已标记为问题件');
+                            setTimeout(function(){
+                                window.location.href = "{{url('order/issue/index')}}";
+                            },1000);
+                        }else{
+                            tempTip.setDuration(4000);
+                            tempTip.show(res.data.fail_info);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(3000);
+                        tempTip.cancelWaitingTip();
+                        tempTip.show('网络链接异常'+err);
+                    })
+                },
             },
             },
         });
         });
     </script>
     </script>

+ 505 - 0
resources/views/order/issue/create.blade.php

@@ -0,0 +1,505 @@
+@extends('layouts.app')
+@section('title')问题件-录入@endsection
+
+@section('content')
+    @component("order.issue.menu")@endcomponent
+    <div id="issue_create_div" class="d-none">
+        <div class="container-fluid">
+            <div class="card col-md-8 offset-md-2">
+                <div class="card-header">订单问题件录入</div>
+                <div class="card-body">
+                    <form action="{{url('order/issue/store')}}" method="post">
+                        @csrf
+                        @method('POST')
+                        <input type="hidden" name="rejected_bill_id" :value='rejectedBill.id'>
+                        <input type="hidden" name="order_id" :value='order.id'>
+                        <input type="hidden" name="second_order_id" :value='second_order_id'>
+                        <div class="form-group row">
+                            <label for="logistic_number_return" class="col-2 col-form-label text-right ">退回单号</label>
+                            <div class="col-8 ">
+                                <input type="text" name="logistic_number_return" id="logistic_number_return"
+                                       class="form-control col-lg-5 @error('logistic_number_return') is-invalid @enderror"
+                                       v-model="logistic_number_return"
+                                       @blur="checkLogisticNumberReturn()"
+                                       value="@if(old('logistic_number_return')){{old('logistic_number_return')}}@endif">
+                                @error('logistic_number_return')
+                                <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
+                                @enderror
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="wms_order_no" class="col-2 col-form-label text-right ">原始WMS订单号</label>
+                            <div class="col-8">
+                                <input type="text" name="wms_order_no" id="wms_order_no"
+                                       class="form-control col-lg-5 @error('wms_order_no') is-invalid @enderror"
+                                       @blur="checkWMSOrderNo($event)"
+                                       v-model="wms_order_no"
+                                       value="@if(old('wms_order_no')){{old('wms_order_no')}}@endif">
+                                @error('wms_order_no')
+                                <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
+                                @enderror
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="order_issue_type_id" class="col-2 col-form-label text-right text-primary"><span class="text-danger">*</span>问题类别</label>
+                            <div class="col-8">
+                                <select name="order_issue_type_id" id="order_issue_type_id"
+                                        class="form-control @error('order_issue_type_id') is-invalid @enderror" v-model="order_issue_type_id">
+                                    <option value></option>
+                                    <option v-for="type in types " :value="type.id">@{{ type.name }}</option>
+                                </select>
+                                @error('order_issue_type_id')
+                                <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
+                                @enderror
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="" class="col-2 col-form-label text-right">原始商品详情</label>
+                            <div class="col-8" id="">
+                                <div class="alert alert-success" role="alert" v-if="order.packages">
+                                    商品详情已填充
+                                </div>
+                                <div class="alert alert-secondary" role="alert" v-else>
+                                    原始商品详情通过原始订单号或退回单号输入进行自动填充
+                                </div>
+                                <table class="table table-responsive-sm" v-if="order.packages">
+                                    <tr>
+                                        <th>条码</th>
+                                        <th>商品名</th>
+                                        <th>数量</th>
+                                    </tr>
+                                    <tr v-for="packages in order.packages">
+                                        <template v-for="items in packages.commodities">
+                                            <td>@{{ items.commodity.sku }}</td>
+                                            <td>@{{ items.commodity.name }}</td>
+                                            <td>@{{ items.amount }}</td>
+                                        </template>
+                                    </tr>
+                                </table>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="" class="col-2 col-form-label text-right ">退回单商品详情</label>
+                            <div class="col-8" id="">
+                                <div class="alert alert-success" role="alert" v-if="rejectedBill.items">
+                                    商品详情已填充
+                                </div>
+                                <div class="alert alert-secondary" role="alert" v-else>
+                                    退回单商品详情通过原始订单号或退回单号输入进行自动填充
+                                </div>
+                                <table class="table table-responsive-sm" v-if="rejectedBill.items">
+                                    <tr>
+                                        <th>条码</th>
+                                        <th>商品名</th>
+                                        <th>数量</th>
+                                        <th>是否正品</th>
+                                        <th>备注</th>
+                                    </tr>
+                                    <tr v-for="item in rejectedBill.items">
+                                        <td>@{{ item.barcode_goods }}</td>
+                                        <td>@{{ item.name_goods }}</td>
+                                        <td>@{{ item.amount }}</td>
+                                        <td>@{{ item.validity_at }}</td>
+                                        <td>@{{ item.remark }}</td>
+                                    </tr>
+                                </table>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="wms_order_no" class="col-2 col-form-label text-right text-primary"><span class="text-danger">*</span>货主</label>
+                            <div class="col-8 row">
+                                <div class="form-group col-lg-5">
+                                    <select class="form-control @error('owner_id') is-invalid @enderror" name="owner_id" v-model="order.owner_id" >
+                                        <option value></option>
+                                        <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}</option>
+                                    </select>
+                                    @error('owner_id')
+                                    <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
+                                    @enderror
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="wms_order_no" class="col-2 col-form-label text-right ">原始承运商</label>
+                            <div class="col-8 row">
+                                <div class="form-group col-lg-5">
+                                    <select class="form-control " name="logistic_id" v-model="order.logistic_id">
+                                        <option value></option>
+                                        <option v-for="logistic in logistics" :value="logistic.id">@{{ logistic.name
+                                            }}
+                                        </option>
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="wms_order_no" class="col-2 col-form-label text-right ">收货人名称</label>
+                            <div class="col-8">
+                                <input type="text" name="consignee_name " class="form-control"
+                                       v-model="order.consignee_name">
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="wms_order_no" class="col-2 col-form-label text-right ">收货人号码</label>
+                            <div class="col-8">
+                                <input type="text" name="consignee_phone" class="form-control"
+                                       v-model="order.consignee_phone">
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label class="col-2 col-form-label text-right ">收货人地址</label>
+                            <div class="col-8 row">
+                                <div class="form-group col-lg-4">
+                                    <input type="text" name="province" class="form-control" placeholder="省"
+                                           v-model="order.province"></div>
+                                <div class="form-group col-lg-4">
+                                    <input type="text" name="city" class="form-control" placeholder="市"
+                                           v-model="order.city"></div>
+                                <div class="form-group col-lg-4">
+                                    <input type="text" name="district" class="form-control" placeholder="区"
+                                           v-model="order.district"></div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label class="col-2 col-form-label text-right ">详细地址</label>
+                            <div class="col-8 ">
+                                <input type="text" name="address" class="form-control " v-model="order.address">
+                            </div>
+                        </div>
+
+                        <div class="form-group row">
+                            <label for="second_order_no" class="col-2 col-form-label text-right">二次订单编号</label>
+                            <div class="col-8">
+                                <input type="text" name="second_order_no" id="second_order_no" class="form-control"
+                                       value="@if(old('second_order_no')){{old('second_order_no')}}@endif"
+                                       @blur="verifySecondOrder($event)"
+                                       v-model="secondOrderNo">
+                                <div class="valid-feedback" style="display: none" id="secondOrderNo_feedback"></div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="second_order_no" class="col-2 col-form-label text-right">二次承运商</label>
+                            <div class="col-8">
+                                <select class="form-control" v-model="secondOrder.logistic_id">
+                                    <option></option>
+                                    <option v-for="logistic in logistics" :value="logistic.id">@{{ logistic.name }}
+                                    </option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="" class="col-2 col-form-label text-right">二次订单商品明细</label>
+                            <div class="col-8" id="">
+                                <div class="alert alert-success" role="alert" v-if="secondOrder.packages">
+                                    商品详情已填充
+                                </div>
+                                <div class="alert alert-secondary" role="alert" v-else>
+                                    商品明细通过二次订单编号进行自动填充
+                                </div>
+                                <table class="table table-responsive-sm" v-if="secondOrder.packages">
+                                    <tr>
+                                        <th>条码</th>
+                                        <th>商品名</th>
+                                        <th>数量</th>
+                                    </tr>
+                                    <tr v-for="packages in secondOrder.packages">
+                                        <template v-for="items in packages.commodities">
+                                            <td>@{{ items.commodity.sku }}</td>
+                                            <td>@{{ items.commodity.name }}</td>
+                                            <td>@{{ items.amount }}</td>
+                                        </template>
+                                    </tr>
+                                </table>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="order_issue_type_id" class="col-2 col-form-label text-right ">最终状态</label>
+                            <div class="col-8">
+                                <select name="final_status" id="final_status" class="form-control"
+                                        v-model="finalStatus">
+                                    <option value></option>
+                                    <option v-for="type in final_status " :value="type">@{{ type }}</option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="" class="col-2 col-form-label text-right ">处理结果说明</label>
+                            <div class="col-8">
+                                <textarea name="result_explain" class="form-control"></textarea>
+                            </div>
+                        </div>
+
+                        <div class="form-group row">
+                            <label for="logistic_indemnity_money"
+                                   class="col-2 col-form-label text-right ">承运商赔偿金额</label>
+                            <div class="col-8">
+                                <input type="text" name="logistic_indemnity_money" id="logistic_indemnity_money"
+                                       class="form-control"
+                                       value="@if(old('logistic_indemnity_money')){{old('logistic_indemnity_money')}}@endif">
+                                @error('logistic_indemnity_money')
+                                <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
+                                @enderror
+                            </div>
+                        </div>
+
+                        <div class="form-group row">
+                            <label for="logistic_express_remission"
+                                   class="col-2 col-form-label text-right ">承运商快递减免</label>
+                            <div class="col-8">
+                                <select name="logistic_express_remission" id="logistic_express_remission"
+                                        class="form-control"
+                                        v-model='logistic_express_remission'>
+                                    <option value></option>
+                                    <option v-for="remission in Remission " :value="remission">@{{ remission }}
+                                    </option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="form-group row">
+                            <label for="baoshi_indemnity_money"
+                                   class="col-2 col-form-label text-right ">宝时赔偿金额</label>
+                            <div class="col-8">
+                                <input type="text" name="baoshi_indemnity_money" id="baoshi_indemnity_money"
+                                       class="form-control"
+                                       value="@if(old('baoshi_indemnity_money')){{old('baoshi_indemnity_money')}}@endif">
+                                @error('baoshi_indemnity_money')
+                                <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
+                                @enderror
+                            </div>
+                        </div>
+
+                        <div class="form-group row">
+                            <label for="baoshi_express_remission"
+                                   class="col-2 col-form-label text-right ">宝时快递减免</label>
+                            <div class="col-8">
+                                <select name="baoshi_express_remission" id="baoshi_express_remission"
+                                        class="form-control" v-model="baoshi_express_remission">
+                                    <option value></option>
+                                    <option v-for="remission in Remission " :value="remission">@{{ remission }}</option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="form-group row">
+                            <label for="user_workgroup_id"
+                                   class="col-2 col-form-label text-right ">事故责任方</label>
+                            <div class="col-8">
+                                <select name="user_workgroup_id" id="user_workgroup_id" class="form-control"
+                                        v-model="userWorkgroupId">
+                                    <option value></option>
+                                    <option v-for="wrokGroup in userWorkGroup " :value="wrokGroup.id">@{{ wrokGroup.name }}
+                                    </option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <div class="col-8 offset-2">
+                                <button type="submit" class="btn btn-success form-control" :disabled="!isSubmit">提交
+                                </button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+
+    </div>
+@endsection
+@section('lastScript')
+    <script type="text/javascript">
+        let crete_vue = new Vue({
+                el: '#issue_create_div',
+            data: {
+                logistic_number_return: @if(old('logistic_number_return'))"{{old('logistic_number_return')}}"
+                @else''@endif,
+                wms_order_no: @if(old('wms_order_no'))"{{old('wms_order_no')}}"
+                @else''@endif,
+                second_order_id: @if(old('second_order_id'))"{{old('second_order_id')}}"
+                @else''@endif,
+                secondOrderNo: @if(old('secondOrderNo'))"{{old('secondOrderNo')}}"
+                @else''@endif,
+                order_issue_type_id: @if(old('order_issue_type_id'))"{{old('order_issue_type_id')}}"
+                @else''@endif,
+                owners:{!! $owners !!},
+                logistics:{!! $logistic !!},
+                types:{!! $types !!},
+                userWorkGroup:{!! $userWorkGroup !!},
+                rejectedBill: '',// 退回单信息
+                order_id: @if(old('order_id')){{old('order_id')}}@else''@endif,
+                isSubmit: false,
+                // 原始订单信息
+                order: {
+                    orderno: '',
+                    logstic_number: '',
+                    address: '',
+                    province: '',
+                    city: '',
+                    district: '',
+                    consignee_name: '',
+                    consignee_phone: '',
+                    carrierid: '',
+                    owner_id: @if(old('owner_id')){{old('owner_id')}}@else '' @endif,
+                    ownerName: '',
+                    order_id: '',
+                },
+                // 二次订单
+                secondOrder: {
+                    logistic_id: '', code: '',
+                },
+                final_status: ['已解决', '已解决', '待退回', '退回中'],
+                Remission: ['原单减免', '部分减免', '全部减免'],
+                order_issue_type_id: @if(old('order_issue_type_id')){{old('order_issue_type_id')}}@else''@endif,
+                finalStatus: @if(old('final_status')){{old('final_status')}}@else''@endif,
+                logistic_express_remission: @if(old('logistic_express_remission')){{old('logistic_express_remission')}}@else''@endif,
+                baoshi_express_remission: @if(old('baoshi_express_remission')){{old('baoshi_express_remission')}}@else''@endif,
+                userWorkgroupId: @if(old('user_workgroup_id')){{old('user_workgroup_id')}}@else''@endif,
+            },
+            mounted: function () {
+                $("#issue_create_div").removeClass('d-none');
+                if (this.wms_order_no) {
+                    this.checkWMSOrderNo();
+                }
+                if (this.secondOrderNo) {
+                    this.verifySecondOrder();
+                }
+                if (this.logistic_number_return) {
+                    this.logistic_number_return= this.logistic_number_return;
+                    this.checkLogisticNumberReturn();
+                }
+            },
+            watch: {
+                order_issue_type_id: {
+                    handler: function (value) {
+                        if (value == null || value == '') {
+                            this.isSubmit = false;
+                        }
+                    },
+                    immediate: true
+                },
+                order:function(value){
+                    if(value){
+
+                    }
+
+                },
+                logistic_number_return: {
+                    handler: function (value) {
+                        $("#wms_order_no").attr('disabled', !(value === ''));
+                        $("#logistic_number").attr('disabled', !(value === ''));
+                    },
+                    immediate: true
+                },
+                wms_order_no: {
+                    handler: function (value) {
+                        $("#logistic_number_return").attr('disabled', !(value === ''));
+                        $("#logistic_number").attr('disabled', !(value === ''));
+                    },
+                    immediate: true
+                },
+                secondOrder: function (order) {
+                    if (order) {
+                        this.second_order_id = order.id;
+                    } else {
+                        this.second_order_id = '';
+                    }
+                },
+                rejectedBill:function(value){
+                    if(value){
+                        this.logistic_number_return = value.logistic_number_return;
+                    }else{
+                        this.logistic_number_return = '';
+                    }
+                }
+            },
+            methods: {
+                checkLogisticNumberReturn: function () {
+// 校验退回单号是否存在及是否存在退回单是否已有对应的问题件
+                    if (this.logistic_number_return == null || this.logistic_number_return == '') {
+                        return;
+                    }
+                    let _this = this;
+                    let data = {type: 'RejectedBill', id: this.logistic_number_return};
+                    axios.post("{{url('apiLocal/order/issue/orderIssueHasCreate')}}", data).then(function (res) {
+                        if (res.data.success) {
+                            if(res.data.data){
+                                if (res.data.data.order) {
+                                    _this.order = res.data.data.order;
+                                }
+                                if (res.data.data.rejectedBill) {
+                                    _this.rejectedBill = res.data.data.rejectedBill;
+                                }
+                            }
+                            if(res.data.fail_info){
+                                tempTip.setDuration(3000);
+                                tempTip.showSuccess(res.data.fail_info);
+                            }
+                            _this.isSubmit = true;
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.fail_info);
+                            _this.isSubmit = false;
+
+                        }
+                    }).catch(function (err) {
+                        tempTip.setDuration(5000);
+                        tempTip.show('网络链接失败:' + err);
+                        _this.isSubmit = false;
+                    });
+                },
+                checkWMSOrderNo() {
+                    if (this.wms_order_no == '' || this.wms_order_no == null) {
+                        return;
+                    }
+                    let _this = this;
+                    let data = {type: 'WMSOrderNo', id: this.wms_order_no};
+                    axios.post("{{url('apiLocal/order/issue/orderIssueHasCreate')}}", data).then(function (res) {
+                        if (res.data.success) {
+                            if (res.data.data.order) {
+                                _this.order = res.data.data.order;
+                            }
+                            if (res.data.data.rejectedBill) {
+                                _this.rejectedBill = res.data.data.rejectedBill;
+                                if (res.data.data.rejectedBill.items) {
+                                    _this.rejectedBillItems = res.data.data.rejectedBill.items;
+                                }
+                            }
+                            _this.isSubmit = true;
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.fail_info);
+                            _this.isSubmit = false;
+                        }
+                    }).catch(function (err) {
+                        tempTip.setDuration(5000);
+                        tempTip.show('网络链接失败:' + err);
+                        _this.isSubmit = false;
+                    });
+                },
+                verifySecondOrder: function () {
+                    if (this.secondOrderNo == '' || this.secondOrderNo == null) {
+                        return;
+                    }
+                    let _this = this;
+                    let data = {type: 'WMSOrderNo', WMSOrderNo: this.secondOrderNo};
+                    axios.post("{{url('apiLocal/order/issue/getOrderInfoByWMSOrderNo')}}", data).then(function (res) {
+                        if (res.data.success) {
+                            _this.secondOrder = res.data.data;
+                            _this.isSubmit = true;
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.fail_info);
+                            _this.isSubmit = false;
+                        }
+                    }).catch(function (err) {
+                        tempTip.setDuration(5000);
+                        tempTip.show('网络链接失败:' + err);
+                        _this.isSubmit = false;
+                    });
+                },
+            }
+        })
+
+    </script>
+
+@endsection

+ 288 - 0
resources/views/order/issue/edit.blade.php

@@ -0,0 +1,288 @@
+@extends('layouts.app')
+@section('title')问题件-编辑@endsection
+
+@section('content')
+    @component("order.issue.menu")
+    @endcomponent
+    <div class="container-fluid d-none" id="editOrderIssue">
+        <div class="card col-md-8 offset-md-2 ">
+            <div class="card-header">问题件修改</div>
+            <input type="hidden" name="order_id" v-model="orderIssues.order_id">
+            <input type="hidden" name="id" v-model="orderIssues.id">
+            <input type="hidden" name="rejected_bill_id" v-model="orderIssues.rejected_bill_id">
+            <input type="hidden" name="order_issue_type_id" v-model="orderIssues.order_issue_type_id">
+            <input type="hidden" name="second_order_id" v-model="orderIssues.second_order_id">
+
+            <div class="card-body">
+{{--WMS订单号--}}
+                <div class="form-group row">
+                    <label for="name" class="col-2 col-form-label text-right">WMS订单号</label>
+                    <div class="col-8">
+                        <input type="text" class="form-control" name="name" v-model="order.code" disabled>
+                    </div>
+                </div>
+{{--退回单号--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">退回单号</label>
+                    <div class="col-8">
+                        <input type="text" class="form-control" name="" v-model="rejectedBill.logistic_number_return"
+                               disabled>
+                    </div>
+                </div>
+
+{{--处理状态--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">处理状态</label>
+                    <div class="col-8">
+                        <select name="handle_status" class="form-control" disabled v-model="orderIssues.handle_status">
+                            <option v-for="value in handleStatus" :value="value">@{{ value }}</option>
+                        </select>
+                    </div>
+                </div>
+{{--问题类别--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">问题类别</label>
+                    <div class="col-8">
+                        <select name="order_issue_type_id" class="form-control" id="order_issue_type_id"
+                                v-model="orderIssues.order_issue_type_id">
+                            <option value></option>
+                            <option v-for="type in orderIssueType" :value="type.id">@{{ type.name }}</option>
+                        </select>
+                    </div>
+                </div>
+{{--二次订单号--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">二次订单号</label>
+                    <div class="col-8">
+                        <input type="text" name="second_order_id" class="form-control" v-model="secondOrder.code" @blur="getSecondOrder($event)">
+                    </div>
+                </div>
+{{--二次运单号--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">二次运单详情</label>
+                    <div class="col-8">
+                        <div class="alert alert-success" v-if="secondOrder.packages">
+                            订单详情已填充
+                        </div>
+                        <div class="alert alert-secondary" v-else>
+                            二次运单详情
+                        </div>
+                        <table class="table" v-if="secondOrder.packages">
+                            <tr>
+                                <th>条码</th><th>商品名</th><th>数量</th>
+                            </tr>
+                            <template v-for="package in secondOrder.packages">
+                                <tr v-for="commodity in package.commodities">
+                                    <td>@{{ commodity.commodity.sku }}</td>
+                                    <td>@{{ commodity.commodity.name }}</td>
+                                    <td>@{{ commodity.amount }}</td>
+                                </tr>
+                            </template>
+                        </table>
+                    </div>
+                </div>
+{{--最终状态--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">处理结果说明</label>
+                    <div class="col-8">
+                        <textarea name="result_explain" class="form-control" v-model="orderIssues.result_explain"></textarea>
+                    </div>
+                </div>
+{{--最终状态--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">最终状态</label>
+                    <div class="col-8">
+                        <select name="final_status" class="form-control" v-model="orderIssues.final_status" id="final_status">
+                            <option></option>
+                            <option v-for="value in final_status" :value="value">@{{ value }}</option>
+                        </select>
+                    </div>
+                </div>
+{{--承运商赔偿金额--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">承运商赔偿金额</label>
+                    <div class="col-8">
+                        <input type="number" name="logistic_indemnity_money" class="form-control" id="logistic_indemnity_money"
+                               v-model="orderIssues.logistic_indemnity_money">
+                    </div>
+                </div>
+{{--承运商快递减免--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">承运商快递减免</label>
+                    <div class="col-8">
+                        <select name="logistic_express_remission" class="form-control"
+                                v-model="orderIssues.logistic_express_remission">
+                            <option value></option>
+                            <option v-for="remission in logisticExpressRemission" :value="remission">@{{ remission }}
+                            </option>
+                        </select>
+                    </div>
+                </div>
+{{--宝时赔偿金额--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">宝时赔偿金额</label>
+                    <div class="col-8">
+                        <input type="number" name="baoshi_indemnity_money" class="form-control" id="baoshi_indemnity_money"
+                               v-model="orderIssues.baoshi_indemnity_money">
+                    </div>
+                </div>
+{{--宝时快递减免--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">宝时快递减免</label>
+                    <div class="col-8">
+                        <select name="baoshi_express_remission" class="form-control" id="baoshi_express_remission"
+                                v-model="orderIssues.baoshi_express_remission">
+                            <option value></option>
+                            <option v-for="remission in baoShiExpressRemission" :value="remission">@{{ remission }}
+                            </option>
+                        </select>
+                    </div>
+                </div>
+{{--事故责任方--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">事故责任方</label>
+                    <div class="col-8">
+                        <select name="user_workgroup_id" class="form-control" id="user_workgroup_id"
+                                v-model="orderIssues.user_workgroup_id">
+                            <option value></option>
+                            <option v-for="workgroup in userWorkgroup" :value="workgroup.id">@{{ workgroup.name }}</option>
+                        </select>
+                    </div>
+                </div>
+{{--提交--}}
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right"></label>
+                    <div class="col-8">
+                        <button type="submit" class="btn btn-success form-control" @click="orderIssueUpdate">提交修改
+                        </button>
+                    </div>
+                </div>
+            </div>
+{{--deleteOrderIssue--}}
+            <div class="modal fade" id="alertModal" tabindex="-1" role="dialog"  aria-labelledby="alertModalLabel" aria-hidden="true">
+                <div class="modal-dialog  modal-dialog-centered">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <h5 class="modal-title" id="exampleModalLabel">提示</h5>
+{{--                            <button type="button" class="close" data-dismiss="modal" aria-label="Close" >--}}
+{{--                                <span aria-hidden="true">&times;</span>--}}
+{{--                            </button>--}}
+                        </div>
+                        <div class="modal-body">
+                            <div class="alert alert-success">
+                                订单问题件已修改
+                            </div>
+                        </div>
+                        <div class="modal-footer">
+                            <button type="button" class="btn btn-primary" data-dismiss="modal" @click="backOrderIssueIndex">返回查询页面</button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script type="text/javascript">
+        let editVue = new Vue({
+            el: '#editOrderIssue',
+            data: {
+                orderIssues: {!! $orderIssue!!},
+                order: {!! $order !!},
+                secondOrder: @if($secondOrder){!! $secondOrder !!}@else ''@endif,
+                rejectedBill: @if($rejectedBill){!! $rejectedBill !!}@else ''@endif,
+                owners:{!! $owners  !!},
+                logistics:{!! $logistics !!},
+                userWorkgroup: {!! $userWorkgroup !!},
+                shops:{!! $shops !!},
+                orderIssueType:{!! $orderIssueType !!},
+                rejectingStatus: ['无', '未退回', '全部退回', '部分退回', '差异退回', '超量退回'],
+                final_status: ['已解决', '待退回', '退回中',],
+                logisticExpressRemission: ['原单减免', '部分减免', '全部减免'],
+                baoShiExpressRemission: ['原单减免', '部分减免', '全部减免'],
+                handleStatus: ['处理中', '已完结'],
+            },
+            mounted: function () {
+                $("#editOrderIssue").removeClass('d-none');
+                console.log(this.secondOrder);
+
+            },
+            watch:{
+                secondOrder:{
+                    handler:function(value){
+                        if(value.code === ''){
+                            this.secondOrder.packages = '';
+
+                        }
+                    },
+                    deep:true,
+                },
+            },
+            methods: {
+                orderIssueUpdate() {
+                    let data = this.orderIssues;
+                    let arr = {
+                        '问题类别':'order_issue_type_id',
+                        '处理状态':'handle_status',
+                        '处理结果说明':'result_explain',
+                        '承运商赔偿金额':'logistic_indemnity_money',
+                        '承运商快递减免':'logistic_express_remission',
+                        '宝时赔偿金额':'baoshi_indemnity_money',
+                        '宝时快递减免':'baoshi_express_remission',
+                    }
+                    axios.post('{{url("apiLocal/order/issue/update")}}', data).then(function (res) {
+                        if (res.data.success) {
+                            $('#alertModal').modal('show');
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.errors[0][0]);
+                            res.data.errors.forEach(function(item){
+                                let target = $('#'+arr[item[1]]);
+                                target.addClass('is-invalid').change(function(){
+                                    target.removeClass('is-invalid');
+                                });
+                            })
+                            $('#alertModal').modal('hide');
+                        }
+                    }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('网络异常:' + err);
+                        $('#alertModal').modal('hide');
+                    });
+                },
+                getSecondOrder(e){
+                    let _this = this;
+                    let orderNo = $(e.target).val();
+                    if(!orderNo){
+                        return ;
+                    }
+                    if(orderNo){
+                        let data = {WMSOrderNo:orderNo};
+                        axios.post("{{url('apiLocal/order/issue/getOrderInfoByWMSOrderNo')}}",data).then(function(res){
+                            if(res.data.success){
+                                _this.secondOrder = res.data.data;
+                                _this.orderIssues.second_order_id = res.data.data.id;
+                                console.log(_this.orderIssues);
+                            } else {
+                                tempTip.setDuration(4000);
+                                tempTip.show('查询订单信息出现异常:' + res.data.fail_info);
+                            }
+                        }).catch(function(err){
+                            tempTip.setDuration(4000);
+                            tempTip.show('网络异常:' + err);
+                        });
+                    }
+                },
+                backOrderIssueIndex(){
+                    window.location.href="javascript:history.go(-1)";
+                },
+            }
+        });
+        $('.is-invalid').change(function(){
+            $(this).removeClass('is-invalid');
+        })
+
+    </script>
+
+@endsection

+ 51 - 0
resources/views/order/issue/import.blade.php

@@ -0,0 +1,51 @@
+@extends('layouts.app')
+@section('title')问题件-导入@endsection
+@section('content')
+    <div id="nav2">
+        @component('order.issue.menu')@endcomponent
+    </div>
+    <div class="container-fluid" id="issue_import_div">
+        <div class="card col-md-8 offset-md-2">
+            <div class="card-body">
+                <form action="{{url('order/issue/batchImport')}}" method="post" enctype="multipart/form-data" class="form"  target="_blank">
+                    @csrf
+                    <div class="form-group row text-center">
+                        <div class="col-12 text-danger">
+                            注意:请保证表第一行有以下对应的字段名<br>(可不按顺序):<br>
+                            原始订单号,情况说明,问题类别<br>
+                            订单问题类别:('拦截', '快递异常', '信息更改', '联系不上', '其他', '错漏发', '仓库问题', '快递丢件', '破损', '撤销丢件', '二次加工', '全检问题', '系统问题', '延迟发货', '仓库丢件', )<br>
+                        </div>
+                        <div class="col-12 text-info ">
+                            导入时间随文件大小可能达数十分钟以上,请耐心等候
+                            <hr>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="sku" class="col-2 col-form-label text-right">选择EXCEL</label>
+                        <div class="col-8">
+                            <div class="form-control">
+                                <input type="file" class="form-control-file @error('file') is-invalid @enderror"
+                                       name="file" value="{{ old('file') }}" required>
+                                @error('file')
+                                <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                                @enderror
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-success form-control" value="执行导入">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+
+@endsection
+

+ 855 - 0
resources/views/order/issue/index.blade.php

@@ -0,0 +1,855 @@
+@extends('layouts.app')
+@section('title')问题件-查询@endsection
+
+@section('content')
+    @component("order.issue.menu")@endcomponent
+    <div class="container-fluid" id="issue_div">
+        <div style="min-width: 2000px;">
+            <div id="list" class="d-none" style="min-width: 5500px">
+                <div id="form_div" style="min-width: 2250px;" class=""></div>
+                <div class="form-inline mt-1">
+                    <span class="dropdown">
+                        <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                                data-toggle="dropdown" title="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">导出Excel
+                        </button>
+                        <div class="dropdown-menu">
+                            <a class="dropdown-item" @click="orderIssueExport(false)" href="javascript:">导出勾选内容</a>
+                            <a class="dropdown-item" @click="orderIssueExport(true)" href="javascript:">导出所有页</a>
+                        </div>
+                    </span>
+                    <span class="ml-1">
+                        <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" @click="endOrderIssue()" :class="[checkData.length>0?'btn-dark text-light':'']">完结</button>
+                    </span>
+                    <span class="ml-1">
+                        <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" @click="copyOrderNo()" >复制快递单号</button>
+                    </span>
+                </div>
+                <table class="table table-sm  table-bordered table-hover card-body "
+                       style="background: #fff;">
+                    <tr class="tr-yellow">
+                        <th class=" font-weight-bolder " colspan="6"></th>
+                        <th class="td-yellow text-center font-weight-bolder original-class table-head-warning " colspan="16" >原始运单号</th>
+{{--                        <th class=" text-center font-weight-bolder" colspan="3">原始商品明细</th><th class=" text-center font-weight-bolder" colspan="5">返回商品明细</th>--}}
+                        <th class=" text-center font-weight-bolder"  @cannot('客户不可见')colspan="23"@else colspan="24" @endcannot>情况说明</th>
+                        <th></th>
+                    </tr>
+
+                    <tr class="tr-yellow">
+                        <th  rowspan="2" class="align-middle">
+                            <label for="all">
+                                <input id="all" type="checkbox" @click="checkAll($event)"/>
+                            </label>
+                        </th>
+                        <th class="text-center align-middle" rowspan="2">序号</th>
+                        <th class="text-center align-middle" rowspan="2">ID</th>
+                        <th class="text-center align-middle" rowspan="2">退件</th>
+                        @can("订单管理-问题件-置顶")
+                            <th class="text-center align-middle" style="width: 60px"  rowspan="2">置顶</th>
+                        @endcan
+                        <th class="text-center align-middle" rowspan="2">处理状态</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">登记日期</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">订单日期</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">客户</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">店铺</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">原始订单号</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">原始承运商</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">原始运单号</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2" style="min-width: 90px">收货人名称</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">收货人电话</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2" style="min-width: 70px">省</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2" style="min-width: 70px">市</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2" style="min-width: 70px">区</th>
+                        <th class="text-center align-middle td-yellow" rowspan="2">收货人地址</th>
+                        <th class="text-center align-middle text-center td-yellow" colspan="3">原始商品明细</th>
+{{--                        <th class="">条码</th><th class="">商品名</th><th class="">数量</th>--}}
+                        <th class=" text-center align-middle" colspan="5">返回商品明细</th>
+{{--                        <th class="">条码</th><th class="">商品名</th><th class="">数量</th><th class="">是否正品</th><th class="">备注</th>--}}
+                        <th class=" text-center align-middle" rowspan="2">退单状态</th>
+                        <th class="bg-whit text-center align-middle" colspan="3">情况说明</th>
+                        <th class=" text-center align-middle" rowspan="2">问题类别</th>
+                        <th class=" text-center align-middle" rowspan="2">处理结果说明</th>
+                        <th class=" text-center align-middle" rowspan="2">二次订单号</th>
+                        <th class=" text-center align-middle" rowspan="2">二次承运商</th>
+                        <th class=" text-center align-middle" rowspan="2">二次运单号</th>
+                        <th class=" text-center" colspan="3" style="min-width: 300px">二次商品明细</th>
+                        <th class=" text-center align-middle" rowspan="2">最终转态</th>
+                        @cannot('客户不可见')
+                        <th class=" text-center align-middle" rowspan="2">承运商赔偿金额</th>
+                        @endcannot
+                        <th class=" text-center align-middle" rowspan="2">承运商快递减免</th>
+                        <th class=" text-center align-middle" rowspan="2">宝时赔偿金额</th>
+                        <th class=" text-center align-middle" rowspan="2">宝时快递减免</th>
+                        <th class=" text-center align-middle" rowspan="2">事故责任方</th>
+                        <th class="text-center align-middle" rowspan="2">操作</th>
+                    </tr>
+                    <tr class="tr-yellow">
+                        <th class="td-yellow">条码</th><th class="td-yellow">商品名</th><th class="td-yellow">数量</th>
+                        <th class="text-center" style="min-width: 75px">条码</th><th class="text-center" style="min-width: 100px">商品名</th><th class="text-center" style="min-width: 50px">数量</th><th class="text-center" style="min-width: 50px">是否正品</th><th class="text-center" style="min-width: 100px">备注</th>
+                        <th class="text-center">操作类型</th><th class="text-center">说明</th><th class="text-center">操作者</th>
+                        <th class="text-center">条码</th><th class="text-center">商品名</th><th class="text-center">数量</th>
+                    </tr>
+                    <tr class="tr-yellow"
+                        v-for="(orderIssue,index) in orderIssues"
+                        @click="selectedColor(orderIssue.id)"
+                        v-if="orderIssues"
+                        :class="orderIssue.remark ? 'tr_top':''"
+                        @click="selectedColor(waybill.id)"
+                        v-on:mouseover="hidetop($event)" v-on:mouseleave="showtop($event)"
+                        :style="[{'font-weight': orderIssue.id==selectedStyle?'bold':''}]">
+                        <td >
+                            <div class="m-0 p-0 " :style="[{'min-height':orderIssue.remark ?'72px':'45px'}]"><input class="checkItem" type="checkbox" :value="orderIssue.id" v-model="checkData"></div>
+                        </td>
+                        <td class="text-center">@{{index+1}}</td>
+                        <td class="text-center ">@{{ orderIssue.id }}</td>
+                        <td class=" text-center">
+                            @can('订单管理-问题件-编辑')
+                                <button type="button" class="btn btn-sm btn-outline-secondary" @click="disposeOrderIssue($event)" :data-value="orderIssue.id" v-if="orderIssue.is_new_rejecting == '有'">有</button>
+                                <span v-else>@{{ orderIssue.is_new_rejecting }}</span>
+                            @else
+                                <span v-if="orderIssue.is_new_rejecting">@{{ orderIssue.is_new_rejecting }}</span>
+                            @endcan
+                        </td>
+                         @can("订单管理-问题件-置顶")
+                        <td class=" text-muted text-center"  >
+                            <button type="button" class="btn btn-sm btn-outline-danger "
+                                    @click="cancelOnTop($event)" :data-value="orderIssue.top.id" style="opacity: 0.75" v-if="orderIssue.top">取消
+                            </button>
+                            <button type="button" class="btn btn-sm btn-outline-secondary"
+                                    @click="OrderIssueOnTop($event)" :data-value="orderIssue.id" style="opacity: 0.75"  v-else>置顶
+                            </button>
+                        </td>
+                        @endcan
+                        </td>
+                        <td class=" text-center">@{{ orderIssue.handle_status }}</td>
+                        <td class="toptd td-yellow text-center" >
+                            <div v-if="orderIssue.remark" class="bg-light-yellow  text-danger top text-left"  data-toggle="tooltip" style="opacity: 0.1;position: absolute;z-index: 1">置顶备注:@{{  orderIssue.remark }}</div>
+                            @{{ orderIssue.created_at }}</td>
+                        <td class="td-yellow text-center" >
+                            @{{ orderIssue.order.created_at }}</td>
+                        <td class="td-yellow text-center">
+                            <span v-if='orderIssue.order.owner'>@{{ orderIssue.order.owner.name }}</span>
+                        </td>
+                        <td class="td-yellow text-center"><template v-if="orderIssue.order.shop">@{{ orderIssue.order.shop.name }}</template> </td>
+                        <td class="td-yellow text-center">@{{ orderIssue.order.code }} </td>
+                        <td class="td-yellow text-center">
+                            <span v-if='orderIssue.order.logistic'>@{{ orderIssue.order.logistic.name }}</span>
+                        </td>
+
+                        <td class=" hide-content p-0 td-yellow text-center" :id="orderIssue.id+'logisticNumbers'" valign="middle" align="center">
+                            <div class="collapse hide" :id="'logisticNumbers'+orderIssue.id">
+                                <p v-for="logisticNumber in orderIssue.order.logisticNumbers" class="m-0 p-0 text-center text-muted ">@{{ logisticNumber }}</p>
+                            </div>
+                            <button v-if="orderIssue.order.logisticNumbers.length > 1" type="button"
+                                    class="btn btn-sm btn-outline-primary  text-center align-middle mt-1"
+                                    :id="'logisticNumbersBtn'+orderIssue.id"
+                                    data-toggle="collapse"
+                                    :data-target="'#logisticNumbers'+orderIssue.id"
+                                    aria-expanded="false"
+                                    :aria-controls="'logisticNumbers'+orderIssue.id"
+                                    @click="toggleLogisticNumbers(orderIssue.id,orderIssue.order.logisticNumbers.length)">
+                                分箱@{{ orderIssue.order.logisticNumbers.length }}件,点击展开
+                            </button>
+                        </td>
+                        <td class="td-yellow text-center">@{{ orderIssue.order.consignee_name }}</td>
+                        <td class="td-yellow text-center">@{{ orderIssue.order.consignee_phone }}</td>
+                        <td class="td-yellow text-center">@{{ orderIssue.order.province }}</td>
+                        <td class="td-yellow text-center">@{{ orderIssue.order.city }}</td>
+                        <td class="td-yellow text-center">@{{ orderIssue.order.district }}</td>
+                        <td class="td-yellow" style="width: 400px"><span class="text-wrap m-0 p-0 text-center" style="width: 400px">@{{ orderIssue.order.address }}</span></td>
+                        <td class="td-yellow p-0" :id="orderIssue.id+'items'"  valign="middle" align="center" colspan="3">
+                            <div v-if="orderIssue.order">
+                                <table v-if="orderIssue.order.packages" class="table table-sm  m-0"  :class="orderIssue.order.packages.length > 1?'collapse':''"  :id="'order'+orderIssue.id" >
+                                    <template v-for="packages in orderIssue.order.packages" >
+                                        <tr v-for="item in packages.commodities">
+                                            <td class="text-center">@{{ item.commodity.sku }}</td>
+                                            <td class="text-center">@{{ item.commodity.name }}</td>
+                                            <td class="text-center">@{{ item.amount }}</td>
+                                        </tr>
+                                    </template>
+                                </table>
+                            <button v-if="orderIssue.order.packages.length > 1" type="button"
+                                    class="btn btn-sm btn-outline-primary  text-center align-middle mt-1"
+                                    :id="'orderBtn'+orderIssue.id"
+                                    data-toggle="collapse"
+                                    :data-target="'#order'+orderIssue.id"
+                                    aria-expanded="false"
+                                    :aria-controls="'order'+orderIssue.id"
+                                    @click="toggleOrder(orderIssue.id,orderIssue.order.amount)" >商品@{{ orderIssue.order.amount }}件,点击展开
+                            </button>
+                            </div>
+                        </td>
+                        <td class="p-0" :id="orderIssue.id+'rejectedBill'"  valign="middle" align="center" colspan="5">
+                            <div v-if="orderIssue.rejected_bill" class="m-0 p-0">
+                                <table v-if="orderIssue.rejected_bill.items" class="table table-sm  m-0" :class="orderIssue.rejected_bill.items.length > 1?'collapse':''"  :id="'rejectedBill'+orderIssue.id">
+                                    <tr v-for="item in orderIssue.rejected_bill.items" :data-value="orderIssue.rejected_bill.sum += item.amount">
+                                        <td style="min-width: 75px" class="text-center">@{{ item.barcode_goods }}</td>
+                                        <td style="min-width: 100px" class="text-center">@{{ item.name_goods }}</td>
+                                        <td style="min-width: 50px" class="text-center">@{{ item.amount }}</td>
+                                        <td style="min-width: 50px" class="text-center">@{{ item.validity_at }}</td>
+                                        <td style="min-width: 100px" class="text-center">@{{ item.remark }}</td>
+                                    </tr>
+                                </table>
+                                <button v-if="orderIssue.rejected_bill.items > 1" type="button"
+                                        class="btn btn-sm btn-outline-primary  text-center align-middle mt-1"
+                                        :id="'rejectedBillBtn'+orderIssue.id"
+                                        data-toggle="collapse"
+                                        :data-target="'#rejectedBill'+orderIssue.id"
+                                        aria-expanded="false"
+                                        :aria-controls="'rejectedBill'+orderIssue.id"
+                                        @click="toggleRejectedBill(orderIssue.id,orderIssue.logs.length)">
+                                    商品@{{ orderIssue.logs.length }}件,点击展开</button>
+                            </div>
+                        </td>
+                        <td class=" text-center">@{{ orderIssue.rejecting_status }}</td>
+                        <td class=" m-0 p-0 log-td text-center" valign="middle" align="center" v-on:mouseover="showAddBtn($event)" v-on:mouseleave="hideAddBtn($event)"  colspan="3">
+
+                            <div class="addLogDiv row m-0 p-0" :id="'AddLog_'+orderIssue.id" style="display: none">
+                                <input type="hidden" name="id" :value="orderIssue.id" >
+                                <div class="form-group m-2">
+                                    <input type="text"  name="content" class="form-control" required>
+                                </div>
+                                <button type="btn" class="btn btn-primary m-2 " @click="addOrderIssueLog('AddLog_'+orderIssue.id)">添加</button>
+                            </div>
+
+                            <div  style="position: absolute;display: none;margin-top: -40px" class="add-btn">
+                                <button type="button" class="btn  btn-outline-primary " @click="showAddDiv('AddLog_'+orderIssue.id)">新</button>
+                            </div>
+
+                            <template v-if="orderIssue.logs" class="p-0 m-0 ">
+                                <table class="table table-sm p-0 m-0 " :id="'logs'+orderIssue.id" :class="orderIssue.logs.length > 1?'collapse':''">
+                                    <tr v-for="log in orderIssue.logs" v-on:mouseover="showDelBtn($event)" v-on:mouseleave="hideDelBtn($event)" class="del-tr" style="position:static">
+                                        <td>@{{ log.type }}</td>
+                                        <td><p class="text-wrap mb-0" style="max-width: 200px">@{{ log.content }}</p> </td>
+                                        <td>@{{ log.user.name }}</td>
+                                        <td style="position: relative;display: none;border: 0;" class="m-0 p-0 del-btn border-0" >
+                                            <button type="button"  class="btn btn-sm btn-outline-danger m-0 " @click="deleteOrderIssueLog(log.id,orderIssue.id)" style="position: absolute;left: -30px">删</button>
+                                        </td>
+                                    </tr>
+                                </table>
+                                <button v-if="orderIssue.logs.length > 1" type="button"
+                                        class="btn btn-sm btn-outline-primary  text-center align-middle mt-1"
+                                        :id="'logsBtn'+orderIssue.id"
+                                        data-toggle="collapse"
+                                        :data-target="'#logs'+orderIssue.id"
+                                        aria-expanded="false"
+                                        :aria-controls="'logs'+orderIssue.id"
+                                        @click="toggleLogs(orderIssue.id,orderIssue.logs.length)">
+                                    记录共@{{ orderIssue.logs.length }}条,点击展开
+                                </button>
+                            </template>
+                            </template>
+                        </td>
+                        <td class=" text-center">
+                            <span v-if="orderIssue.issue_type">@{{ orderIssue.issue_type.name}}</span>
+                        </td>
+                        <td class=" text-center p-0 m-0">
+                            @{{ orderIssue.result_explain}}
+                        </td>
+                        <td class=" text-center"><span v-if="orderIssue.second_order" class="p-0"> @{{ orderIssue.second_order.code }}</span></td>
+                        <td class=" text-center"><span v-if="orderIssue.second_order" class="p-0"> @{{ orderIssue.second_order.logistic.name }}</span></td>
+                        <td class=" p-0" valign="middle" align="center">
+                            <template v-if="orderIssue.second_order">
+                                <div class="collapse hide m-0" :id="'secondOrderNumbers'+orderIssue.id">
+                                    <p v-for="logisticNumber in orderIssue.second_order.logisticNumbers" class="m-0 p-0 text-center text-muted ">@{{ logisticNumber }}</p>
+                                </div>
+                                <button v-if="orderIssue.second_order.logisticNumbers.length > 1" type="button"
+                                        class="btn btn-sm btn-outline-primary  text-center align-middle mt-1"
+                                        :id="'secondOrderNumbersBtn'+orderIssue.id"
+                                        data-toggle="collapse"
+                                        :data-target="'#secondOrderNumbers'+orderIssue.id"
+                                        aria-expanded="false"
+                                        :aria-controls="'secondOrderNumbers'+orderIssue.id"
+                                        @click="toggleseCondOrderNumbers(orderIssue.id,orderIssue.second_order.logisticNumbers.length)">
+                                    分箱@{{ orderIssue.second_order.logisticNumbers.length }}件,点击展开
+                                </button>
+                            </template>
+{{--                            <p v-if="orderIssue.second_order">@{{ orderIssue.second_order.logisticNumbers}}</p>--}}
+                        </td>
+                        <td class=" p-0" colspan="3" valign="middle" align="center">
+                            <template  v-if="orderIssue.second_order" class="text-center p-0">
+                                <table  class="table table-sm  m-0 "
+                                        v-if="orderIssue.second_order"
+                                        :class="orderIssue.second_order.amount>1?'collapse':''"
+                                        :id="'secondOrder'+orderIssue.id">
+                                    <template v-for="packages in orderIssue.second_order.packages">
+                                        <tr v-for="item in packages.commodities">
+                                            <td class="text-center">@{{ item.commodity.sku }}</td>
+                                            <td class="text-center">@{{ item.commodity.name }}</td>
+                                            <td class="text-center">@{{ item.amount }}</td>
+                                        </tr>
+                                    </template>
+                                </table>
+                                <button class="btn btn-sm btn-outline-primary  text-center align-middle mt-1"
+                                        v-if="orderIssue.second_order.amount > 1" type="button"
+                                        :id="'secondOrderBtn'+orderIssue.id"
+                                        data-toggle="collapse"
+                                        :data-target="'#secondOrder'+orderIssue.id"
+                                        aria-expanded="false"
+                                        :aria-controls="'secondOrder'+orderIssue.id"
+                                        @click="toggleSecond(orderIssue.id,orderIssue.second_order.amount)">商品共@{{ orderIssue.second_order.amount }}件,点击展开
+                                </button>
+                            </template>
+                        </td>
+                        <td class=" text-center">@{{ orderIssue.final_status }}</td>
+                        <td class=" text-center">@{{ orderIssue.logistic_indemnity_money }}</td>
+                        <td class=" text-center">@{{ orderIssue.logistic_express_remission }}</td>
+                        @cannot('客户不可见')
+                        <td class=" text-center">@{{ orderIssue.baoshi_indemnity_money }}</td>
+                        @endcannot
+                        <td class=" text-center">@{{ orderIssue.baoshi_express_remission }}</td>
+                        <td class=" text-center"><span v-if="orderIssue.user_work_group">@{{ orderIssue.user_work_group.name }}</span></td>
+                        <td>
+                            <button type="button" class="btn btn-sm btn-outline-primary" @click="editOrderIssue($event)" :data-value="orderIssue.id">改</button>
+                            <button type="button" class="btn btn-sm btn-outline-danger" @click="deleteOrderIssue($event)" :data-value="orderIssue.id">删</button>
+                        </td>
+                    </tr>
+                </table>
+                <a :href="page.prevPageUrl" class="btn btn-sm" :class="page.curPage === 1 ?'':'btn-outline-primary'"  :disabled="page.curPage === 1">上一页</a>
+                <a :href="page.nextPageUrl" class="btn btn-sm" :class="page.curPage === page.lastPage ?'':'btn-outline-primary'"  :disabled="page.curPage === page.lastPage" >下一页</a>
+                <input @keyup.enter="pageTurning($event)" class="form-control-sm ml-3 tooltipTarget" :placeholder="'当前页数:'+page.curPage+'/'+page.lastPage" title="去往指定页">
+                <span class="text-muted m-1">共 @{{page.total}} 条 </span>
+            </div>
+        </div>
+{{--deleteOrderIssue--}}
+        <div class="modal fade" id="alertModal" tabindex="-1" role="dialog"  aria-labelledby="alertModalLabel" aria-hidden="true">
+            <div class="modal-dialog  modal-dialog-centered">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title" id="exampleModalLabel">提示</h5>
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" @click="changeDeleteId">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <p>是否删除当前订单问题件?</p>
+                        <input type="hidden" id = "deleteId"  class="form-control" />
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-secondary" data-dismiss="modal" @click="changeDeleteId">取消</button>
+                        <button type="button" class="btn btn-primary" data-dismiss="modal" @click="deleteOrderIssueById">确认</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+{{--OrderIssue On Top--}}
+        <div class="modal fade " id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title" id="exampleModalLabel">请输入置顶备注</h5>
+                        <button type="button" class="close"  data-dismiss="modal" aria-label="Close" @click="changeRemark">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <input type="hidden" class="form-control" id="onTopId">
+                        <textarea type="text" class="form-control"  required id="remark" @change="changeRemark"  ></textarea>
+                        <div class="invalid-feedback">
+                            备注信息不能为空
+                        </div>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal" @click="changeRemark" >关闭</button>
+                        <button type="button" class="btn btn-sm btn-primary" @click="submitOnTop">提交</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+@endsection
+@section('lastScript')
+    <style type="text/css">
+
+        @keyframes anima
+        {
+            from {
+                opacity:0.1;
+            }
+            to{
+                opacity:1;
+            }
+        }
+        @-webkit-keyframes anima
+        {
+            from {
+                opacity:0.75;
+            }
+            to{
+                opacity:0.1;
+            }
+        }
+        .tr_top{
+            min-height: 75px;
+        }
+        .bg-light-yellow{
+            background: #fffff8;
+        }
+        .top{
+            padding-top: 0px;
+            padding-left: 10px;
+            margin-top: -4px;
+            margin-left: -5px;
+            line-height: 75px;
+            position: absolute;
+            animation: anima;
+            animation-duration: 3s;
+            animation-timing-function: cubic-bezier(0,0,1,1);
+            animation-direction: alternate;
+            animation-play-state: running;
+
+            -webkit-animation-name: anima;
+            -webkit-animation-duration: 3s;
+            -webkit-animation-timing-function:  cubic-bezier(0,0,1,1);
+            -webkit-animation-iteration-count: infinite;
+            -webkit-animation-direction: alternate;
+            -webkit-animation-play-state: running;
+        }
+
+    </style>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
+    <script>
+        let listVue = new Vue({
+            el: '#issue_div ',
+            data: {
+                orderIssues: {!!  $orderIssues->toJson() !!}['data'],
+                owners: [
+                    @foreach($owners as $owner)
+                    {name: '{{ $owner->id }}', value: '{{ $owner->name}}'},
+                    @endforeach
+                ],
+                checkData: [],
+                from: '',
+                finalStatus: [{name: '0', value: '已解决'}, {name: '1', value: '待退回'}, {name: '2', value: '退回中'}],
+                selectedStyle: '',
+                deleteId:'',
+                page:{
+                    lastPage:{!! $orderIssues->toJson() !!}['last_page'],
+                    curPage:{!!  $orderIssues->toJson() !!}['current_page'],
+                    total:{!!  $orderIssues->toJson() !!}['total'],
+                    nextPageUrl:{!!  $orderIssues->toJson() !!}['next_page_url'],
+                    prevPageUrl:{!! $orderIssues->toJson()  !!}['prev_page_url'],
+                    lastPageUrl:{!!  $orderIssues->toJson() !!}['last_page_url'],
+                },
+            },
+            mounted: function () {
+
+                console.log(this.orderIssues);
+
+                $('.tooltipTarget').tooltip({'trigger': 'hover'});
+                $('#list').removeClass("d-none");
+                let _this = this;
+                let final_status = [{name:'0',value:'已解决'},{name:'1',value:'待退回'},{name:'2',value:'退回中'}];
+                let data = [[
+                    {name: 'created_at_start', type: 'dateTime', tip: '订单开始日期'},
+                    {name: 'owner_id',type: 'select_multiple_select',tip: ['输入关键词快速定位下拉列表,回车确定','选择要显示的客户'], placeholder:['货主','定位或多选货主'],data: _this.owners},
+                    {name: 'final_status', type: 'select', tip: '问题件的最终状态', placeholder: '最终状态', data: final_status},
+                    {name: 'handle_status', type: 'checkbox', tip: '是否已完结', data: [{name: '2', value: '已完结'}]},
+                ], [
+                        {name: 'created_at_end', type: 'dateTime', tip: '订单结束日期'},
+                        {name: 'logistic_indemnity_money', type: 'input', tip: '承运商赔偿金额', placeholder: '承运商赔偿金额'},
+                        @cannot('客户不可见')
+                        {name: 'baoshi_express_remission', type: 'input', tip: '宝时赔偿金额', placeholder: '宝时赔偿金额'},
+                        @endcannot
+                    ]];
+                this.form = new query({
+                    el: '#form_div',
+                    condition: data,
+                })
+                this.form.init();
+                let order =  $('.table-head-warning')[0];
+                $('.top').css('min-width', $(order).outerWidth(true));
+            },
+            watch:{
+                checkData:{
+                    handler(){
+                        if (this.checkData.length === this.orderIssues.length){
+                            document.querySelector('#all').checked = true;
+                        }else {
+                            document.querySelector('#all').checked = false;
+                        }
+                    },
+                    deep:true
+                },
+            },
+            methods: {
+                selectedColor(orderno) {
+                    if (orderno === this.selectedStyle) {
+                        this.selectedStyle = '';
+                        return;
+                    }
+                    this.selectedStyle = orderno;
+                },
+                editOrderIssue($event){
+                    let id = $($event.target).attr('data-value');
+                    window.location.href = "{{url('order/issue/edit')}}"+'/'+id;
+                },
+                deleteOrderIssue($event){
+                    let id = $($event.target).attr('data-value');
+                    $('#deleteId').val(id);
+                    $('#alertModal').modal('show');
+                },
+                deleteOrderIssueById(){
+                    let _this = this;
+                    tempTip.setDuration(99999)
+                    tempTip.waitingTip('删除中,请稍候')
+                    let id =  $('#deleteId').val();
+                    let data = {id:id};
+                    axios.post('{{url('apiLocal/order/issue/destroy')}}',data).then(function(res){
+                        tempTip.setDuration(5000)
+                        tempTip.cancelWaitingTip();
+                        if(res.data.success){
+                            for(let i = 0;i< _this.orderIssues.length;i++){
+                                let data = _this.orderIssues[i];
+                                if(data.id == id){
+                                    _this.orderIssues.splice(i,1);
+                                    _this.deleteId = 0;
+                                    break;
+                                }
+                            }
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('问题件删除成功');
+                        }else{
+                            tempTip.setDuration(2500);
+                            tempTip.show('标记勾选内容删除失败,错误:' + res.data.fail_info);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.cancelWaitingTip();
+                        tempTip.show('网络错误:' + err);
+                    });
+                },
+                changeDeleteId(){
+                    $('#deleteId').val('');
+                },
+                cancelOnTop(event){
+                    let id =$(event.target).attr('data-value')
+                    let data = {id:id};
+                    if(data === '' || data === null){
+                        return ;
+                    }
+                    axios.post('{{url('apiLocal/order/issue/onTop/cancelTop')}}',data).then(function(res){
+                        if(res.data.success){
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('订单问题件取消置顶成功!');
+                            window.location.reload();
+                        }else{
+                            tempTip.setDuration(2500);
+                            tempTip.show(res.data.fail_info);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.show('网络错误:' + err);
+                    });
+                },
+                changeRemark(){
+                    $('#remark').removeClass('is-invalid');
+                },
+                OrderIssueOnTop(event){
+                    let id = $(event.target).attr('data-value');
+                    $("#onTopId").val(id);
+                    $("#exampleModal").modal('show');
+                },
+                submitOnTop(){
+                    let _this = this;
+                    let remark =  $("#remark").val();
+                    let id = $("#onTopId").val();
+                    if(remark === '' || remark == null) {
+                        $("#remark").focus();
+                        $('#remark').addClass('is-invalid');
+                    }else{
+                        let data = {id:id,remark:remark};
+                        axios.post('{{url('apiLocal/order/issue/onTop/store')}}',data).then(function(res){
+                            $("#exampleModal").modal('hide');
+                            if(res.data.success){
+                                _this.orderIssues.forEach(function(orderIssue){
+                                    if(orderIssue.id == id){
+                                        if(orderIssue.top == null){
+                                            orderIssue.top = {};
+                                        }
+                                        orderIssue.top.remark = 'remark';
+                                    }
+                                })
+                                tempTip.setDuration(2500);
+                                tempTip.showSuccess('置顶成功');
+                                window.location.href=window.location.href;
+                            } else {
+                                tempTip.setDuration(2500);
+                                tempTip.show( res.data.fail_info);
+                            }
+                        }).catch(function(err){
+                            $("#exampleModal").modal('hide');
+                            tempTip.setDuration(4000);
+                            tempTip.show('网络错误:' + err);
+                        });
+
+                    }
+                },
+                pageTurning(event){
+                    let page = $(event.target).val();
+                    if (page>this.page.lastPage) {
+                        return;
+                    }
+                    window.location = this.form.goPage(page);
+                },
+                orderIssueExport(sign){
+// 导出
+                    let url = '{{url('order/issue/export')}}';
+                    let token='{{ csrf_token() }}';
+                    if(sign){
+                        // 所有页
+                        excelExport(true,this.checkData,url,this.page.total,token);
+                    }else{
+                        // 选中
+                        excelExport(false,this.checkData,url,null,token);
+                    }
+                },
+                copyOrderNo(){
+// 复制快递单号
+                    let _this =this;
+                    if(this.checkData.length === 0){
+                        tempTip.show('没有勾选订单');
+                    }else{
+                        let orderNos = [];
+                        this.orderIssues.forEach(function(item){
+                            if(_this.checkData.includes(item.id)){
+                               let logisticNumbers =  item.order.logisticNumbers;
+                               if(logisticNumbers.length>0){
+                                    orderNos.push(logisticNumbers);
+                               }
+                            }
+                        })
+                        let p =$('<input id="coty" value="'+orderNos.join(',')+'"/>');
+                        p.attr('opacity',0);
+                        $('body').append(p);
+                        let p_ele = document.getElementById('coty');
+                        p_ele.select();
+                        document.execCommand("Copy");
+                        p.remove();
+                    }
+                },
+                checkAll(e){
+                    if (e.target.checked){
+                        this.orderIssues.forEach((el,i)=>{
+                            if (this.checkData.indexOf(el.id) == '-1'){
+                                this.checkData.push(el.id);
+                            }
+                        });
+                    }else {
+                        this.checkData = [];
+                    }
+                },
+                endOrderIssue(){
+// 完结
+                    if(this.checkData.length === 0){
+                        tempTip.show('没有勾选订单');
+                        return ;
+                    }
+                    let _this = this;
+                    let data = {ids:this.checkData};
+                    axios.post('{{url('apiLocal/order/issue/endOrderIssue')}}',data).then(function(res){
+                        if(res.data.success){
+                            _this.orderIssues.forEach(function(item){
+                                if(_this.checkData.includes(item.id)){
+                                    item.handle_status = '已完结';
+                                }
+                            })
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('勾选订单已变为已完结');
+                        }else{
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.fail_info);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.show('网络异常:'+err);
+                    })
+                },
+                disposeOrderIssue(e){
+// 处理订单
+                    let _this = this;
+                    let id = $(e.target).attr('data-value');
+                    let data = {id:id};
+                    axios.post('{{url('apiLocal/order/issue/disposeOrderIssue')}}',data).then(function(res){
+                        if(res.data.success){
+                            _this.orderIssues.forEach(function (orderIssue) {
+                                if(orderIssue.id == data.id){
+                                    orderIssue.is_new_rejecting = '已处理';
+                                }
+                            })
+                            tempTip.setDuration(3000);
+                            tempTip.showSuccess('订单已处理');
+                        }else{
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.fail_info);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.show('网路链接异常'+err);
+                    });
+                },
+                addOrderIssueLog(id){
+// 添加日志
+                    let idInput = $('#'+id+' :input[name="id"]');
+                    let contentInput = $('#'+id+' :input[name="content"]');
+                    if(!contentInput.val()){
+                        contentInput.addClass('is-invalid').focus();
+                        return ;
+                    }
+                    contentInput.removeClass('is-invalid')
+                    let _this = this;
+                    let data= {id:idInput.val(),content:contentInput.val()};
+                    axios.post('{{url('apiLocal/order/issue/log/store')}}',data).then(function(res){
+                        if(res.data.success){
+                            _this.orderIssues.forEach( function(orderIssue){
+                                if(orderIssue.id == data.id){
+                                    orderIssue.logs.unshift(res.data.data);
+                                    contentInput.val('');
+                                    $('#'+id).hide();
+                                }
+                            })
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('添加成功');
+                        } else {
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.fail_info);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.show('网络异常:'+err);
+                    });
+                },
+                deleteOrderIssueLog(id,OrderIssueId){
+// 删除orderIssueLog
+                    let _this = this;
+                    axios.post("{{url('apiLoacl/order/issue/log/destroy')}}",{id:id}).then(function(res){
+                        if(res.data.success){
+                            _this.orderIssues.forEach(function (orderIssue) {
+                                if(orderIssue.id == OrderIssueId){
+                                    let logs = orderIssue.logs;
+                                    logs.forEach(function(item,index){
+                                        if(item.id == id){
+                                            logs.splice(index,1);
+                                        }
+                                   });
+                                }
+                            })
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('删除成功');
+                        }else{
+                            tempTip.setDuration(2000);
+                            tempTip.show('删除失败:'+res.data.fail_info);
+                        }
+                    }).catch(function(err){
+                        tempTip.setDuration(4000);
+                        tempTip.show('网络异常:'+err);
+                    });
+                },
+                hidetop:function(e) {
+                    let target = $(e.target);
+                    let top = target.parent().find('.top');
+                    let tip = target.parent().find('.toptd');
+                    top.hide();
+                    tip.tooltip('show');
+                },
+                showtop:function(e){
+                    let target = $(e.target);
+                    let top = target.parent().find('.top');
+                    let tip = target.parent().find('.toptd');
+                    top.show();
+                    tip.tooltip('hide');
+                },
+                showDelBtn(e){
+                    let domObj = $(e.target).parent();
+                    if(domObj.hasClass('del-tr')){
+                        domObj.find('.del-btn').show();
+                    }
+                },
+                hideDelBtn(e){
+                    let domObj = $(e.target);
+                    if(domObj.hasClass('del-tr')){
+                        domObj.find('.del-btn').hide();
+                    }
+                },
+                showAddBtn(e){
+                    let domObj = $(e.target).parents('.log-td');
+                    if(domObj.hasClass('log-td')){
+                        domObj.find('.add-btn').show();
+                    }
+                },
+                hideAddBtn(e){
+                    let domObj = $(e.target);
+                    if(domObj.hasClass('log-td')){
+                        domObj.find('.add-btn').hide();
+                    }
+                },
+                showAddDiv(id){
+                    let div = $('#'+id);
+                    if(div.is(":hidden")){
+                        div.show();
+                    }else{
+                        div.hide();
+                    }
+                },
+                toggleLogisticNumbers(id,length){
+                    let collapse = $('#logisticNumbers'+id);
+                    let button = $("#logisticNumbersBtn"+id);
+                    let isShow =  button.attr('aria-expanded');
+                    if(isShow==='false'){button.text('点击收起');}else{button.text("分箱"+length+"件,点击展开");}
+                },
+                toggleLogs(id,length){
+                    let button = $("#logsBtn"+id);
+                    let isShow =  button.attr('aria-expanded');
+                    if(isShow==='false'){button.text('点击收起');}else{button.text("记录共"+length+"条,点击展开");}
+                },
+                toggleOrder(id,length){
+                    let button = $("#orderBtn"+id);
+                    let isShow =  button.attr('aria-expanded');
+                    if(isShow==='false'){
+                        button.text('点击收起');
+                    }else{
+                        button.text("分箱"+length+"件,点击展开");
+                    }
+                },
+                toggleSecond(id,length){
+                        let button = $("#secondOrderBtn"+id);
+                    let isShow =  button.attr('aria-expanded');
+                    if(isShow==='false'){
+                        button.text('点击收起');
+                    }else{
+                        button.text("商品共"+length+"件,点击展开");
+                    }
+                },
+                toggleRejectedBill(id,length){
+                    let button = $("#rejectedBillBtn"+id);
+                    let isShow =  button.attr('aria-expanded');
+                    if(isShow ==='false'){
+                        button.text('点击收起');
+                    }else{
+                        button.text("商品"+length+"件,点击展开");
+                    }
+                },
+                toggleseCondOrderNumbers(id,length){
+                    let button = $("#secondOrderNumbersBtn"+id);
+                    let isShow =  button.attr('aria-expanded');
+                    if(isShow ==='false'){
+                        button.text('点击收起');
+                    }else{
+                        button.text("分箱"+length+"件,点击展开");
+                    }
+                },
+
+            }
+        })
+        // modal 隐藏时修改 input 为空
+        $("#exampleModal").on('hide.bs.modal',function(e){
+            $('#remark').val('');
+        });
+
+    </script>
+@endsection
+
+
+
+

+ 30 - 0
resources/views/order/issue/menu.blade.php

@@ -0,0 +1,30 @@
+<div id="nav2">
+    @component('order.menu')
+    @endcomponent
+    <div class="container-fluid nav3">
+        <div class="card menu-third">
+            <ul class="nav nav-pills">
+                @can('订单管理-问题件-查询')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('order/issue/index/')}}" :class="{active:isActive('index',3)}">查询</a>
+                    </li>
+                @endcan
+                @can('订单管理-订单问题件生成')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('order/issue/create')}}" :class="{active:isActive('create',3)}">录入</a>
+                    </li>
+                @endcan
+                @can('订单管理-订单问题件生成')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('order/issue/excelImport')}}" :class="{active:isActive('excelImport',3)}">导入</a>
+                    </li>
+                @endcan
+                @can('订单管理-问题件-编辑')
+                    <li class="nav-item" :class=" isActive('edit',3) ? '' : 'd-none' ">
+                        <a class="nav-link" href="{{url('order/issue/c')}}" :class="{active:isActive('edit',3)}">修改</a>
+                    </li>
+                @endcan
+            </ul>
+        </div>
+    </div>
+</div>

+ 25 - 0
resources/views/order/issue/performance.blade.php

@@ -0,0 +1,25 @@
+@extends('layouts.app')
+@section('title')问题件-工作量@endsection
+
+@section('content')
+    @component("order.issue.menu")@endcomponent
+    <div class="container-fluid" id="wave_div">
+        <div style="min-width: 2000px;">
+            <div id="form_div" style="min-width: 1950px;" class="bg-white"></div>
+            <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ">
+                <td>
+
+                </td>
+            </table>
+
+        </div>
+    </div>
+
+@endsection
+@section('lastScript')
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
+    <script>
+
+    </script>
+
+@endsection

+ 15 - 0
resources/views/order/issue/search.blade.php

@@ -0,0 +1,15 @@
+@extends('layouts.app')
+@section('title')问题件-查询@endsection
+
+@section('content')
+    @component("order.menu")@endcomponent
+    @component("order.issue.menu")@endcomponent
+
+@endsection
+@section('lastScript')
+
+@endsection
+
+
+
+

+ 22 - 0
resources/views/order/issue/workload.blade.php

@@ -0,0 +1,22 @@
+@extends('layouts.app')
+@section('title')问题件-工作量@endsection
+
+@section('content')
+    @component("order.issue.menu")@endcomponent
+    <div class="container-fluid" id="wave_div">
+        <div style="min-width: 2000px;">
+            <div id="form_div" style="min-width: 1950px;" class="bg-white"></div>
+            <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ">
+
+            </table>
+
+        </div>
+    </div>
+
+@endsection
+@section('lastScript')
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
+    <script>
+
+    </script>
+@endsection

+ 5 - 0
resources/views/order/menu.blade.php

@@ -10,6 +10,11 @@
                 <li class="nav-item">
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('order/wave/index/')}}" :class="{active:isActive('wave',2)}">波次</a>
                     <a class="nav-link" href="{{url('order/wave/index/')}}" :class="{active:isActive('wave',2)}">波次</a>
             </li> @endcan
             </li> @endcan
+            @can('订单管理-问题件-查询')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('order/issue/index/')}}" :class="{active:isActive('issue',2)}">问题件</a>
+                    </li>
+                @endcan
         </ul>
         </ul>
     </div>
     </div>
 </div>
 </div>

+ 12 - 1
resources/views/order/wave/search.blade.php

@@ -82,7 +82,7 @@
 @endsection
 @endsection
 
 
 @section("lastScript")
 @section("lastScript")
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200813.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200818a.js')}}"></script>
     <script>
     <script>
         let vueList = new Vue({
         let vueList = new Vue({
             el: "#wave_div",
             el: "#wave_div",
@@ -194,6 +194,10 @@
                     let search = '';
                     let search = '';
                     if(string === "all"){
                     if(string === "all"){
                     }else if(string === 'pitch'){
                     }else if(string === 'pitch'){
+                        if(this.getCheckedIds().length === 0){
+                            tempTip.show('没有勾选记录');
+                            return;
+                        }
                         if(this.checkData){
                         if(this.checkData){
                             let seachs =this.checkData.map(function (value) {
                             let seachs =this.checkData.map(function (value) {
                                 return "'"+value+"'";
                                 return "'"+value+"'";
@@ -260,6 +264,13 @@
                         values.push($(items[index]).val());
                         values.push($(items[index]).val());
                     }
                     }
                     return values;
                     return values;
+                },
+                selectedColor(waveNo){
+                    if(waveNo === this.selectedWaveNo){
+                        this.selectedWaveNo = '';
+                        return;
+                    }
+                    this.selectedWaveNo = waveNo;
                 }
                 }
             }
             }
         });
         });

+ 61 - 36
resources/views/personnel/laborReport/index.blade.php

@@ -18,36 +18,15 @@
                     <a class="dropdown-item" @click="laborReportExport(true)" href="javascript:">导出所有页</a>
                     <a class="dropdown-item" @click="laborReportExport(true)" href="javascript:">导出所有页</a>
                 </div>
                 </div>
             </span>
             </span>
-        <table class="table table-sm table-hover table-striped d-none d-xl-block p-0 text-nowrap table-bordered" >
-            <tr>
-                <th class="text-center">
-                    <label for="all">
-                        <input id="all" type="checkbox" @click="checkAll($event)">全选
-                    </label>
-                </th>
-                <th class="text-center">序号</th>
-                {{--                            <th>ID</th>--}}
-                <th class="text-center">操作</th>
-                <th class="text-center"  style="background-color: rgb(241, 234, 190)">进厂编号</th>
-                <th class="text-center" style="background-color: rgb(241, 234, 190)">小组</th>
-                <th class="text-center" style="background-color: rgb(241, 234, 190)">临时工</th>
-                <th class="text-center" style="background-color: rgb(241, 234, 190)">电话</th>
-                <th class="text-center" style="background-color: rgb(241, 234, 190)">身份证号</th>
-                <th class="text-center" style="background-color: rgb(241, 234, 190)">劳务所</th>
-                <th class="text-center">进场时间</th>
-                <th class="text-center">进组时间</th>
-                <th class="text-center">退组时间</th>
-                <th class="text-center">退场时间</th>
-                <th class="text-center">审核时间</th>
-                <th class="text-center">审核人</th>
-                <th class="text-center">晚饭打卡(分)</th>
-                <th class="text-center">在线时长</th>
-                <th class="text-center">本次工作时长</th>
-                <th class="text-center">备注</th>
-            </tr>
+        <label for="all" class="d-none" id="cloneCheckAll">
+            <input id="all" type="checkbox" @click="checkAll($event)">全选
+        </label>
+        <table class="table table-sm table-bordered d-none text-nowrap " id="headerRoll"></table>
+        <table class="table table-sm table-hover table-striped d-none d-xl-block p-0 text-nowrap table-bordered" id="headerParent">
+            <tr class="text-center" id="header"></tr>
             <tr v-for="(laborReport,i) in laborReports"  @click="selectedColor(laborReport.id)" :style="{'font-weight': laborReport.id==selectedStyle?'bold':''}">
             <tr v-for="(laborReport,i) in laborReports"  @click="selectedColor(laborReport.id)" :style="{'font-weight': laborReport.id==selectedStyle?'bold':''}">
                 <td>
                 <td>
-                    <input class="checkItem" type="checkbox" :value="laborReport.id" v-model="checkData">
+                    <input class="checkItem" type="checkbox" :value="laborReport.id" v-model="checkData" />
                 </td>
                 </td>
                 <td>@{{ i+1  }}</td>
                 <td>@{{ i+1  }}</td>
                 <td >
                 <td >
@@ -97,7 +76,7 @@
                 <td><span v-if="laborReport.remark">@{{laborReport.remark}}</span></td>
                 <td><span v-if="laborReport.remark">@{{laborReport.remark}}</span></td>
             </tr>
             </tr>
         </table>
         </table>
-        <table class="table table-striped table-bordered table-hover p-0 d-table  d-xl-none" style="background: rgb(255, 255, 255);">
+        <table id="listOnPad" class="table table-striped table-bordered table-hover p-0 d-table  d-xl-none" style="background: rgb(255, 255, 255);">
             <tr v-for="laborReport in laborReports">
             <tr v-for="laborReport in laborReports">
                 <td style="filter:grayscale(30%);">
                 <td style="filter:grayscale(30%);">
                     <div  class="pl-3 mt-1">
                     <div  class="pl-3 mt-1">
@@ -139,7 +118,7 @@
                             <span class="mr-3  text-nowrap"><span class="text-black">小组:</span><span class="text-black-50">@{{laborReport.userWorkGroupName  }}</span></span>
                             <span class="mr-3  text-nowrap"><span class="text-black">小组:</span><span class="text-black-50">@{{laborReport.userWorkGroupName  }}</span></span>
                             <span class="mr-3   text-nowrap"><span class="text-black">临时工:</span><span class="text-black-50">@{{ laborReport.name }} </span></span>
                             <span class="mr-3   text-nowrap"><span class="text-black">临时工:</span><span class="text-black-50">@{{ laborReport.name }} </span></span>
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">电话:</span><span style="color:#af7651" v-if="">@{{ laborReport.mobile_phone }} </span></span>--}}
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">电话:</span><span style="color:#af7651" v-if="">@{{ laborReport.mobile_phone }} </span></span>--}}
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">身份证号:</span><span style="color:#af7651" v-if="">@{{ laborReport.identity_number }} </span></span>--}}
+                                                                <span class="text-nowrap"><span class="text-black">身份证号:</span><span style="color:#af7651" v-if="">@{{ laborReport.identity_number }} </span></span>
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">劳务所:</span><span style="color:#af7651" v-if="">@{{ laborReport.labor_company }} </span></span>--}}
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">劳务所:</span><span style="color:#af7651" v-if="">@{{ laborReport.labor_company }} </span></span>--}}
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">进组时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.checkInAt }} </span></span>--}}
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">进组时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.checkInAt }} </span></span>--}}
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">审核时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyAt }} </span></span>--}}
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">审核时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyAt }} </span></span>--}}
@@ -231,8 +210,9 @@
 @endsection
 @endsection
 
 
 @section('lastScript')
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/export200813.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200813.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200818a.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/header200819.js')}}"></script>
     <script>
     <script>
         let today=(new Date());
         let today=(new Date());
         function isTomorrow(){
         function isTomorrow(){
@@ -250,10 +230,19 @@
         setInterval(reloadOnTomorrow,1000*60*60)
         setInterval(reloadOnTomorrow,1000*60*60)
     </script>
     </script>
     <script>
     <script>
+        window.onresize=function (){
+            let $listOnPad = $('#listOnPad');
+            let $headerRoll = $('#headerRoll');
+            if($listOnPad.css('display')!=='none'){
+                $headerRoll.attr('hidden',true)
+            }else{
+                $headerRoll.attr('hidden',false)
+            }
+        }
         @if(isset($request))
         @if(isset($request))
         let request={!! json_encode($request) !!};
         let request={!! json_encode($request) !!};
         @endif
         @endif
-        new Vue({
+        let vue = new Vue({
             el:"#list",
             el:"#list",
             data:{
             data:{
                 laborReports:[
                 laborReports:[
@@ -289,9 +278,9 @@
                 sum:{!! $laborReports->total() !!},
                 sum:{!! $laborReports->total() !!},
             },
             },
             mounted:function(){
             mounted:function(){
-                initEcho();
+                /*initEcho();*/
                 let _this=this;
                 let _this=this;
-                let laborReports=_this.laborReports;
+/*                let laborReports=_this.laborReports;
                 //进场
                 //进场
                 let tokenOfBroadcastEnterAndLeave='{{$tokenOfBroadcastEnterAndLeave}}';
                 let tokenOfBroadcastEnterAndLeave='{{$tokenOfBroadcastEnterAndLeave}}';
                 //console.log(tokenOfBroadcastEnterAndLeave)
                 //console.log(tokenOfBroadcastEnterAndLeave)
@@ -369,7 +358,7 @@
                             return true;
                             return true;
                         });
                         });
                     });
                     });
-                });
+                });*/
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
                 $('#list').removeClass('d-none');
                 $('#list').removeClass('d-none');
                 let data=[
                 let data=[
@@ -390,14 +379,50 @@
                     condition:data,
                     condition:data,
                 });
                 });
                 this.form.init();
                 this.form.init();
+                let column = [
+                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
+                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
+                    {name:'index',value: '序号', neglect: true},
+                    {name:'operation',value: '操作', neglect: true},
+                    {name:'enter_number',value: '进厂编号', style:'background-color: rgb(241, 234, 190)'},
+                    {name:'userWorkGroupName',value: '小组', style:'background-color: rgb(241, 234, 190)'},
+                    {name:'name',value: '临时工', style:'background-color: rgb(241, 234, 190)'},
+                    {name:'mobile_phone',value: '电话', style:'background-color: rgb(241, 234, 190)'},
+                    {name:'identity_number',value: '身份证号', style:'background-color: rgb(241, 234, 190)'},
+                    {name:'labor_company',value: '劳务所', style:'background-color: rgb(241, 234, 190)'},
+                    {name:'enter_at',value: '进场时间'},
+                    {name:'checkInAt',value: '进组时间'},
+                    {name:'checkOutAt',value: '退组时间'},
+                    {name:'exit_at',value: '退场时间'},
+                    {name:'verifyAt',value: '审核时间'},
+                    {name:'verifyPerson',value: '审核人'},
+                    {name:'relax_time',value: '晚饭打卡(分)', neglect: true},
+                    {name:'thisRecordOnlineTime',value: '在线时长', neglect: true},
+                    {name:'thisRecordWorkingTime',value: '本次工作时长', neglect: true},
+                    {name:'remark',value: '备注'},
+                ];
+                setTimeout(function () {
+                    let header = new Header({
+                        el: "#header",
+                        column: column,
+                        data: _this.laborReports,
+                        restorationColumn: 'id',
+                        fixedTop:($('#form_div').height())+2,
+                        offset:0.5,
+                        vue:vue
+                    });
+                    header.init();
+                },0);
             },
             },
             watch:{
             watch:{
                 checkData:{
                 checkData:{
                     handler(){
                     handler(){
                         if (this.checkData.length === this.laborReports.length){
                         if (this.checkData.length === this.laborReports.length){
                             document.querySelector('#all').checked = true;
                             document.querySelector('#all').checked = true;
+                            document.querySelector('#all_temp').checked = true;
                         }else {
                         }else {
                             document.querySelector('#all').checked = false;
                             document.querySelector('#all').checked = false;
+                            document.querySelector('#all_temp').checked = false;
                         }
                         }
                     },
                     },
                     deep:true
                     deep:true

Некоторые файлы не были показаны из-за большого количества измененных файлов