Parcourir la source

Merge branch 'master' of ssh://47.103.131.176:10022/var/git/bswas

zhouzhendong il y a 4 ans
Parent
commit
77db13a0c4
39 fichiers modifiés avec 1578 ajouts et 633 suppressions
  1. 2 8
      app/Console/Commands/EndReceivingTask.php
  2. 2 2
      app/Filters/OrderIssueFilters.php
  3. 114 47
      app/Filters/WorkOrderFilters.php
  4. 23 11
      app/Http/Controllers/DeliveryAppointmentController.php
  5. 17 14
      app/Http/Controllers/OrderIssueController.php
  6. 5 0
      app/Http/Controllers/ReceiveRecordController.php
  7. 10 2
      app/Http/Controllers/RejectedController.php
  8. 18 0
      app/Http/Controllers/WorkOrderCommoditiesController.php
  9. 144 1
      app/Http/Controllers/WorkOrderController.php
  10. 5 132
      app/OrderIssue.php
  11. 17 6
      app/Services/OrderRejectedBillRelationService.php
  12. 5 2
      app/Services/OrderRejectingStatusService.php
  13. 1 1
      app/Services/ReceivingTaskService.php
  14. 105 0
      app/Services/WorkOrderCommoditiesService.php
  15. 5 0
      app/Services/WorkOrderExpressAbnormalService.php
  16. 37 9
      app/Services/WorkOrderInformationChangeService.php
  17. 41 27
      app/Services/WorkOrderInterceptService.php
  18. 1 1
      app/Services/WorkOrderMistakeService.php
  19. 17 0
      app/Services/WorkOrderService.php
  20. 2 1
      app/UserWorkgroup.php
  21. 38 8
      app/WorkOrder.php
  22. 15 4
      app/WorkOrderDetail.php
  23. 41 0
      database/migrations/2022_01_19_172151_work_order_details_add_indemnity_money.php
  24. 32 0
      database/migrations/2022_01_21_111254_work_orders_add_work_order_detail_id.php
  25. 32 0
      database/migrations/2022_01_21_132626_create_work_order_user_workgroup_table.php
  26. 32 0
      database/migrations/2022_02_10_113047_user_workgroup_soft_delete.php
  27. 0 0
      resources/js/element/index.js
  28. 221 179
      resources/js/queryForm/header.js
  29. 0 0
      resources/sass/element/index.css
  30. 1 1
      resources/views/order/issue/index.blade.php
  31. 50 45
      resources/views/order/workOrder/_issue_logs.blade.php
  32. 32 26
      resources/views/order/workOrder/_process_logs.blade.php
  33. 40 0
      resources/views/order/workOrder/_rejected_item_equals_order_commodity.blade.php
  34. 455 101
      resources/views/order/workOrder/index.blade.php
  35. 2 2
      resources/views/store/receivingTasks/create.blade.php
  36. 4 3
      resources/views/store/receivingTasks/index.blade.php
  37. 7 0
      routes/apiLocal.php
  38. 1 0
      routes/web.php
  39. 4 0
      webpack.mix.js

+ 2 - 8
app/Console/Commands/EndReceivingTask.php

@@ -13,7 +13,7 @@ class EndReceivingTask extends Command
      *
      * @var string
      */
-    protected $signature = 'receivingTask:batch end';
+    protected $signature = 'receivingTask:batchEnd';
 
     /**
      * The console command description.
@@ -32,16 +32,10 @@ class EndReceivingTask extends Command
         parent::__construct();
     }
 
-    /**
-     * Execute the console command.
-     *
-     * @return int
-     */
-    public function handle(): int
+    public function handle()
     {
         /** @var ReceivingTaskService $service */
         $service = app(ReceivingTaskService::class);
         $service->overtimeToCompleteTask();
-        return 1;
     }
 }

+ 2 - 2
app/Filters/OrderIssueFilters.php

@@ -275,7 +275,7 @@ class OrderIssueFilters
 
     public function is_new_rejecting($is_new_rejecting)
     {
-        $this->queryBuilder->where('order_issues.is_new_rejecting', $is_new_rejecting);
+        $this->getOrderDetailQuery()->where('order_details.is_new_rejecting',$is_new_rejecting);
     }
 
     public function logistic($logistic_id)
@@ -381,7 +381,7 @@ class OrderIssueFilters
 
     public function rejectingStatus($rejectingStatus)
     {
-        $this->queryBuilder->where('order_issues.rejecting_status', $rejectingStatus);
+        $this->getOrderDetailQuery()->where('order_details.rejecting_status',$rejectingStatus);
     }
 
     public function order_issue_ids($order_issue_ids)

+ 114 - 47
app/Filters/WorkOrderFilters.php

@@ -4,6 +4,7 @@
 namespace App\Filters;
 
 use App\Order;
+use App\OrderDetail;
 use App\OrderIssue;
 use App\OrderIssueProcessLog;
 use App\OrderIssueType;
@@ -17,6 +18,7 @@ use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 
 class WorkOrderFilters
@@ -50,6 +52,14 @@ class WorkOrderFilters
         'tags',
         'shop_name',
         'work_order_process_log',
+        'rejectingStatus',
+        'logistic_indemnity_money',
+        'logistic_express_remission',
+        'bao_shi_indemnity_money',
+        'bao_shi_express_remission',
+        'user_owner_group_id',
+        'user_work_group_id',
+        'rejecting_status',
     ];
     protected $array_filter;
     protected $params = [];
@@ -62,6 +72,7 @@ class WorkOrderFilters
     protected $orderIssueQuery;
     protected $shopQuery;
     protected $workOrderProcessLogQuery;
+    protected $orderDetailQuery;
 
     public function __construct(Request $request)
     {
@@ -118,23 +129,23 @@ class WorkOrderFilters
     {
         $status = [];
 
-        if (Gate::allows('订单管理-工单处理-宝时编辑')){
-            array_push($status,1,4);
+        if (Gate::allows('订单管理-工单处理-宝时编辑')) {
+            array_push($status, 1, 4);
         }
-        if (Gate::allows('订单管理-工单处理-货主编辑')){
-            array_push($status,1,2,3,4,6);
+        if (Gate::allows('订单管理-工单处理-货主编辑')) {
+            array_push($status, 1, 2, 3, 4, 6);
         }
-        if (Gate::allows('订单管理-工单处理-承运商编辑')){
-            array_push($status,1,2,3,4,6);
+        if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            array_push($status, 1, 2, 3, 4, 6);
         }
 
         if (!isset($this->params['is_end'])) {
             $this->queryBuilder->where('status', '!=', 5);      // 过滤已完成
         } else {
-            array_push($status,5);
+            array_push($status, 5);
         }
 
-        $this->queryBuilder->whereIn('status',$status);
+        $this->queryBuilder->whereIn('status', $status);
     }
 
     private function afterFilterOwner($owner_ids)
@@ -154,23 +165,27 @@ class WorkOrderFilters
     public function afterFileIssueType()
     {
         if (Gate::allows('订单管理-工单处理-客服编辑') || Gate::allows('订单管理-工单处理-货主编辑')) {
-            $this->getOrderIssueTypeQuery()->whereIn('name', ['拦截','取消拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件']);
+            $this->getOrderIssueTypeQuery()->whereIn('name', ['拦截', '取消拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件']);
         } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
-            $this->getOrderIssueTypeQuery()->whereIn('name', ['拦截','取消拦截', '信息更改', '破损', '快递丢件', '快递异常']);
+            $this->getOrderIssueTypeQuery()->whereIn('name', ['拦截', '取消拦截', '信息更改', '破损', '快递丢件', '快递异常']);
         }
     }
 
     public function beforeApply()
     {
 
-        if ($this->shopQuery){
-            $this->getOrderQuery()->whereIn('orders.shop_id',$this->shopQuery);
+        if ($this->shopQuery) {
+            $this->getOrderQuery()->whereIn('orders.shop_id', $this->shopQuery);
         }
 
         if ($this->orderPackageQuery) {
             $this->queryBuilder->whereIn('order_id', $this->orderPackageQuery);
         }
 
+        if($this->orderDetailQuery){
+            $this->queryBuilder->whereIn('order_id',$this->orderDetailQuery);
+        }
+
         if ($this->orderQuery) {
             $this->queryBuilder->whereIn('order_id', $this->orderQuery);
         }
@@ -179,11 +194,11 @@ class WorkOrderFilters
             $this->queryBuilder->whereIn('order_issue_type_id', $this->issueTypeQuery);
         }
 
-        if ($this->orderIssueQuery){
+        if ($this->orderIssueQuery) {
             $this->queryBuilder->whereIn('work_orders.order_id', $this->orderIssueQuery);
         }
 
-        if($this->workOrderProcessLogQuery){
+        if ($this->workOrderProcessLogQuery) {
             $this->queryBuilder->whereIn('work_orders.id', $this->workOrderProcessLogQuery);
         }
 
@@ -193,11 +208,11 @@ class WorkOrderFilters
     public function orderByTag()
     {
         $this->queryBuilder->orderByDesc('work_order_status');
-        if (Gate::allows('订单管理-工单处理-客服编辑')){
+        if (Gate::allows('订单管理-工单处理-客服编辑')) {
             $this->queryBuilder->orderByDesc("bao_shi_tag");
-        } else if (Gate::allows('订单管理-工单处理-货主编辑')){
+        } else if (Gate::allows('订单管理-工单处理-货主编辑')) {
             $this->queryBuilder->orderByDesc("owner_tag");
-        } else if (Gate::allows('订单管理-工单处理-承运商编辑')){
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
             $this->queryBuilder->orderByDesc("logistic_tag");
         }
         $this->queryBuilder->orderBy('created_at');
@@ -227,7 +242,6 @@ class WorkOrderFilters
         return $this->issueTypeQuery;
     }
 
-
     public function getOrderIssueQuery(): Builder
     {
         if (!$this->orderIssueQuery) {
@@ -254,11 +268,18 @@ class WorkOrderFilters
 
     public function getWorkOrderProcessLogQuery(): Builder
     {
-        if (!$this->workOrderProcessLogQuery){
+        if (!$this->workOrderProcessLogQuery) {
             $this->workOrderProcessLogQuery = WorkOrderProcessLog::query()->select('work_order_id');
         }
         return $this->workOrderProcessLogQuery;
     }
+    public function getOrderDetailQuery(): Builder
+    {
+        if (!$this->orderDetailQuery){
+            $this->orderDetailQuery = OrderDetail::query()->select('order_id');
+        }
+        return $this->orderDetailQuery;
+    }
 
     public function id($id)
     {
@@ -357,70 +378,116 @@ class WorkOrderFilters
 
     public function process_progress($process_progress)
     {
-        $this->searchWay($this->queryBuilder,$process_progress,'work_orders.process_progress');
+        $this->searchWay($this->queryBuilder, $process_progress, 'work_orders.process_progress');
     }
 
-    public function order_issue_log($log_content){
+    public function order_issue_log($log_content)
+    {
         $order_issue_process_log_query = OrderIssueProcessLog::query()->select('order_issue_id')->where('content', 'like', $log_content);
-        $order_issue_query = OrderIssue::query()->select('order_id')->whereIn('id',$order_issue_process_log_query);
-        $this->queryBuilder->whereIn('order_id',$order_issue_query);
+        $order_issue_query = OrderIssue::query()->select('order_id')->whereIn('id', $order_issue_process_log_query);
+        $this->queryBuilder->whereIn('order_id', $order_issue_query);
     }
 
     public function log_content($log_content)
     {
         $order_issue_process_log_query = OrderIssueProcessLog::query()->selectRaw('order_issue_id')->where('content', 'like', $log_content);
-        if (!array_key_exists('addtime',$this->params) ) {
+        if (!array_key_exists('addtime', $this->params)) {
             $order_issue_process_log_query->where('created_at', '>=', Carbon::now()->subDays(31));
         } else {
             $order_issue_process_log_query->where('created_at', '>=', Carbon::now()->subDays($this->params['addtime']));
         }
-        $this->getOrderIssueQuery()->whereIn('id',$order_issue_process_log_query);
+        $this->getOrderIssueQuery()->whereIn('id', $order_issue_process_log_query);
     }
 
-    public function status($status){
+    public function status($status)
+    {
         $status_list = [];
-        if ($status == '承运商处理'){
-            array_push($status_list,3);
+        if ($status == '承运商处理') {
+            array_push($status_list, 3);
         } elseif ($status == '宝时处理') {
-            array_push($status_list,4,1);
-        } elseif ($status == '货主处理'){
-            array_push($status_list,2,6);
+            array_push($status_list, 4, 1);
+        } elseif ($status == '货主处理') {
+            array_push($status_list, 2, 6);
         }
-        $this->queryBuilder->whereIn('status',$status_list);
+        $this->queryBuilder->whereIn('status', $status_list);
     }
 
-    public function tags($tag){
+    public function tags($tag)
+    {
         $status = $this->array_filter['status'] ?? null;
-        if ($status){
-            switch ($status){
+        if ($status) {
+            switch ($status) {
                 case '宝时处理':
-                    $this->queryBuilder->where('bao_shi_tag',$tag);
+                    $this->queryBuilder->where('bao_shi_tag', $tag);
                     break;
                 case '货主处理':
-                    $this->queryBuilder->where('owner_tag',$tag);
+                    $this->queryBuilder->where('owner_tag', $tag);
                     break;
                 case '承运商处理':
-                    $this->queryBuilder->where('logistic_tag',$tag);
+                    $this->queryBuilder->where('logistic_tag', $tag);
                     break;
             }
-            return ;
+            return;
         }
-        if (Gate::allows('订单管理-工单处理-宝时编辑')){
-            $this->queryBuilder->where('bao_shi_tag',$tag);
-        } else if (Gate::allows('订单管理-工单处理-货主编辑')){
-            $this->queryBuilder->where('owner_tag',$tag);
-        } else if (Gate::allows('订单管理-工单处理-承运商编辑')){
-            $this->queryBuilder->where('logistic_tag',$tag);
+        if (Gate::allows('订单管理-工单处理-宝时编辑')) {
+            $this->queryBuilder->where('bao_shi_tag', $tag);
+        } else if (Gate::allows('订单管理-工单处理-货主编辑')) {
+            $this->queryBuilder->where('owner_tag', $tag);
+        } else if (Gate::allows('订单管理-工单处理-承运商编辑')) {
+            $this->queryBuilder->where('logistic_tag', $tag);
         }
     }
 
     public function shop_name($shop_name)
     {
-        $this->searchWay($this->getShopQuery(),$shop_name,'shops.name');
+        $this->searchWay($this->getShopQuery(), $shop_name, 'shops.name');
     }
 
     public function work_order_process_log($work_order_process_log)
     {
-        $this->searchWay($this->getWorkOrderProcessLogQuery(),$work_order_process_log,'work_order_process_logs.content');
+        $this->searchWay($this->getWorkOrderProcessLogQuery(), $work_order_process_log, 'work_order_process_logs.content');
+    }
+
+    public function logistic_indemnity_money($logistic_indemnity_money)
+    {
+        $this->queryBuilder->where('logistic_indemnity_money',$logistic_indemnity_money);
+    }
+
+    public function logistic_express_remission($logistic_express_remission)
+    {
+        $this->queryBuilder->where('logistic_express_remission',$logistic_express_remission);
+    }
+
+    public function bao_shi_indemnity_money($bao_shi_indemnity_money)
+    {
+        $this->queryBuilder->where('bao_shi_indemnity_money',$bao_shi_indemnity_money);
+    }
+
+    public function bao_shi_express_remission($logistic_indemnity_money)
+    {
+        $this->queryBuilder->where('bao_shi_express_remission',$logistic_indemnity_money);
+    }
+
+    public function user_owner_group_id($user_owner_group_id)
+    {
+        $this->queryBuilder->where('user_owner_group_id',$user_owner_group_id);
+    }
+
+    public function user_work_group_id($user_work_group_id)
+    {
+        $this->queryBuilder->whereHas('userWorkGroups',function($query)use($user_work_group_id){
+            $this->searchWay($query,$user_work_group_id,'user_workgroup_id');
+        });
+    }
+
+    public function rejecting_status($rejecting_status)
+    {
+        $query = OrderDetail::query()->select('order_id')->where('rejecting_status',$rejecting_status);
+        $this->queryBuilder->whereIn('order_id',$query);
+    }
+
+    public function rejectingStatus($rejectingStatus)
+    {
+        $this->getOrderDetailQuery()->where('rejecting_status',$rejectingStatus);
     }
 }

+ 23 - 11
app/Http/Controllers/DeliveryAppointmentController.php

@@ -10,6 +10,8 @@ use App\Events\DeliveryAppointmentEvent;
 use App\Imports\AppointmentDetail;
 use App\Jobs\DeliveryAppointmentCheck;
 use App\Logistic;
+use App\OracleDOCASNHeader;
+use App\OracleDOCOrderHeader;
 use App\Store;
 use App\Warehouse;
 use Carbon\Carbon;
@@ -130,16 +132,24 @@ class DeliveryAppointmentController extends Controller
     }
 
     private function checkAndGetAsn($codes){
-        if ($codes){
-            $codes = array_filter(array_unique(preg_split('/[,, ]+/u', $codes)));
-            if (count($codes)>0){
-                $asnCount = Store::query()->whereIn("asn_code",$codes)->count();
-                $codes = count($codes)===$asnCount ? implode(",",$codes) : null;
-            }else{
-                $codes = null;
-            }
-        }
-        return $codes;
+        if(!$codes) return null;
+
+        $codes = array_filter(array_unique(preg_split('/[,, ]+/u', $codes)));
+        if(count($codes) == 0) return null;
+
+        $asnNos = array_filter($codes,function($item){return str_starts_with($item,'ASN');});   // asn号
+        $asnCount = Store::query()->whereIn("asn_code",$asnNos)->count();
+        if($asnCount!==count($asnNos)) return null;
+
+        $asnReferences = array_filter($codes,function($item){return !str_starts_with($item,'ASN');});  // 上游单号
+        $docAsnHeaderAsnNos = OracleDOCASNHeader::query()->select('asnNo')->whereIn('ASNReference1',$codes)->get()->map(function ($item) {
+            return $item->asnno;
+        })->toArray();
+
+        $asnCount = Store::query()->whereIn("asn_code",$docAsnHeaderAsnNos)->count();
+        if($asnCount !== count($asnReferences)) return null;
+
+        return implode(",",array_unique(array_merge($asnNos,$docAsnHeaderAsnNos)));
     }
 
     /**
@@ -672,8 +682,10 @@ html;
     {
         $this->gate("入库管理-入库预约-预约");
         $asn = preg_split('/[,, ]+/is', request("asn"));
-        $owner = request("owner_id");
+        $asnNos = $this->checkAndGetAsn(request("asn"));
+        if(!$asnNos) $this->error("无此ASN单号");
         if (!$asn || strlen(request("asn"))<13)$this->error("非法ASN单号");
+        $owner = request("owner_id");
         $query = Store::query()->whereIn("asn_code",$asn);
         if ($owner)$query->where("owner_id",$owner);
         $stores = $query->with("storeItems")->get();

+ 17 - 14
app/Http/Controllers/OrderIssueController.php

@@ -78,7 +78,7 @@ class OrderIssueController extends Controller
         $orderIssueType = $this->orderIssueTypeService->getAllOrderIssueTypes();
         $qualityLabel = QualityLabel::all();
         $logistics = Logistic::all();
-        $userWorkgroup = UserWorkgroup::all();
+        $userWorkgroup = UserWorkgroup::withTrashed()->get();
         $userOwnerGroups = UserOwnerGroup::all();
         return view('order/issue/index', compact('owners', 'orderIssues', 'orderIssueType', 'qualityLabel', 'userWorkgroup', 'logistics', 'userOwnerGroups'));
     }
@@ -424,7 +424,7 @@ class OrderIssueController extends Controller
             return ['success' => false, 'fail_info' => '没有对应权限'];
         }
         $orderIssue_ids = $request->input('ids');
-        $bool = $this->service->isExistOrderIssueTypeIsEnd($orderIssue_ids);
+        $bool = OrderIssue::query()->whereIn('id',$orderIssue_ids)->whereIn('final_status',['已解决','已归档'])->exists();
         if ($bool) return ['success' => false, 'fail_info' => '需要完结的订单问题件中已有完结的订单问题件'];
         $bool = $this->service->endOrderIssues($orderIssue_ids);
         if ($bool == 0) return ['success' => false, 'fail_info' => '操作失败'];
@@ -609,20 +609,23 @@ class OrderIssueController extends Controller
             $rejected_name = '';
             $rejected_barcode = '';
             $rejected_amount = '';
-            if ($order_issue->rejectedBills) {
-                $order_issue->rejectedBills->each(function ($rejectedBill) use (
+            if ($order_issue->orderIssueRejectedBills) {
+                $order_issue->orderIssueRejectedBills->each(function ($orderIssueRejectedBill) use (
                     &$rejected_name, &$rejected_barcode, &$rejected_amount, &$rejected_Bill_remark, &$rejected_is_checked, &$rejected_logistic_number
                 ) {
-                    $rejected_logistic_number .= $rejectedBill->logistic_number_return . ",\r\n";
-                    $rejectedBill->items->each(function ($item) use (
-                        &$rejected_name, &$rejected_barcode, &$rejected_amount, &$rejected_Bill_remark, &$rejected_is_checked
-                    ) {
-                        $rejected_name .= $item->name_goods . ",\r\n";
-                        $rejected_barcode .= $item->barcode_goods . ",\r\n";
-                        $rejected_amount .= $item->amount . ",\r\n";
-                        $rejected_Bill_remark .= $item->remark . ",\r\n";
-                        $rejected_is_checked .= $item->quality->name . ",\r\n";
-                    });
+                    $rejectedBill = $orderIssueRejectedBill->rejectedBill;
+                    if($rejectedBill){
+                        $rejected_logistic_number .= $rejectedBill->logistic_number_return . ",\r\n";
+                        $rejectedBill->items->each(function ($item) use (
+                            &$rejected_name, &$rejected_barcode, &$rejected_amount, &$rejected_Bill_remark, &$rejected_is_checked
+                        ) {
+                            $rejected_name .= $item->name_goods . ",\r\n";
+                            $rejected_barcode .= $item->barcode_goods . ",\r\n";
+                            $rejected_amount .= $item->amount . ",\r\n";
+                            $rejected_Bill_remark .= $item->remark . ",\r\n";
+                            $rejected_is_checked .= $item->quality->name . ",\r\n";
+                        });
+                    }
                 });
             }
             $log_type = '';

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

@@ -16,6 +16,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Str;
 use Oursdreams\Export\Export;
 
 class ReceiveRecordController extends Controller
@@ -128,6 +129,10 @@ class ReceiveRecordController extends Controller
             $logistic = Logistic::query()->select("id","name")->where("name","like","%{$name}%")->first();
             $logisticId = $logistic ? $logistic->id : 0;
         } else $logisticId = 0;
+        if(str_ends_with($logisticNumber,'_') && str_starts_with($logisticNumber,'JD')){
+            preg_match_all('/[A-Za-b0-9]+/', $logisticNumber, $codes);
+            $logisticNumber = $codes[0][0] ?? $logisticNumber;
+        }
         try {
             $dateTime = now()->toDateTimeString();
             ReceiveRecord::query()->create([

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

@@ -15,6 +15,7 @@ use App\Services\LogisticService;
 use App\Services\OwnerService;
 use App\Services\QualityLabelService;
 use App\Services\RejectedService;
+use App\Services\UserService;
 use Carbon\Carbon;
 use Exception;
 use Illuminate\Contracts\Foundation\Application;
@@ -33,9 +34,11 @@ use Oursdreams\Export\Export;
 
 class RejectedController extends Controller
 {
-    public function __construct()
+    private $userService;
+    public function __construct(UserService $userService)
     {
         app()->singleton('RejectedService',RejectedService::class);
+        $this->userService = $userService;
     }
 
     /**
@@ -485,8 +488,13 @@ class RejectedController extends Controller
     // 统计查询参数获取 zengjun
     private function getAnalyzeSearchParams(Request $request)
     {
+        $owner_id = $request->input('owner',[]);
+        $owner_ids = $this->userService->getPermittingLogisticIds(Auth::user());
+        if(!is_array($owner_id))$owner_id = [$owner_id];
+        if(count($owner_id) != 0) $owner_ids = array_intersect($owner_ids,$owner_id);
+        $owner_ids = implode(',',$owner_ids);
         $searchParams = [
-            'owner_id' => $request->input('owner_id'),
+            'owner_id' => $owner_ids,
             'data'=> $request->input('data'),
             'created_at_start' => $request->input('created_at_start'),
             'created_at_end' => $request->input('created_at_end'),

+ 18 - 0
app/Http/Controllers/WorkOrderCommoditiesController.php

@@ -7,7 +7,9 @@ use App\Services\WorkOrderDetailService;
 use App\Services\WorkOrderLogService;
 use App\Services\WorkOrderService;
 use App\WorkOrder;
+use App\WorkOrderDetail;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
 
 class WorkOrderCommoditiesController extends Controller
@@ -119,4 +121,20 @@ class WorkOrderCommoditiesController extends Controller
         $workOrder->loadDefaultWith();
         return ['success' => true, 'data' => $workOrder];
     }
+
+    /**
+     * 获取
+     * @param Request $request
+     * @return array
+     */
+    public function getCommodityEqualsMapApi(Request $request): array
+    {
+        if(!Auth::check()){
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        /** @var WorkOrderDetail $work_order_detail */
+        $work_order_detail = WorkOrderDetail::query()->find($request->input('id'));
+        $data = $this->service->getOrderCommoditiesEqualWorkOrderDetailCommoditiesMap($work_order_detail);
+        return ['success' => true,'data' => $data];
+    }
 }

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

@@ -12,10 +12,13 @@ use App\Services\WorkOrderCommoditiesService;
 use App\Services\WorkOrderDetailService;
 use App\Services\WorkOrderLogService;
 use App\Services\WorkOrderService;
+use App\UserOwnerGroup;
+use App\UserWorkgroup;
 use App\WorkOrder;
 use App\WorkOrderDetail;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Gate;
+use Oursdreams\Export\Export;
 
 class WorkOrderController extends Controller
 {
@@ -74,9 +77,11 @@ class WorkOrderController extends Controller
 
         $owners = $this->ownerService->getAuthorizedOwners();
 
+        $userWorkgroup = UserWorkgroup::query()->select('id', 'name')->get();
+        $userOwnerGroup = UserOwnerGroup::query()->select('id', 'name')->get();
 
         $this->service->tags($workOrders);
-        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners'));
+        return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners', 'userWorkgroup', 'userOwnerGroup'));
     }
 
     /**
@@ -193,4 +198,142 @@ class WorkOrderController extends Controller
         }
     }
 
+    public function updateRemissionApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        if (!$request->has(['id', 'column'])) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        /** @var WorkOrder $workOrder */
+        $workOrder = WorkOrder::query()->find($request->input('id'));
+        if (!$workOrder) {
+            return ['success' => false, 'message' => '未找到对应的工单'];
+        }
+        $column = $request->input('column');
+        $workOrder->update(["{$column}" => $request->input('value') ?? null]);
+        return ['success' => true];
+    }
+
+    public function updateUserOwnerGroupApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        if (!$request->has(['id', 'user_owner_group_id'])) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        /** @var WorkOrder $workOrder */
+        $workOrder = WorkOrder::query()->find($request->input('id'));
+        if (!$workOrder) {
+            return ['success' => false, 'message' => '未找到对应的工单'];
+        }
+        $workOrder->update(['user_owner_group_id' => $request->input('user_owner_group_id')]);
+        return ['success' => true];
+    }
+
+    public function storeUserWorkGroupApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        if (!$request->has(['id', 'user_workgroup_id'])) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        /** @var WorkOrder $workOrder */
+        $workOrder = WorkOrder::query()->find($request->input('id'));
+        if (!$workOrder) {
+            return ['success' => false, 'message' => '未找到对应的工单'];
+        }
+        $hasExists = $workOrder->userWorkGroups()->where('user_workgroup_id', $request->input('user_workgroup_id'))->exists();
+        if ($hasExists) return ['success' => false, 'message' => '已有对应的关系'];
+        $workOrder->userWorkGroups()->attach($request->input('user_workgroup_id'));
+        return ['success' => true, 'data' => $workOrder->userWorkGroups];
+    }
+
+    public function destroyUserWorkGroupApi(Request $request): array
+    {
+        if (Gate::denies('订单管理-工单处理-宝时编辑')) {
+            return ['success' => false, 'message' => '没有对应权限'];
+        }
+        if (!$request->has(['id', 'user_workgroup_id'])) {
+            return ['success' => false, 'message' => '参数异常'];
+        }
+        /** @var WorkOrder $workOrder */
+        $workOrder = WorkOrder::query()->find($request->input('id'));
+        if (!$workOrder) {
+            return ['success' => false, 'message' => '未找到对应的工单'];
+        }
+        $workOrder->userWorkGroups()->detach($request->input('user_workgroup_id'));
+        return ['success' => true];
+    }
+
+    public function exportJsonExcel(Request $request, WorkOrderFilters $filters)
+    {
+        $work_orders = WorkOrder::query()->filter($filters)->defaultWith()->get();
+        return $this->exportJson($work_orders);
+    }
+
+    public function exportJson($workOrders)
+    {
+        $json = [];
+        $row = [
+            '工单类型', '当前进度', '客户', '店铺名称', '客户订单号','承运人', '快递单号', '创建时间', '当前处理人', '创建人', '情况说明', '退回单号', '退回商品', '退回商品名称', '退回商品数量', '是否正品', '操作类型', '操作人', '内容'
+        ];
+        $workOrders->each(function ($item) use (&$json) {
+            $logistic_numbers = $item->order->packages->implode('logistic_number', ",\r\n");
+            $logistic_numbers_return = $item->orderIssueRejectedBills->implode('logistic_number_return',",\r\n");
+            $rejected_item_name = '';
+            $rejected_item_sku = '';
+            $rejected_item_label = '';
+            $rejected_item_amount = '';
+            $item->orderIssueRejectedBills->each(function ($item) use (&$rejected_item_name, &$rejected_item_sku, &$rejected_item_label, &$rejected_item_amount) {
+                if($item->rejectedBill)
+                    $item->rejectedBill->items->each(function ($item) use (&$rejected_item_name, &$rejected_item_sku, &$rejected_item_label, &$rejected_item_amount) {
+                        $rejected_item_name = $rejected_item_name . $item->name_goods . ",\r\n";
+                        $rejected_item_sku = $rejected_item_sku . $item->barcode_goods . ",\r\n";
+                        $rejected_item_label = $rejected_item_label . $item->quality_label . ",\r\n";
+                        $rejected_item_amount = $rejected_item_amount . $item->amount . ",\r\n";
+                    });
+            });
+            $work_order_process_logs_type = '';
+            $work_order_process_logs_user = '';
+            $work_order_process_logs = '';
+
+            $work_order_details = $item->details->filter(function ($detail) use ($item) {
+                return $detail->order_issue_type_id == $item->order_issue_type_id;
+            });
+            if(count($work_order_details) > 0){
+                $work_order_details->first()->processLogs->each(function ($log) use (&$work_order_process_logs_type,&$work_order_process_logs_user,&$work_order_process_logs) {
+                    $work_order_process_logs_type .= $log->type. ",\r\n";
+                    $work_order_process_logs_user .= ($log->user->name ?? ''). ",\r\n";
+                    $work_order_process_logs .= $log->content. ",\r\n";
+                });
+            }
+
+            $json[] = [
+                $item->issueType->name ?? '',
+                $item->process_progress,
+                $item->owner->name ?? '',
+                $item->order->shop->name ?? '',
+                $item->order->client_code ?? '',
+                $item->logistic->name ?? '',
+                rtrim($logistic_numbers, ",\r\n"),
+                isset($item->created_at) ? str_split($item->created_at, 10)[0] : '',
+                $item->status,
+                $item->creator->name ?? '',
+                $item->remark,
+                rtrim($logistic_numbers_return, ",\r\n"),
+                rtrim($rejected_item_sku, ",\r\n"),
+                rtrim($rejected_item_name, ",\r\n"),
+                rtrim($rejected_item_amount, ",\r\n"),
+                rtrim($rejected_item_label, ",\r\n"),
+                rtrim($work_order_process_logs_type, ",\r\n"),
+                rtrim($work_order_process_logs_user, ",\r\n"),
+                rtrim($work_order_process_logs, ",\r\n"),
+            ];
+        });
+        return Export::make($row, $json, "工单");
+    }
 }

+ 5 - 132
app/OrderIssue.php

@@ -63,12 +63,12 @@ class OrderIssue extends Model
 
     public function rejectedBills(): BelongsToMany
     {
-        return $this->belongsToMany(RejectedBill::class,'order_issue_rejected_bill','order_issue_id','logistic_number_return','id','logistic_number_return');
+        return $this->belongsToMany(RejectedBill::class,'order_issue_rejected_bill','order_issue_id','logistic_number_return','id','logistic_number_return')->where('logistic_number_return','!=','');
     }
 
     public function orderIssueRejectedBills(): HasMany
     {
-        return $this->hasMany(OrderIssueRejectedBill::class,'order_id','order_id');
+        return $this->hasMany(OrderIssueRejectedBill::class,'order_id','order_id')->where('logistic_number_return','!=','');
     }
 
     public function issueType(): BelongsTo
@@ -139,77 +139,6 @@ class OrderIssue extends Model
         return $createLog->user->name ?? '';
     }
 
-//    /**
-//     * 同步退货状态
-//     */
-//    public function syncRejectingStatus()
-//    {
-//        $this->syncRejectedBillStatus($this);
-//    }
-
-//    public function syncRejectedBillStatus($orderIssue)
-//    {
-//        if (!$orderIssue->order_id) return;
-//        $orderIssueMap = [];
-//        $rejectedMap = [];
-//        $owner_id = $orderIssue->order->owner_id;
-//
-//        // 获取对应订单的所有商品
-//        $orderPackageQuery = OrderPackage::query()->selectRaw("id")->where('order_id', $orderIssue->order_id);
-//        $orderPackageCommodities = OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id', $orderPackageQuery)->get();
-//        foreach ($orderPackageCommodities as $orderPackageCommodity) {
-//            $code = $orderPackageCommodity->commodity->sku;
-//            if (empty($orderIssueMap[$code])) $orderIssueMap[$code] = $orderPackageCommodity->amount;
-//            else $orderIssueMap[$code] += $orderPackageCommodity->amount;
-//        }
-//
-//        // 获取对应退回单的所有商品
-//        $orderIssueRejectedBillQuery = OrderIssueRejectedBill::query()->selectRaw("logistic_number_return")->where("order_issue_id", $orderIssue->id);
-//        $RejectedBills = RejectedBill::query()->with('items.quality')->whereIn("logistic_number_return", $orderIssueRejectedBillQuery)->get();
-//        /** @var RejectedBill $rejectedBill */
-//        foreach ($RejectedBills as $rejectedBill) {
-//            foreach ($rejectedBill->items as $item) {
-//                $code = $item->barcode_goods;
-//                $exists = Commodity::query()->where("sku", $code)->where('owner_id',$owner_id)->exists();
-//                if (!$exists) {
-//                    $commodityBarcodeQuery = CommodityBarcode::query()->select('commodity_id')->where('code',$code);
-//                    $commodity = Commodity::query()->where('owner_id',$owner_id)->whereIn('id',$commodityBarcodeQuery)->first();
-//                    if ($commodity)$code = $commodity->sku;
-//                }
-//                $qualityName = $item->quality->name;
-//                if (empty($rejectedMap[$code]) || empty($rejectedMap[$code][$qualityName])) $rejectedMap[$code][$qualityName] = $item->amount;
-//                else $rejectedMap[$code][$qualityName] += $item->amount;
-//            }
-//        }
-//        // 比较
-//        $status = $this->getRejectingStatus($orderIssueMap, $rejectedMap);
-//        $this->update(['rejecting_status' => $status]);
-//        $this->syncWorkOrder();
-//    }
-
-//    private function getRejectingStatus($orderIssueMap, $rejectedMap): string
-//    {
-//        //未退回,差异退回,全部退回,超量退回,部分退回
-//        if (count($rejectedMap) == 0) return "未退回";
-//        $equal = 0;
-//        $portion = 0;
-//        foreach ($rejectedMap as $key => $map) {
-//            if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
-//            if (empty($orderIssueMap[$key])) return "差异退回";
-//            if(isset($rejectedMap[$key]['正品']) && isset($orderIssueMap[$key])){
-//                if ( $rejectedMap[$key]['正品'] < $orderIssueMap[$key]) $portion += 1;
-//                if ( $rejectedMap[$key]['正品'] > $orderIssueMap[$key]) return "超量退回";                                 // 超量退回
-//                if ( $rejectedMap[$key]['正品'] == $orderIssueMap[$key]) $equal += 1;
-//            }
-//        }
-//        if ($equal == count($orderIssueMap) && $equal == count($rejectedMap)  && $portion == 0) return "全部退回";        // 全部退回
-//        if ($portion > 0) return "部分退回";                                                                              // 部分退回
-//        // 部分退回
-//        if (count(array_diff_key($orderIssueMap,$rejectedMap)) > 0)return '部分退回';
-//        if (count(array_diff_key($rejectedMap,$orderIssueMap)) > 0)return '差异退回';
-//        return "无";
-//    }
-
     public function delete()
     {
         $this->logs()->delete();
@@ -222,64 +151,6 @@ class OrderIssue extends Model
         return parent::delete();
     }
 
-//    /**
-//     * 同步退货单号
-//     */
-//    public function syncRejectedBills()
-//    {
-//        $order_packages = $this->order->packages;
-//        if($order_packages){
-//            foreach ($order_packages as $order_package) {
-//                $logistic_number = $order_package->logistic_number;
-//                $rejectedBill = RejectedBill::query()->where('logistic_number_return',$logistic_number)->first();
-//                if($rejectedBill){
-//                    if(OrderIssueRejectedBill::isExit($this->id,$logistic_number))continue;
-//                    $this->joinRejectedBill($logistic_number);
-//                    if(isset($rejectedBill->items))
-//                        $this->is_new_rejecting = '有';
-//                }
-//            }
-//            $this->save();
-//        }
-//    }
-
-//    public function syncRejected($logistic_number)
-//    {
-//        $query = RejectedBill::query()->selectRaw('id');
-//        if(is_array($logistic_number)){
-//            $query->whereIn('logistic_number_return',$logistic_number);
-//        }elseif (is_string($logistic_number)){
-//            $query->where('logistic_number_return',$logistic_number);
-//        }else return;
-//        $items = RejectedBillItem::query()->whereIn('id_rejected_bill',$query);
-//        if($items->count() > 0) $this->update(['is_new_rejecting'=>'有']);
-//        elseif($items->count() == 0) $this->update(['is_new_rejecting'=>'无']);
-//    }
-
-
-//    /**
-//     * @param array|string $logistic_number
-//     * @return array|void
-//     */
-//    public function joinRejectedBill($logistic_number)
-//    {
-//        if(!$logistic_number)return null;
-//        $this->syncRejected($logistic_number);
-//        if(is_array($logistic_number)){
-//            return $this->rejectedBills()->sync($logistic_number,false);
-//        }
-//        return $this->rejectedBills()->attach($logistic_number);
-//    }
-//
-//    public function unJoinRejectedBill($logistic_number)
-//    {
-//        return $this->rejectedBills()->detach($logistic_number);
-//    }
-//
-//    public function reviseJoinRejectedBill($logistic_number,$logistic_number_update)
-//    {
-//        return $this->rejectedBills()->updateExistingPivot($logistic_number,['logistic_number_return'=>$logistic_number_update]);
-//    }
 
     public function scopeFilter($query, $filters)
     {
@@ -311,7 +182,9 @@ class OrderIssue extends Model
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity.barcodes']);
         },'orderIssueRejectedBills.rejectedBill'=>function($query){
             $query->with(['owner','logistic','user','items.quality']);
-        },'userWorkgroups','userOwnerGroup','orderDetail']);
+        },'userWorkgroups'=>function($query){
+            $query->withTrashed();
+        },'userOwnerGroup','orderDetail']);
 
     }
 

+ 17 - 6
app/Services/OrderRejectedBillRelationService.php

@@ -30,9 +30,11 @@ class OrderRejectedBillRelationService
                 ['order_id' => $order->id,'order_issue_id' => $order_issue->id ?? null]
             );
         } else {
-            OrderIssueRejectedBill::query()->create(
-                ['order_id' => $order->id, 'order_issue_id' => $order_issue->id ?? null, 'logistic_number_return' => $rejectedBill->logistic_number_return]
-            );
+            if($rejectedBill->logistic_number_return !== ''){
+                OrderIssueRejectedBill::query()->create(
+                    ['order_id' => $order->id, 'order_issue_id' => $order_issue->id ?? null, 'logistic_number_return' => $rejectedBill->logistic_number_return]
+                );
+            }
         }
         $this->service->syncRejectingStatus($order);
     }
@@ -40,7 +42,7 @@ class OrderRejectedBillRelationService
 
     private function getOrder(RejectedBill $rejectedBill)
     {
-        return $this->getOrderByLogisticNumber($rejectedBill) ?? $this->getOrderByOracleOrderHeader($rejectedBill);
+        return ($this->getOrderByLogisticNumber($rejectedBill) ?? $this->getOrderByOracleOrderHeader($rejectedBill)) ?? $this->getOrderByOrderIssueRejectedBill($rejectedBill);
     }
 
     private function getOrderByLogisticNumber(RejectedBill $rejectedBill)
@@ -58,6 +60,11 @@ class OrderRejectedBillRelationService
         return $order_header ? Order::query()->where('code', $order_header->orderno)->first() : null;
     }
 
+    private function getOrderByOrderIssueRejectedBill(RejectedBill $rejectedBill){
+        $query = OrderIssueRejectedBill::query()->select('order_id')->where('logistic_number_return',$rejectedBill['logistic_number_return']);
+        return Order::query()->whereIn('id',$query)->first();
+    }
+
     // 问题件同步
     public function orderSyncRejectedBill(Order $order)
     {
@@ -103,7 +110,9 @@ class OrderRejectedBillRelationService
 
         $rejected_bill_logistic_number_return = $this->getExistRejectedBIllLogisticNumberReturn($logistic_number_returns);
 
-        return array_intersect($logistic_number_returns, $rejected_bill_logistic_number_return);
+        return array_filter(array_intersect($logistic_number_returns, $rejected_bill_logistic_number_return),function($item){
+            return $item != '';
+        });
     }
 
     /**
@@ -116,6 +125,7 @@ class OrderRejectedBillRelationService
         return OrderIssueRejectedBill::query()
             ->select('logistic_number_return')->where('order_id', $order->id)
             ->whereIn('logistic_number_return', $logistic_numbers)->get()
+            ->where('logistic_number_return','!=','')
             ->map(function ($item) {
                 return $item->logistic_number_return;
             })->toArray();
@@ -128,7 +138,8 @@ class OrderRejectedBillRelationService
     public function getExistRejectedBIllLogisticNumberReturn(array $logistic_numbers): array
     {
         return RejectedBill::query()->select('logistic_number_return')
-            ->whereIn('logistic_number_return', $logistic_numbers)->get()
+            ->whereIn('logistic_number_return', $logistic_numbers)
+            ->where('logistic_number_return','!=','')->get()
             ->map(function ($item) {
                 return $item->logistic_number_return;
             })->toArray();

+ 5 - 2
app/Services/OrderRejectingStatusService.php

@@ -56,8 +56,11 @@ class OrderRejectingStatusService
 
     private function getRejectedBillItems(Order $order)
     {
-        $query = OrderIssueRejectedBill::query()->select('logistic_number_return')->where('order_id', $order->id);
-        $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return', $query);
+        $orderIssueRejectedBills = OrderIssueRejectedBill::query()->select('logistic_number_return')->where('order_id', $order->id)->where('logistic_number_return','!=','')->get();
+        $logistic_number_return = $orderIssueRejectedBills->map(function($item){
+            return $item->logistic_number_return;
+        })->toArray();
+        $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return', $logistic_number_return);
         return RejectedBillItem::query()->with('quality')->whereIn('id_rejected_bill', $query)->get();
     }
 

+ 1 - 1
app/Services/ReceivingTaskService.php

@@ -119,7 +119,7 @@ class ReceivingTaskService
     }
 
     /**
-     * 延时完成昨天未完成的工单
+     * 对昨天未完成的单进行超时完成
      */
     public function overtimeToCompleteTask()
     {

+ 105 - 0
app/Services/WorkOrderCommoditiesService.php

@@ -2,9 +2,14 @@
 
 namespace App\Services;
 
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\RejectedBill;
+use App\RejectedBillItem;
 use App\Traits\ServiceAppAop;
 use App\WorkOrderCommodities;
 use App\WorkOrderDetail;
+use Illuminate\Support\Facades\DB;
 
 class WorkOrderCommoditiesService
 {
@@ -106,4 +111,104 @@ class WorkOrderCommoditiesService
     {
         $detail->commodities()->update(['tag' => 1]);
     }
+
+    public function getOrderCommoditiesEqualWorkOrderDetailCommoditiesMap(WorkOrderDetail $workOrderDetail): array
+    {
+        $query = OrderPackage::query()->select('id')->where('order_id', $workOrderDetail->workOrder->order_id);
+        $order_commodities = OrderPackageCommodities::query()->with('commodity.barcodes')->whereIn('order_package_id', $query)->get();
+        $query = DB::table('order_issue_rejected_bill')->select('logistic_number_return')->where('order_id', $workOrderDetail->workOrder->order_id);
+        $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return',$query->get()->map(function ($item){
+            return $item->logistic_number_return;
+        })->toArray());
+        $rejected_items = RejectedBillItem::query()->with('barcode','quality')->whereIn('id_rejected_bill',$query)->get();
+        return $this->getEqualMapByRejectedBillAndWorkOrderCommodity($order_commodities,$rejected_items);
+    }
+
+    private function getEqualMapByRejectedBillAndWorkOrderCommodity($order_commodities,$rejectedBillItems): array
+    {
+        $rejected_bill_items_map = $this->getRejectedBillItemMap($rejectedBillItems);
+        $order_commodities_map = $this->getOrderCommoditiesMap($order_commodities,$rejected_bill_items_map);
+        return $this->getEqualMap($order_commodities_map,$rejected_bill_items_map);
+    }
+
+    public function getRejectedBillItemMap($rejectedBillItems): array
+    {
+        $map = [];
+        $rejectedBillItems->each(function($item)use(&$map){
+            $key = $item->barcode_goods;
+            $quality_label = $item->quality_label;
+            if(!array_key_exists($key,$map)){
+                $map[$key] = [
+                    'sku' => $key,
+                    'quality_label' => [
+                        "${quality_label}"=> [
+                            "quality_label" => $quality_label, "amount" => $item->amount,
+                        ],
+                    ],
+                    'name' => $item->name_goods,
+                ];
+            }
+            if(!array_key_exists($quality_label,$map[$key]['quality_label'])){
+                $map[$key]['quality_label'][$quality_label]['amount'] = 0;
+                $map[$key]['quality_label'][$quality_label]['quality_label'] = $quality_label;
+            }
+            $map[$key]['quality_label'][$quality_label]['amount'] += $item->amount;
+        });
+        return $map;
+    }
+
+    public function getOrderCommoditiesMap($orderCommodities,$rejectedBillMap): array
+    {
+        $map = [];
+        if (!$orderCommodities) return $map;
+        $barcodes = array_keys($rejectedBillMap);
+        foreach ($orderCommodities as $order_commodity) {
+            $commodity_barcodes = $order_commodity->commodity->barcodes->map(function($item){
+                return $item->code;
+            })->toArray();
+            $key = $order_commodity->commodity->sku;
+            if($commodity_barcodes){
+                $codes = array_intersect($barcodes,$commodity_barcodes);
+                $key = array_shift($codes);
+            }
+            if (!array_key_exists($key,$map)){
+                $map[$key] = [
+                    'sku' => $key,
+                    'amount' => 0,
+                    'name' => $order_commodity->commodity->name,
+                ];
+                $map[$key]['amount'] += (int) $order_commodity->amount;
+            }
+        }
+        return $map;
+    }
+
+    public function getEqualMap($orderCommodityMap,$rejectedBillMap): array
+    {
+        $map = [];
+        foreach ($orderCommodityMap as $key=>$item){
+            $map[$key] = [
+                'order_commodity_sku' => $key,
+                'order_commodity_name' => $item['name'],
+                'order_commodity_amount' => $item['amount'],
+                'rejected_item_sku' => isset($rejectedBillMap[$key]) ? $key : '',
+                'rejected_item_quality_label' => $rejectedBillMap[$key]['quality_label'] ?? [],
+                'rejected_item_name' => $rejectedBillMap[$key]['name'] ?? '',
+            ];
+        }
+        foreach ($rejectedBillMap as $key=>$item){
+            if(!array_key_exists($key,$orderCommodityMap)){
+                $map[$key] = [
+                    'order_commodity_sku' => isset($orderCommodityMap[$key])  ? $key : '',
+                    'order_commodity_name' => $orderCommodityMap['name'] ?? null,
+                    'order_commodity_amount' => $orderCommodityMap['amount'] ?? null,
+                    'rejected_item_sku' => $key,
+                    'rejected_item_quality_label' => $item['quality_label'] ?? [],
+                    'rejected_item_name' => $item['name'] ?? '',
+                ];
+            }
+        }
+        return $map;
+    }
+
 }

+ 5 - 0
app/Services/WorkOrderExpressAbnormalService.php

@@ -194,4 +194,9 @@ class WorkOrderExpressAbnormalService extends WorkOrderService
         $this->logService->createLog($detail, '终审', $process_progress . '-宝时终审');
     }
 
+    public function autoReview(WorkOrderDetail $detail, $process_progress,$endContext = null)
+    {
+
+    }
+
 }

+ 37 - 9
app/Services/WorkOrderInformationChangeService.php

@@ -144,6 +144,12 @@ class WorkOrderInformationChangeService extends WorkOrderService
             'type' => '处理',
         ]);
         $this->logService->createLog($detail, '处理', '承运商处理-'.$process_progress);
+
+        if($process_progress == '已签收'){
+            $this->autoReview($detail,'更改成功','更改成功-自动终审');
+//            $this->logService->createLog($detail, '完结', '承运商更改成功,自动终审');
+//            $this->review($detail,'更改成功','更改成功-自动终审');
+        }
     }
 
     /**
@@ -166,6 +172,29 @@ class WorkOrderInformationChangeService extends WorkOrderService
     public function baoShiReview(WorkOrderDetail $detail, $params)
     {
         $process_progress = $params['process_progress'];
+        $this->review($detail, $process_progress);
+        $this->logService->createLog($detail, '终审', '宝时终审-' . $process_progress);
+    }
+
+    /**
+     * 宝时批量终审
+     * @param $details
+     * @param $params
+     */
+    public function baoShiBatchReview($details, $params)
+    {
+        foreach ($details as $detail) {
+            $this->baoShiReview($detail, $params);
+        }
+    }
+
+    /**
+     * @param WorkOrderDetail $detail
+     * @param $process_progress
+     * @param null $endContext
+     */
+    public function review(WorkOrderDetail $detail, $process_progress,$endContext = null): void
+    {
         $detail->update([
             'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
             'process_progress' => $process_progress,
@@ -185,23 +214,22 @@ class WorkOrderInformationChangeService extends WorkOrderService
             'work_order_id' => $detail->work_order_id,
             'work_order_detail_id' => $detail->id,
             'user_id' => Auth::id(),
-            'content' => $process_progress.'-完结',
+            'content' => $endContext ?? $process_progress . '-完结',
             'status' => '未同步',
             'type' => '结束',
         ]);
         $this->endOrderIssueAndSyncProcessLogs($detail);
-        $this->logService->createLog($detail, '终审', '宝时终审-' . $process_progress);
     }
 
     /**
-     * 宝时批量终审
-     * @param $details
-     * @param $params
+     * 自动终审
+     * @param WorkOrderDetail $detail
+     * @param $process_progress
+     * @param null $endContext
      */
-    public function baoShiBatchReview($details, $params)
+    public function autoReview(WorkOrderDetail $detail, $process_progress,$endContext = null)
     {
-        foreach ($details as $detail) {
-            $this->baoShiReview($detail, $params);
-        }
+        $this->logService->createLog($detail, '完结', '承运商更改成功,自动终审');
+        $this->review($detail, $process_progress,$endContext );
     }
 }

+ 41 - 27
app/Services/WorkOrderInterceptService.php

@@ -148,6 +148,10 @@ class WorkOrderInterceptService extends WorkOrderService
             'type' => '处理',
         ]);
         $this->logService->createLog($detail, '处理', '承运商处理-' . $process_progress);
+        if( $process_progress == '拦截失败'){
+            $this->logService->createLog($detail, '终审', '承运商无法拦截,自动终审-无法拦截');
+            $this->review($detail,'无法拦截','无法拦截-自动完结');
+        }
     }
 
     /**
@@ -170,33 +174,7 @@ class WorkOrderInterceptService extends WorkOrderService
     public function baoShiReviewIntercept(WorkOrderDetail $detail, $params)
     {
         $process_progress = $params['process_progress'];
-        $detail->update([
-            'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $process_progress,
-            'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'logistic_handle_tag' => 0,
-        ]);
-        $detail->workOrder()->update([
-            'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
-            'process_progress' => $process_progress,
-            'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
-            'owner_tag' => WorkOrder::$STRAND_TAG,
-            'logistic_tag' => WorkOrder::$DEFAULT_TAG,
-            'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
-            'work_order_status' => 0,
-            'last_handler_id' => Auth::id(),
-        ]);
-
-        $detail->processLogs()->create([
-            'work_order_id' => $detail->work_order_id,
-            'work_order_detail_id' => $detail->id,
-            'user_id' => Auth::id(),
-            'content' => $process_progress.'-拦截工单',
-            'status' => '未同步',
-            'type' => '结束',
-        ]);
-
-        $this->endOrderIssueAndSyncProcessLogs($detail);
+        $this->review($detail, $process_progress);
         $this->logService->createLog($detail, '终审', '宝时终审-' . $process_progress);
     }
 
@@ -252,4 +230,40 @@ class WorkOrderInterceptService extends WorkOrderService
         $this->logService->createLog($detail, '终审', '自动终审-' . $process_progress);
     }
 
+    /**
+     * @param WorkOrderDetail $detail
+     * @param $process_progress
+     * @param null $endContext
+     */
+    public function review(WorkOrderDetail $detail, $process_progress,$endContext = null): void
+    {
+        $detail->update([
+            'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
+            'process_progress' => $process_progress,
+            'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
+            'logistic_handle_tag' => 0,
+        ]);
+        $detail->workOrder()->update([
+            'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
+            'process_progress' => $process_progress,
+            'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
+            'owner_tag' => WorkOrder::$STRAND_TAG,
+            'logistic_tag' => WorkOrder::$DEFAULT_TAG,
+            'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
+            'work_order_status' => 0,
+            'last_handler_id' => Auth::id(),
+        ]);
+
+        $detail->processLogs()->create([
+            'work_order_id' => $detail->work_order_id,
+            'work_order_detail_id' => $detail->id,
+            'user_id' => Auth::id(),
+            'content' => $endContext ?? $process_progress . '-拦截工单',
+            'status' => '未同步',
+            'type' => '结束',
+        ]);
+
+        $this->endOrderIssueAndSyncProcessLogs($detail);
+    }
+
 }

+ 1 - 1
app/Services/WorkOrderMistakeService.php

@@ -32,7 +32,7 @@ class WorkOrderMistakeService extends WorkOrderService
 
     public function checkWorkOrder($nos)
     {
-        $issueType = $this->issueTypeService->firstOrCreate(['name' => '信息更改']);
+        $issueType = $this->issueTypeService->firstOrCreate(['name' => '错漏发']);
         $orderQuery = Order::query()->select('id')->where('code', $nos);
         $workOrder = WorkOrder::query()->select('id')->whereIn('order_id', $orderQuery)->first();
         if (!$workOrder) return false;

+ 17 - 0
app/Services/WorkOrderService.php

@@ -372,6 +372,23 @@ class WorkOrderService
                 'order_issue_type_id' => $detail->order_issue_type_id,
             ]);
         }
+
+        $order_issue->update([
+            'logistic_indemnity_money' => $work_order->logistic_indemnity_money,
+            'logistic_express_remission' => $work_order->logistic_express_remission,
+            'baoshi_indemnity_money' => $work_order->bao_shi_indemnity_money,
+            'baoshi_express_remission' => $work_order->bao_shi_express_remission,
+            'user_owner_group_id' => $work_order->user_owner_group_id,
+        ]);
+
+        $work_order_user_workgroup_ids = $work_order->userWorkGroups()->get()->map(function($item){
+            return $item->id;
+        })->toArray();
+
+        $order_issue_work_groups = $order_issue->userWorkgroups()->get()->map(function($item){
+            return $item->id;
+        } )->toArray();
+        $order_issue->userWorkgroups()->attach(array_diff($work_order_user_workgroup_ids,$order_issue_work_groups));
         $process_logs = $detail->processLogs()->where('status', '未同步')->get();
         $order_issue->logs()->insert($process_logs->map((function ($process_log) use ($order_issue) {
             return [

+ 2 - 1
app/UserWorkgroup.php

@@ -7,11 +7,12 @@ use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 class UserWorkgroup extends Model
 {
     use ModelLogChanging;
-
+    use SoftDeletes;
     protected $table="user_workgroups";
     protected $fillable=['name','warehouse_id'];
     protected $appends=[

+ 38 - 8
app/WorkOrder.php

@@ -9,6 +9,7 @@ use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Support\Facades\Auth;
@@ -28,6 +29,7 @@ class WorkOrder extends Model
         'reviewer_id',              // 审核人
         'last_handler_id',          // 上一个处理人
         'order_issue_type_id',      // 问题件类型
+        'work_order_detail_id',     // 详情
         'process_progress',         // 处理进度 -----------------------------------
         // 拦截:       承运商->[已处理,已签收]         宝时审核->[`无法拦截`,`成功已退回,不赔偿`,`拦截在途丢件,赔偿`]
         // 信息更改:    承运商->[已处理,无法更改]       宝时审核->[更改成功,更改失败]
@@ -48,35 +50,47 @@ class WorkOrder extends Model
         "is_new_rejecting",         // 回库标记
         'created_at',
         'rejecting_status',         // 退回状态
+
+        'logistic_indemnity_money',     // 承运商赔偿金额
+        'logistic_express_remission',   // 承运商减免
+        'bao_shi_indemnity_money',      // 宝时赔偿金额
+        'bao_shi_express_remission',    // 宝时减免
+        'user_owner_group_id',
     ];
     /**
      * @var int 默认
      */
-    public static $DEFAULT_STATUS = 0;              //
+    public static $DEFAULT_STATUS = 0;
     /**
      * @var int  宝时处理
      */
-    public static $BAO_SHI_HANDLER_STATUS = 1;      //  宝时处理
+    public static $BAO_SHI_HANDLER_STATUS = 1;
+
     /**
      * @var int 货主处理
      */
-    public static $OWNER_HANDLER_STATUS = 2;        //  货主处理
+    public static $OWNER_HANDLER_STATUS = 2;
+
     /**
      * @var int 承运商处理
      */
-    public static $LOGISTIC_HANDLER_STATUS = 3;     //  承运商处理
+    public static $LOGISTIC_HANDLER_STATUS = 3;
+
     /**
      * @var int 宝时终审
      */
-    public static $BAO_SHI_REVIEW_STATUS = 4;       //  宝时终审
+    public static $BAO_SHI_REVIEW_STATUS = 4;
+
     /**
      * @var int 完成
      */
-    public static $END_STATUS = 5;                  //  完成
+    public static $END_STATUS = 5;
+
     /**
      * @var int 待货主完结
      */
-    public static $TO_BO_OWNER_END_STATUS = 6;      //  待货主完结
+    public static $TO_BO_OWNER_END_STATUS = 6;
+
 
     /**
      * @var int `新`标记
@@ -234,6 +248,21 @@ class WorkOrder extends Model
         return $this->belongsTo(OrderDetail::class,'order_id','order_id');
     }
 
+    public function userWorkGroups(): BelongsToMany
+    {
+        return $this->belongsToMany(UserWorkgroup::class,'work_order_user_workgroup');
+    }
+
+    public function userOwnerGroup(): BelongsTo
+    {
+        return $this->BelongsTo(UserOwnerGroup::class);
+    }
+
+    public function detail(): BelongsTo
+    {
+        return $this->belongsTo(WorkOrderDetail::class,'work_order_detail_id','id');
+    }
+
     public function scopeFilter($query, $filters)
     {
         return $filters->apply($query);
@@ -252,7 +281,8 @@ class WorkOrder extends Model
 
     public function defaultWith(): array
     {
-        return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler','orderDetail','orderIssueRejectedBills', 'details' => function ($query) {
+        return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler','orderDetail','orderIssueRejectedBills.rejectedBill.items',
+            'userWorkGroups','details' => function ($query) {
             return $query->with(['commodities.commodity', 'logs' => function ($query) {
                 return $query->with('creator')->orderByDesc('created_at');
             }, 'images.uploadFile', 'issueType', 'processLogs' => function ($query) {

+ 15 - 4
app/WorkOrderDetail.php

@@ -3,10 +3,11 @@
 namespace App;
 
 use App\Traits\ModelTimeFormat;
-use Illuminate\Database\Eloquent\Model;
-
 use App\Traits\ModelLogChanging;
+
+use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Support\Facades\Auth;
 
@@ -21,7 +22,7 @@ class WorkOrderDetail extends Model
         'price',                    // 商品价值
         'sku_amount',               // 破损sku数
         'type',                     // 快递异常填写:在途异常,签收未收到
-        'last_handler_id',             // 上一个处理人
+        'last_handler_id',          // 上一个处理人
         'reissue_logistic_number',  // 补发单号
         'return_logistic_number',   // 退回单号 (错漏发:商家填写) (破损:创建时填写)
         'process_progress',         // 处理进度
@@ -33,8 +34,8 @@ class WorkOrderDetail extends Model
         'return_address',           // 退回单 寄件人地址
         'return_phone',             // 退回单 寄件人联系号码
         'return_name',              // 退回单 寄件人姓名
-
         'logistic_handle_tag',      // 承运商在处理标记
+
     ];
 
     static public $enums = [
@@ -198,6 +199,16 @@ class WorkOrderDetail extends Model
         return $this->hasMany(WorkOrderProcessLog::class,'work_order_detail_id','id');
     }
 
+    public function userOwnerGroup(): BelongsTo
+    {
+        return $this->belongsTo(UserOwnerGroup::class);
+    }
+
+    public function userWorkgroups(): BelongsToMany
+    {
+        return $this->belongsToMany(UserWorkgroup::class);
+    }
+
     // 未完成历史标记
     public function undoneTag()
     {

+ 41 - 0
database/migrations/2022_01_19_172151_work_order_details_add_indemnity_money.php

@@ -0,0 +1,41 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrderDetailsAddIndemnityMoney extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->decimal('logistic_indemnity_money')->index()->nullable()->comment('承运商赔偿金额');
+            $table->enum('logistic_express_remission', ['原单减免', '补发减免', '全部减免'])->index()->nullable()->comment('承运商快递减免');
+            $table->decimal('bao_shi_indemnity_money')->index()->nullable()->comment('宝时赔偿金额');
+            $table->enum('bao_shi_express_remission', ['原单减免', '补发减免', '全部减免'])->index()->nullable()->comment('宝时快递减免');
+            $table->integer('user_owner_group_id')->index()->nullable()->comment('项目责任方');
+        });
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->dropColumn('logistic_indemnity_money');
+            $table->dropColumn('logistic_express_remission');
+            $table->dropColumn('bao_shi_indemnity_money');
+            $table->dropColumn('bao_shi_express_remission');
+            $table->dropColumn('user_owner_group_id');
+        });
+    }
+}

+ 32 - 0
database/migrations/2022_01_21_111254_work_orders_add_work_order_detail_id.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class WorkOrdersAddWorkOrderDetailId extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->bigInteger('work_order_detail_id')->index()->comment('当前工单详情');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('work_orders', function (Blueprint $table) {
+            $table->dropColumn('work_order_detail_id');
+        });
+    }
+}

+ 32 - 0
database/migrations/2022_01_21_132626_create_work_order_user_workgroup_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateWorkOrderUserWorkgroupTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('work_order_user_workgroup', function (Blueprint $table) {
+            $table->bigInteger('work_order_id')->comment('工单');
+            $table->bigInteger('user_workgroup_id')->comment('仓库组');
+            $table->unique(['work_order_id','user_workgroup_id']);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('work_order_user_workgroup');
+    }
+}

+ 32 - 0
database/migrations/2022_02_10_113047_user_workgroup_soft_delete.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class UserWorkgroupSoftDelete extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('user_workgroups', function (Blueprint $table) {
+            $table->softDeletes();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('user_workgroups', function (Blueprint $table) {
+            $table->dropSoftDeletes();
+        });
+    }
+}

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
resources/js/element/index.js


+ 221 - 179
resources/js/queryForm/header.js

@@ -1,120 +1,127 @@
 window.checkData = []; //全选 数据池
-window.sort=require('../utilities/sort');//排序组件
+window.sort = require('../utilities/sort');//排序组件
 window.Header = function getHeader(object) {
     let _targetDom = object.el ? document.getElementById(object.el) : document.getElementsByTagName("table")[0];//基点元素
     let _columns = object.column;   //列名
     let _fixedTop = object.fixedTop || 0;  //同级浮动元素高度,使当前元素追加该元素高度浮动
-    let _isCheckAllBox = object.isCheckAllBox!==false;//是否开启全选框
+    let _isCheckAllBox = object.isCheckAllBox !== false;//是否开启全选框
     let _data = object.data || [];   //被排序数据
     let _restorationColumn = object.restorationColumn || 'id'; //恢复原数据基准字段
     let _isRestorationColumnAsc = object.isRestorationColumnAsc || false;    //恢复原数据基准字段的排序类型 true:asc false:desc
     let _before = object.before;//前置元素
-    let _name = "header:"+(object.name ? object.name+"." : "");//唯一名称 用于区别模块 本地存储
+    let _name = "header:" + (object.name ? object.name + "." : "");//唯一名称 用于区别模块 本地存储
     let _isForbidDrag = object.isForbidDrag;
 
     let sortType = {}; //排序类型
     let columnArr = []; //列数组
 
     let moveTd = {}; //移动列
-    let isNested = _targetDom.getElementsByTagName("table").length>0;
+    let isNested = _targetDom.getElementsByTagName("table").length > 0;
 
     let setting = "setting-column";
     let settingInfo = localStorage.getItem("settingInfo") ? JSON.parse(localStorage.getItem("settingInfo")) : {
-        isCopyWrap : true
+        isCopyWrap: true
     };
     let keyCode = false;
     let settingCheck = true;
+    var beforeHeaderDom;
+    var headerDom;
 
     function getTargetChildNode(dom) { //递归获取input子节点
-        if (!dom || dom.tagName==='INPUT')return dom;
+        if (!dom || dom.tagName === 'INPUT') return dom;
         return getTargetChildNode(dom.firstElementChild);
     }
+
     function createHeaderBefore() {//生成前置元素
         let tr = document.createElement("tr");
         tr.className = "text-center";
-        _before.forEach(be=>{
+        _before.forEach(be => {
             let th = document.createElement("th");
-            if (be.colspan)th.colSpan = be.colspan;
-            if (be.font){
+            if (be.colspan) th.colSpan = be.colspan;
+            if (be.font) {
                 let font = document.createElement("span");
                 font.className = be.font;
                 th.appendChild(font);
             }
-            if (be.value)th.appendChild(document.createTextNode(be.value));
-            if (be.class)th.className = be.class;
+            if (be.value) th.appendChild(document.createTextNode(be.value));
+            if (be.class) th.className = be.class;
             tr.appendChild(th);
         });
         _targetDom.insertBefore(tr, _targetDom.firstElementChild);
+        beforeHeaderDom = tr;
     }
-    function appendFloat(div,cla="") {
+
+    function appendFloat(div, cla = "") {
         div.style.overflowX = "hidden";
-        div.className="m-0 p-0";
+        div.className = "m-0 p-0";
         let th = document.createElement("th");
-        th.className = "pl-2 pr-2 header-float "+cla;
-        th.style.top = _fixedTop+"px";
+        th.className = "pl-2 pr-2 header-float " + cla;
+        th.style.top = _fixedTop + "px";
         th.appendChild(div);
         return th;
     }
+
     function createHeader() {//生成表头列
         let tr = document.createElement("tr");
         tr.className = "text-nowrap";
         let firstTr = _targetDom.getElementsByTagName("tr")[0];
         let tds = [];
-        if (firstTr)tds = firstTr.children;
-        if (_isCheckAllBox){//是否开启全选
+        if (firstTr) tds = firstTr.children;
+        if (_isCheckAllBox) {//是否开启全选
             let div = document.createElement("div");
             let check = document.createElement("input");
             check.type = "checkbox";
             check.id = "checkAll";
-            if (firstTr)bindCheckbox(check);
+            if (firstTr) bindCheckbox(check);
             div.appendChild(check);
-            tr.appendChild(appendFloat(div,"text-left"));
+            tr.appendChild(appendFloat(div, "text-left"));
         }
 
         let i = (_isCheckAllBox && firstTr) ? 1 : 0;
-        for (i;i<(tds.length>0 ? tds.length : _columns.length);i++){
+        for (i; i < (tds.length > 0 ? tds.length : _columns.length); i++) {
             let div = document.createElement("div");
             let th = appendFloat(div);
-            let column = _columns[(_isCheckAllBox && firstTr) ? i-1 : i];
-            let wid = column ? localStorage.getItem(_name+column.name) : null;
-            if (wid){
-                div.style.width = wid+"px";
-                th.style.minWidth = wid+"px";
+            let column = _columns[(_isCheckAllBox && firstTr) ? i - 1 : i];
+            let wid = column ? localStorage.getItem(_name + column.name) : null;
+            if (wid) {
+                div.style.width = wid + "px";
+                th.style.minWidth = wid + "px";
                 let trs = _targetDom.children;
-                while(trs[0] && trs[0].tagName !== 'TR')trs = trs[0].children;
-                if (trs[0]){
-                    for (let j=0;j<trs.length;j++){
-                        if (trs[j].children[i]){
-                            trs[j].children[i].firstElementChild.style.width = wid+"px";
-                            trs[j].children[i].style.minWidth = wid+"px";
+                while (trs[0] && trs[0].tagName !== 'TR') trs = trs[0].children;
+                if (trs[0]) {
+                    for (let j = 0; j < trs.length; j++) {
+                        if (trs[j].children[i]) {
+                            trs[j].children[i].firstElementChild.style.width = wid + "px";
+                            trs[j].children[i].style.minWidth = wid + "px";
                         }
                     }
                 }
             }
-            if (column){
-                if (column.type === 'multi')  multiColumn(div,column);
-                else defaultColumn(div,column);
+            if (column) {
+                if (column.type === 'multi') multiColumn(div, column);
+                else defaultColumn(div, column);
             }
             tr.appendChild(th);
         }
         bindMove(tr);
-        if (_targetDom.firstElementChild)_targetDom.insertBefore(tr, _targetDom.firstElementChild);
+        if (_targetDom.firstElementChild) _targetDom.insertBefore(tr, _targetDom.firstElementChild);
         else _targetDom.appendChild(tr);
+        headerDom = tr;
     }
 
-    function multiColumn(th,column) { //多列样式的生成
-        if (column.title){
+    function multiColumn(th, column) { //多列样式的生成
+        if (column.title) {
             let div = document.createElement("div");
-            div.className="w-100 text-center";
+            div.className = "w-100 text-center";
             div.appendChild(document.createTextNode(column.title));
             th.appendChild(div);
         }
         let div = document.createElement("div");
-        div.className="row text-center";
-        if (column.rows){
-            column.rows.forEach(row=>{
+        div.className = "row text-center";
+        if (column.rows) {
+            column.rows.forEach(row => {
                 let node = document.createElement("div");
-                node.className = "col-"+(row.col ? row.col : 1);
+                node.className = "col-" + (row.col ? row.col : 1);
                 node.appendChild(document.createTextNode(row.value));
                 div.appendChild(node);
             });
@@ -122,67 +129,67 @@ window.Header = function getHeader(object) {
         }
     }
 
-    function defaultColumn(th,column) { //默认列样式的生成
-        if (column.style)for (let key in column.style)if (column.style.hasOwnProperty(key)) th.parentElement.style[key] = column.style[key];
-        if (column.class)th.parentElement.className +=  column.class;
+    function defaultColumn(th, column) { //默认列样式的生成
+        if (column.style) for (let key in column.style) if (column.style.hasOwnProperty(key)) th.parentElement.style[key] = column.style[key];
+        if (column.class) th.parentElement.className += column.class;
         let span = document.createElement("span");
         span.style.display = "inline-block";
-        if (!column.neglect){
+        if (!column.neglect) {
             span.style.cursor = "pointer";
             let font = document.createElement("span");
             font.className = "fa fa-sort";
             span.appendChild(font);
-            span.onclick = rule(column,font); //绑定排序事件
+            span.onclick = rule(column, font); //绑定排序事件
         }
         span.appendChild(document.createTextNode((column.value ? column.value : '')));
         th.appendChild(span);
     }
 
     //点击事件触发的排序规则
-    function rule(column,columnSort) {
+    function rule(column, columnSort) {
         return function () {
-            if (!sortType[column.name]){
+            if (!sortType[column.name]) {
                 sortType[column.name] = 'asc';
                 columnArr.push(column.name);
                 columnSort.className = "fa fa-sort-asc";
                 let columnArrTemp = [];
-                columnArrTemp.push.apply(columnArrTemp,columnArr);
-                window.sort.sort(_data,columnArrTemp,sortType);
-                return ;
+                columnArrTemp.push.apply(columnArrTemp, columnArr);
+                window.sort.sort(_data, columnArrTemp, sortType);
+                return;
             }
-            if (sortType[column.name] === 'asc'){
+            if (sortType[column.name] === 'asc') {
                 sortType[column.name] = 'desc';
                 columnSort.className = "fa fa-sort-desc";
                 let columnArrTemp = [];
-                columnArrTemp.push.apply(columnArrTemp,columnArr);
-                window.sort.sort(_data,columnArrTemp,sortType);
-                return ;
+                columnArrTemp.push.apply(columnArrTemp, columnArr);
+                window.sort.sort(_data, columnArrTemp, sortType);
+                return;
             }
-            if (sortType[column.name] === 'desc'){
+            if (sortType[column.name] === 'desc') {
                 delete sortType[column.name];
                 columnArr.some(function (name, index) {
-                    if (name === column.name){
-                        columnArr.splice(index,1);
+                    if (name === column.name) {
+                        columnArr.splice(index, 1);
                         return true;
                     }
                 });
                 columnSort.className = "fa fa-sort";
-                if (columnArr.length === 0){
+                if (columnArr.length === 0) {
                     //希尔排序
                     let arr = [];
-                    arr.push.apply(arr,_data);
+                    arr.push.apply(arr, _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++) {
+                    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 (_isRestorationColumnAsc){
-                                while(j - gap >= 0 && Number(current[_restorationColumn]) < Number(arr[j - gap][_restorationColumn])) {
+                            if (_isRestorationColumnAsc) {
+                                while (j - gap >= 0 && Number(current[_restorationColumn]) < Number(arr[j - gap][_restorationColumn])) {
                                     arr[j] = arr[j - gap];
                                     j = j - gap;
                                 }
-                            }else{
-                                while(j - gap >= 0 && Number(current[_restorationColumn]) > Number(arr[j - gap][_restorationColumn])) {
+                            } else {
+                                while (j - gap >= 0 && Number(current[_restorationColumn]) > Number(arr[j - gap][_restorationColumn])) {
                                     arr[j] = arr[j - gap];
                                     j = j - gap;
                                 }
@@ -191,121 +198,132 @@ window.Header = function getHeader(object) {
                         }
                     }
                     _data.length = 0;
-                    _data.push.apply(_data,arr);
+                    _data.push.apply(_data, arr);
                     return;
                 }
                 let columnArrTemp = [];
-                columnArrTemp.push.apply(columnArrTemp,columnArr);
-                window.sort.sort(_data,columnArrTemp,sortType);
+                columnArrTemp.push.apply(columnArrTemp, columnArr);
+                window.sort.sort(_data, columnArrTemp, sortType);
             }
         }
     }
+
     function bindCheckbox(check) {
         let trs = _targetDom.children;
-        while(trs[0].tagName !== 'TR')trs = trs[0].children;
+        while (trs[0].tagName !== 'TR') trs = trs[0].children;
         check.onchange = function () {
-            if (event.target.checked){
-                for (let i=0;i<trs.length;i++){
+            if (event.target.checked) {
+                for (let i = 0; i < trs.length; i++) {
                     let checkbox = getTargetChildNode(trs[i].children[0]);
-                    if (checkbox && !checkbox.checked){
+                    if (checkbox && !checkbox.checked) {
                         checkData.push(checkbox.value);
                         checkbox.checked = true;
                     }
                 }
-            }else{
+            } else {
                 checkData = [];
-                for (let i=0;i<trs.length;i++){
+                for (let i = 0; i < trs.length; i++) {
                     let checkbox = getTargetChildNode(trs[i].children[0]);
-                    if (checkbox && checkbox.checked)checkbox.checked = false;
+                    if (checkbox && checkbox.checked) checkbox.checked = false;
                 }
             }
         };
-        for (let i=0;i<trs.length;i++){
+        for (let i = 0; i < trs.length; i++) {
             let checkbox = getTargetChildNode(trs[i].children[0]);
             if (checkbox) checkbox.onchange = function () {
-                if (event.target.checked)checkData.push(checkbox.value);
-                else checkData.splice(checkData.indexOf(checkbox.value),1);
-                if (checkData.length === _data.length && !check.checked)check.checked=true;
-                if (checkData.length !== _data.length && check.checked) check.checked=false;
+                if (event.target.checked) checkData.push(checkbox.value);
+                else checkData.splice(checkData.indexOf(checkbox.value), 1);
+                if (checkData.length === _data.length && !check.checked) check.checked = true;
+                if (checkData.length !== _data.length && check.checked) check.checked = false;
             }
         }
     }
+
     function bindMove(tr) {
-        if (_isForbidDrag)return;
-        for (let j=0;j<tr.children.length;j++){ //为首列绑定拖拽列宽事件
-            tr.children[j].onmousedown = function (){
-                if (j===0 && event.offsetX<10)return;
-                if(event.offsetX<10)moveTd = {oldX:event.clientX,dom:tr.children[j-1],index:j-1};
-                if (event.offsetX > tr.children[j].offsetWidth-10)moveTd = {oldX:event.clientX,dom:tr.children[j],index:j};
+        if (_isForbidDrag) return;
+        for (let j = 0; j < tr.children.length; j++) { //为首列绑定拖拽列宽事件
+            tr.children[j].onmousedown = function () {
+                if (j === 0 && event.offsetX < 10) return;
+                if (event.offsetX < 10) moveTd = {oldX: event.clientX, dom: tr.children[j - 1], index: j - 1};
+                if (event.offsetX > tr.children[j].offsetWidth - 10) moveTd = {
+                    oldX: event.clientX,
+                    dom: tr.children[j],
+                    index: j
+                };
             };
             tr.children[j].onmousemove = function () {
-                if (j===0 && event.offsetX<10)return;
-                if(event.offsetX<10 || event.offsetX > tr.children[j].offsetWidth-10)
+                if (j === 0 && event.offsetX < 10) return;
+                if (event.offsetX < 10 || event.offsetX > tr.children[j].offsetWidth - 10)
                     this.style.cursor = 'w-resize';
                 else this.style.cursor = 'default';
             }
         }
-        document.onmouseup = function (){ //全局监听拖拽列宽的发生 作用域设为全局是为了防抖动
-            if (moveTd.oldX){
+        document.onmouseup = function () { //全局监听拖拽列宽的发生 作用域设为全局是为了防抖动
+            if (moveTd.oldX) {
                 event.stopPropagation();
                 moveTd.dom.style.cursor = 'default';
                 moveTd.oldX = undefined;
                 setTimeout(function () {
-                    let column = _columns[(_isCheckAllBox && _targetDom.firstElementChild) ? moveTd.index-1 : moveTd.index];
-                    if (column) localStorage.setItem(_name+column.name, moveTd.dom.offsetWidth);
+                    let column = _columns[(_isCheckAllBox && _targetDom.firstElementChild) ? moveTd.index - 1 : moveTd.index];
+                    if (column) localStorage.setItem(_name + column.name, moveTd.dom.offsetWidth);
                 });
             }
         }; //移动时调整表头与表身的列宽
-        document.onmousemove = function(){
-            if (moveTd.oldX){
+        document.onmousemove = function () {
+            if (moveTd.oldX) {
                 event.stopPropagation();
-                let diff = event.clientX-moveTd.oldX;
-                let newWidth = moveTd.dom.firstElementChild.offsetWidth+diff+"px";
-                if (diff!==0){
+                let diff = event.clientX - moveTd.oldX;
+                let newWidth = moveTd.dom.firstElementChild.offsetWidth + diff + "px";
+                if (diff !== 0) {
                     let trs = _targetDom.getElementsByTagName("tr");
-                    for (let j=(_before ? 1 : 0);j<trs.length;j++){
-                        if (isNested){
+                    for (let j = (_before ? 1 : 0); j < trs.length; j++) {
+                        if (isNested) {
                             let table = trs[j].parentElement;
-                            while (table.tagName!=='TABLE') table = table.parentElement;
-                            if (table.id!==object.el)continue;
+                            while (table.tagName !== 'TABLE') table = table.parentElement;
+                            if (table.id !== object.el) continue;
                         }
-                        if (trs[j].children[moveTd.index]){
+                        if (trs[j].children[moveTd.index]) {
                             trs[j].children[moveTd.index].firstElementChild.style.width = newWidth;
                             trs[j].children[moveTd.index].style.minWidth = newWidth;
                         }
                     }
-                    _targetDom.style.width = _targetDom.offsetWidth+diff+"px";
+                    _targetDom.style.width = _targetDom.offsetWidth + diff + "px";
                     moveTd.oldX = event.clientX;
                 }
             }
         };
     }
+
     function repaintDom() {
         let trs = _targetDom.getElementsByTagName("tr");
-        for (let i=0;i<trs.length;i++){
-            if (isNested){
+        for (let i = 0; i < trs.length; i++) {
+            if (isNested) {
                 let table = trs[i].parentElement;
-                while (table.tagName!=='TABLE') table = table.parentElement;
-                if (table.id!==object.el)continue;
+                while (table.tagName !== 'TABLE') table = table.parentElement;
+                if (table.id !== object.el) continue;
             }
             let tds = trs[i].children;
-            for (let j=0;j<tds.length;j++){
+            for (let j = 0; j < tds.length; j++) {
                 let count = tds[j].children.length;
                 let div = document.createElement("div");
                 div.style.overflowX = "hidden";
-                for (let k=0;k<count;k++){div.appendChild(tds[j].children[0]);}
+                for (let k = 0; k < count; k++) {
+                    div.appendChild(tds[j].children[0]);
+                }
                 tds[j].appendChild(div);
                 tds[j].className += " pl-2 pr-2";
             }
         }
     }
+
     function showSetting(type) {
-        return function (){
+        return function () {
             let type2 = type === "setting-1" ? "setting-2" : "setting-1";
             document.getElementById(type2).style.display = "";
             document.getElementById(type).style.display = "none";
         };
     }
+
     function _createSetting1() {
         /*
         * <div id="setting-1" onclick="tt()" style="position: fixed;bottom: 0;left: 0;background-color: #1b1e21;width: 50px;height: 50px;cursor: pointer;text-align: center;border-radius: 3px">
@@ -332,7 +350,8 @@ window.Header = function getHeader(object) {
         div.appendChild(h1);
         document.body.appendChild(div);
     }
-    function _createSettingHeader(text,id) {
+
+    function _createSettingHeader(text, id) {
         let div = document.createElement("div");
         div.style.width = "5%";
         div.style.display = "inline-block";
@@ -342,91 +361,95 @@ window.Header = function getHeader(object) {
         div.innerText = text;
         div.id = id;
         div.onclick = function () {
-            if (event.target.id===setting)return;
+            if (event.target.id === setting) return;
             let old = document.getElementById(setting);
             old.style.backgroundColor = "";
             old.style.color = "";
-            document.getElementById(setting+"-body").style.display = "none";
-            event.target.style.backgroundColor ="#3490dc";
-            event.target.style.color ="white";
-            document.getElementById(event.target.id+"-body").style.display = "";
+            document.getElementById(setting + "-body").style.display = "none";
+            event.target.style.backgroundColor = "#3490dc";
+            event.target.style.color = "white";
+            document.getElementById(event.target.id + "-body").style.display = "";
             setting = event.target.id;
         };
         return div;
     }
+
     function bindColumnEvent() {
-        return function(){
-            let storage = localStorage.getItem("column:"+object.name);
+        return function () {
+            let storage = localStorage.getItem("column:" + object.name);
             let arr = storage ? storage.split(',') : [];
-            localStorage.setItem("column:"+object.name,_exeHid(arr).toString());
+            localStorage.setItem("column:" + object.name, _exeHid(arr).toString());
         };
     }
+
     function _exeHid(arr) {
         let nodes = document.getElementById("setting-column-body").getElementsByTagName("input");
         let show = [];
         let hid = [];
         let newArr = [];
-        for (let i=0;i<nodes.length;i++){
+        for (let i = 0; i < nodes.length; i++) {
             let value = nodes[i].value;
             let index = nodes[i].dataset.index;
             let checked = nodes[i].checked;
-            if (checked && arr.indexOf(value)!==-1) show.push(index);
-            if (!checked){
+            if (checked && arr.indexOf(value) !== -1) show.push(index);
+            if (!checked) {
                 newArr.push(value);
-                if (arr.indexOf(value)===-1)hid.push(index);
+                if (arr.indexOf(value) === -1) hid.push(index);
             }
         }
         let trs = _targetDom.getElementsByTagName("tr"); //所有行
         let total = trs[_before ? 1 : 0].children.length; //最大列
-        for (let i=0;i<trs.length;i++){
-            if (isNested){ //排除表格嵌套
+        for (let i = 0; i < trs.length; i++) {
+            if (isNested) { //排除表格嵌套
                 let table = trs[i].parentElement;
-                while (table.tagName!=='TABLE') table = table.parentElement;
-                if (table.id!==object.el)continue;
+                while (table.tagName !== 'TABLE') table = table.parentElement;
+                if (table.id !== object.el) continue;
             }
-            if (total!==trs[i].children.length){ //存在合并行/列
+            if (total !== trs[i].children.length) { //存在合并行/列
                 let pointer = [];//建立一个指针数组 用于存储下标指向真实element
-                for (let j=0;j<trs[i].children.length;j++){
-                    if (trs[i].children[j] && trs[i].children[j].colSpan>1){
-                        for (let k=0;k<trs[i].children[j].colSpan;k++)pointer.push(j);
-                    }else pointer.push(j);
+                for (let j = 0; j < trs[i].children.length; j++) {
+                    if (trs[i].children[j] && trs[i].children[j].colSpan > 1) {
+                        for (let k = 0; k < trs[i].children[j].colSpan; k++) pointer.push(j);
+                    } else pointer.push(j);
                 }
-                for (let j=0;j<show.length;j++)showOrHiddenDom(trs[i].children[pointer[show[j]]]);
-                for (let j=0;j<hid.length;j++)showOrHiddenDom(trs[i].children[pointer[hid[j]]],"hid");
-            }else {
-                for (let j=0;j<show.length;j++)showOrHiddenDom(trs[i].children[show[j]]);
-                for (let j=0;j<hid.length;j++)showOrHiddenDom(trs[i].children[hid[j]],"hid");
+                for (let j = 0; j < show.length; j++) showOrHiddenDom(trs[i].children[pointer[show[j]]]);
+                for (let j = 0; j < hid.length; j++) showOrHiddenDom(trs[i].children[pointer[hid[j]]], "hid");
+            } else {
+                for (let j = 0; j < show.length; j++) showOrHiddenDom(trs[i].children[show[j]]);
+                for (let j = 0; j < hid.length; j++) showOrHiddenDom(trs[i].children[hid[j]], "hid");
             }
         }
         return newArr;
     }
-    function showOrHiddenDom(dom,type="show") {
-        if (!dom)return;
-        if (type==="show"){
-            if (dom.colSpan>1)dom.colSpan++;
+
+    function showOrHiddenDom(dom, type = "show") {
+        if (!dom) return;
+        if (type === "show") {
+            if (dom.colSpan > 1) dom.colSpan++;
             else dom.style.display = "";
-        }else{
-            if (dom.colSpan>1)dom.colSpan--;
+        } else {
+            if (dom.colSpan > 1) dom.colSpan--;
             else dom.style.display = "none";
         }
     }
+
     function appendCheckboxList(div) {
-        let storage = localStorage.getItem("column:"+object.name);
+        let storage = localStorage.getItem("column:" + object.name);
         let arr = storage ? storage.split(',') : [];
-        _columns.forEach(function (column,index) {
-            let key = "setting-column-"+column.name;
+        _columns.forEach(function (column, index) {
+            let key = "setting-column-" + column.name;
             let label = document.createElement("label");
             label.style.float = "left";
             let input = document.createElement("input");
-            input.type="checkbox";
-            input.id=key;
+            input.type = "checkbox";
+            input.id = key;
             input.className = "fixed-checkbox";
-            input.dataset.index = _isCheckAllBox ? index+1 : index;
+            input.dataset.index = _isCheckAllBox ? index + 1 : index;
             input.value = column.name;
-            if (arr.indexOf(column.name)===-1)input.checked = true;
+            if (arr.indexOf(column.name) === -1) input.checked = true;
             label.appendChild(input);
             let la = document.createElement("label");
-            la.setAttribute("for",key);
+            la.setAttribute("for", key);
             label.appendChild(la);
             label.appendChild(document.createTextNode(column.type ? column.title : column.value));
             let prentLabel = document.createElement("label");
@@ -435,29 +458,33 @@ window.Header = function getHeader(object) {
             div.appendChild(prentLabel);
         });
     }
+
     function bindClearEvent(need) {
-        return function() {
+        return function () {
             for (let i = 0; i < localStorage.length; i++) {
                 let key = localStorage.key(i);
-                if (need === key.substring(0,need.length))localStorage.removeItem(key);
+                if (need === key.substring(0, need.length)) localStorage.removeItem(key);
             }
         };
     }
+
     function bindCheckAllEvent() {
         return function () {
             settingCheck = !settingCheck;
             let nodes = document.getElementById("setting-column-body").getElementsByTagName("input");
-            for (let i=0;i<nodes.length;i++){
-                if (nodes[i].checked!==settingCheck) nodes[i].checked=settingCheck;
+            for (let i = 0; i < nodes.length; i++) {
+                if (nodes[i].checked !== settingCheck) nodes[i].checked = settingCheck;
             }
         }
     }
+
     function bindReverseEvent() {
         return function () {
             let nodes = document.getElementById("setting-column-body").getElementsByTagName("input");
-            for (let i=0;i<nodes.length;i++)nodes[i].checked=!nodes[i].checked;
+            for (let i = 0; i < nodes.length; i++) nodes[i].checked = !nodes[i].checked;
         }
     }
+
     function _createSetting2() {
         /*
         * <div id="setting-2"  style="background-color: white;position: fixed;bottom: 0;left: 0;width: 100%;display: none">
@@ -509,17 +536,17 @@ window.Header = function getHeader(object) {
         span.onclick = showSetting("setting-2");
         div11.appendChild(span);
         div1.appendChild(div11);
-        let div12 = _createSettingHeader("显示列","setting-column");
+        let div12 = _createSettingHeader("显示列", "setting-column");
         div12.style.backgroundColor = "#3490dc";
         div12.style.color = "white";
         div1.appendChild(div12);
-        div1.appendChild(_createSettingHeader("表头设置","setting-header"));
+        div1.appendChild(_createSettingHeader("表头设置", "setting-header"));
         let b = document.createElement("b");
-        b.style.float="right";
-        b.style.marginRight="10px";
-        b.style.cursor="pointer";
-        b.style.fontSize="18px";
-        b.innerHTML="&times;";
+        b.style.float = "right";
+        b.style.marginRight = "10px";
+        b.style.cursor = "pointer";
+        b.style.fontSize = "18px";
+        b.innerHTML = "&times;";
         b.onclick = showSetting("setting-2");
         div1.appendChild(b);
         div.appendChild(div1);
@@ -534,7 +561,7 @@ window.Header = function getHeader(object) {
         let btn = document.createElement("button");
         btn.className = "btn btn-sm btn-success";
         btn.type = "button";
-        btn.innerText="保存设置";
+        btn.innerText = "保存设置";
         btn.onclick = bindColumnEvent();
         let div211 = document.createElement("div");
         div211.appendChild(btn);
@@ -554,7 +581,7 @@ window.Header = function getHeader(object) {
         div2.appendChild(div21);
         let div22 = document.createElement("div");
         div22.id = "setting-header-body";
-        div22.style.display="none";
+        div22.style.display = "none";
         let div221 = document.createElement("div");
         div221.className = "row mt-2";
         let text = document.createElement("label");
@@ -581,9 +608,9 @@ window.Header = function getHeader(object) {
         input.type = "checkbox";
         input.className = "switch";
         input.checked = settingInfo.isCopyNoWrap;
-        input.onchange = function(){
+        input.onchange = function () {
             settingInfo.isCopyNoWrap = event.target.checked;
-            localStorage.setItem("settingInfo",JSON.stringify(settingInfo));
+            localStorage.setItem("settingInfo", JSON.stringify(settingInfo));
         };
         let div223 = document.createElement("div");
         div223.className = "row";
@@ -594,9 +621,9 @@ window.Header = function getHeader(object) {
         let btn3 = document.createElement("button");
         btn3.className = "btn btn-sm btn-outline-info";
         btn3.innerText = "打开消息面板";
-        btn3.onclick= function (){
+        btn3.onclick = function () {
             let height = window.screen.height;
-            window.open ("https://"+window.location.host+"/notification/regular", 'newwindow', 'height='+(height*0.7)+', width=510 ,top='+(height*0.10)+
+            window.open("https://" + window.location.host + "/notification/regular", 'newwindow', 'height=' + (height * 0.7) + ', width=510 ,top=' + (height * 0.10) +
                 'toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no');
         };
         div223.appendChild(btn3);
@@ -609,31 +636,46 @@ window.Header = function getHeader(object) {
         div.appendChild(div2);
         document.body.appendChild(div);
     }
+
     function createSetting() {
         _createSetting1();
         _createSetting2();
     }
+
     function bindGlobalEvent() {
         document.onkeydown = (e) => {
-            if (e.ctrlKey && e.keyCode===67)keyCode = true;
+            if (e.ctrlKey && e.keyCode === 67) keyCode = true;
         };
-        document.oncopy = (e)=>{
-            if (keyCode && settingInfo.isCopyNoWrap){
+        document.oncopy = (e) => {
+            if (keyCode && settingInfo.isCopyNoWrap) {
                 e.preventDefault();
                 let content = window.getSelection().toString();
-                e.clipboardData.setData("text", content.replace(/[\n\r]/g,' '));
+                e.clipboardData.setData("text", content.replace(/[\n\r]/g, ' '));
                 keyCode = false;
             }
         };
     }
+
     //初始化
-    this.init = function() {
-        if (!_isForbidDrag)repaintDom();
+    this.init = function () {
+        if (!_isForbidDrag) repaintDom();
         createHeader();
-        if (_before)createHeaderBefore();
+        if (_before) createHeaderBefore();
         createSetting();
         _exeHid([]);
         bindGlobalEvent();
-        _targetDom.style.width = _targetDom.offsetWidth+"px";
+        _targetDom.style.width = _targetDom.offsetWidth + "px";
     };
+
+    this.redrawHeader = function(column) {
+        _columns = column;
+        if (beforeHeaderDom) {
+            _targetDom.removeChild(beforeHeaderDom);
+        }
+        if (headerDom) {
+            _targetDom.removeChild(headerDom);
+        }
+        createHeader();
+        if (_before) createHeaderBefore();
+    }
 };

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
resources/sass/element/index.css


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

@@ -6,6 +6,7 @@
         <div style="@cannot('订单管理-问题件-客户不可见')min-width: 3000px;@else min-width: 1990px; @endcannot">
             <div id="list" class="d-none container-fluid">
                 <div id="form_div" style="min-width: 2250px;"></div>
+
                 <div class="form-inline mt-1" id="btn">
                     <span class="dropdown">
                         <button type="button"
@@ -918,7 +919,6 @@
                                         </td>
                                     </tr>
                                 </table>
-
                             </td>
                             <td>
                                 @can('订单管理-问题件-编辑')

+ 50 - 45
resources/views/order/workOrder/_issue_logs.blade.php

@@ -7,7 +7,6 @@
                     @click="showAddDiv('AddLog_'+item.order_issue.id)">新
             </button>
         </div>
-
         <div class="addLogDiv row m-0 p-0 form-group" style="display: none;"
              :id="'AddLog_'+item.order_issue.id">
             <input type="hidden" name="id" :value="item.order_issue.id">
@@ -26,56 +25,62 @@
                 <button type="button"
                         class="btn btn-primary ml-2 m-0 p-0"
                         style="width: 50px"
-                        @click="orderIssueVue.addOrderIssueLog('AddLog_'+item.order_issue.id,item.order_issue.id,item.issue_logs)">添加
+                        @click="orderIssueVue.addOrderIssueLog('AddLog_'+item.order_issue.id,item.order_issue.id,item.issue_logs)">
+                    添加
                 </button>
             </div>
         </div>
 
     @endcan
-    <template class="p-0 m-0" v-if="item.issue_logs && item.issue_logs.length > 0">
-        <table class="table table-sm p-0 m-0 " :id="'logs'+item.order_issue.id">
-            <tr class="align-center position-static"
-                v-for="(log,logIndex) in item.issue_logs"
-                @click="removeFocusing($event)" v-on:mouseover="showDelBtn($event)"
-                v-on:mouseleave="hideDelBtn($event)">
-                <template v-if="logIndex < 2|| item.order_issue.log_is_show === true">
-                    <td style="max-width: 175px;min-width: 175px;">
-                        <span v-text="log.content"></span>
-                    </td>
-                    <td class="text-muted" style="max-width: 55px;min-width: 55px;">
-                        <span v-if="log.user" v-text="log.user.name"></span>
-                    </td>
-                    <td class="text-muted" style="max-width: 95px;min-width: 95px;">
-                        <span v-text="log.created_at"></span>
-                    </td>
-                    @can('订单管理-问题件-处理结果删除')
-                        <td style="max-width: 35px;min-width: 35px;" class="m-0 p-0 border-0">
-                            <button type="button"
-                                    class="btn btn-sm btn-outline-danger m-0 del-btn invisible"
-                                    @click="orderIssueVue.destroyLog(log,item.issue_logs,logIndex)">
-                                删
-                            </button>
-                        </td>
-                        <td class="m-0 p-0 border-0">
-                            <button type="button"
-                                    class="btn btn-sm btn-outline-primary m-0 del-btn invisible"
-                                    v-show="Number(log.tag) !== 1"
-                                    @click="orderIssueVue.tagIssueLog(log)">标
-                            </button>
-                        </td>
-                    @endcan
-                </template>
-            </tr>
-        </table>
-        <div class="d-flex justify-content-center">
-            <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1 center-block"
-                    v-if="item.issue_logs.length > 2"
-                    @click="toggleLogs(item.order_issue,$event)">记录共@{{ item.issue_logs.length }}条,点击展开
-            </button>
-        </div>
+    <table class="table table-sm p-0 m-0 " :id="'logs'+item.order_issue.id"
+           v-if="item.issue_logs && item.issue_logs.length > 0">
+        <tr class="align-center position-static"
+            v-for="(log,logIndex) in item.issue_logs"
+            v-on:mouseover="showDelBtn($event)"
+            v-on:mouseleave="hideDelBtn($event)"
+            @click="removeFocusing($event)"
+            v-show=" showOrderIssueProcessLog===item.id || logIndex < 2 "
+        >
+            <td style="max-width: 175px;min-width: 175px;">
+                <span v-text="log.content"></span>
+            </td>
+            <td class="text-muted" style="max-width: 55px;min-width: 55px;">
+                <span v-if="log.user" v-text="log.user.name"></span>
+            </td>
+            <td class="text-muted" style="max-width: 95px;min-width: 95px;">
+                <span v-text="log.created_at"></span>
+            </td>
+            @can('订单管理-问题件-处理结果删除')
+                <td style="max-width: 35px;min-width: 35px;" class="m-0 p-0 border-0">
+                    <button type="button"
+                            class="btn btn-sm btn-outline-danger m-0 del-btn invisible"
+                            @click="orderIssueVue.destroyLog(log,item.issue_logs,logIndex)">
+                        删
+                    </button>
+                </td>
+                <td class="m-0 p-0 border-0">
+                    <button type="button"
+                            class="btn btn-sm btn-outline-primary m-0 del-btn invisible"
+                            v-show="Number(log.tag) !== 1"
+                            @click="orderIssueVue.tagIssueLog(log)">标
+                    </button>
+                </td>
+            @endcan
+        </tr>
+    </table>
+    <div v-if="item.issue_logs.length === 0" class="w-auto h-50">
+    </div>
+    <div class="d-flex justify-content-center">
+        <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1 center-block"
+                v-show="showOrderIssueProcessLog !== item.id"
+                @click="showOrderIssueProcessLog = item.id">记录共@{{ item.issue_logs.length }}条,点击展开
+        </button>
+        <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1 center-block"
+                v-show="showOrderIssueProcessLog === item.id"
+                @click="showOrderIssueProcessLog = null">点击收起
+        </button>
 
-    </template>
-    <div v-else class="w-auto h-50">
     </div>
+
 </div>
 

+ 32 - 26
resources/views/order/workOrder/_process_logs.blade.php

@@ -1,5 +1,7 @@
 <div>
-    @can('订单管理-工单处理-承运商编辑')
+    @if( \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') ||
+            \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑') ||
+             \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-承运商编辑'))
     <div class="add-btn"
          style="position: absolute;display: none;margin-top: -35px;z-index: 51"
          :id="'AddProcessLogBtn'+item.pending_detail.id">
@@ -24,40 +26,44 @@
             </button>
         </div>
     </div>
-    @endcan
+    @endif
     <template class="p-0 m-0" v-if="item.process_logs.length > 0">
         <table class="table table-sm p-0 m-0 " :id="'logs'+item.pending_detail.id">
             <tr class="align-center position-static"
                 v-for="(log,logIndex) in item.process_logs"
-                @click="removeFocusing($event)" v-on:mouseover="showDelBtn($event)"
-                v-on:mouseleave="hideDelBtn($event)">
-                <template v-if="logIndex < 2|| item.log_is_show === true">
-                    <td style="max-width: 175px;min-width: 175px;">
-                        <span v-text="log.content"></span>
-                    </td>
-                    <td class="text-muted" style="max-width: 55px;min-width: 55px;">
-                        <span v-if="log.user" v-text="log.user.name"></span>
-                    </td>
-                    <td class="text-muted" style="max-width: 95px;min-width: 95px;">
-                        <span v-text="log.created_at"></span>
-                    </td>
-                    @can('订单管理-工单处理-承运商编辑')
-                    <td style="max-width: 35px;min-width: 35px;" class="m-0 p-0 border-0">
-                        <button type="button"
-                                class="btn btn-sm btn-outline-danger m-0 del-btn invisible"
-                                @click="destroyProcessLog(item,log,logIndex)">
-                            
-                        </button>
-                    </td>
-                    @endcan
-                </template>
+                v-on:mouseover="showDelBtn($event)"
+                v-on:mouseleave="hideDelBtn($event)"
+                @click="removeFocusing($event)"
+                v-show="showWorkOrderProcessLog === item.id || logIndex<2">
+                <td style="max-width: 175px;min-width: 175px;">
+                    <span v-text="log.content"></span>
+                </td>
+                <td class="text-muted" style="max-width: 55px;min-width: 55px;">
+                    <span v-if="log.user" v-text="log.user.name"></span>
+                </td>
+                <td class="text-muted" style="max-width: 150px;min-width: 150px;">
+                    <span v-text="log.created_at"></span>
+                </td>
+                @if( \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') || \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑') )
+                <td style="max-width: 35px;min-width: 35px;" class="m-0 p-0 border-0">
+                    <button type="button"
+                            class="btn btn-sm btn-outline-danger m-0 del-btn invisible"
+                            @click="destroyProcessLog(item,log,logIndex)">
+                        
+                    </button>
+                </td>
+                @endif
             </tr>
         </table>
         <div class="d-flex justify-content-center">
             <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1 center-block"
-                    v-if="item.process_logs.length > 2"
-                    @click="toggleWorkOrderLogs(item,$event)"
+                    v-if="item.process_logs.length > 2 && showWorkOrderProcessLog !== item.id"
+                    @click="showWorkOrderProcessLog = item.id"
                     v-text="'记录共'+item.process_logs.length +'条,点击展开'"></button>
+
+            <button type="button" class="btn btn-sm btn-outline-primary align-middle mt-1 center-block"
+                    v-show="showWorkOrderProcessLog === item.id"
+                    @click="showWorkOrderProcessLog = null">点击收起</button>
         </div>
 
     </template>

+ 40 - 0
resources/views/order/workOrder/_rejected_item_equals_order_commodity.blade.php

@@ -0,0 +1,40 @@
+<el-dialog :visible.sync="dialogCommoditiesEqualsVisible" width="75%">
+    <table class="table table-bordered table-sm">
+        <tr class="text-center">
+           <th colspan="3" class="bg-light-info" style="width: 600px">
+               订单商品信息
+           </th>
+           <th colspan="3" class="bg-light-khaki" style="width: 600px">
+               退回商品信息
+           </th>
+        </tr>
+        <tr>
+            <th class="bg-light-info">商品条码</th>
+            <th class="bg-light-info">商品名</th>
+            <th class="bg-light-info">数量</th>
+            <th class="bg-light-khaki">商品条码</th>
+            <th class="bg-light-khaki">商品名</th>
+            <th class="bg-light-khaki">数量</th>
+        </tr>
+        <tr v-for="item in commodityEqualsMap">
+            <td class="bg-light-info" v-text="item.order_commodity_sku"></td>
+            <td class="bg-light-info" v-text="item.order_commodity_name"></td>
+            <td class="bg-light-info" v-text="item.order_commodity_amount"></td>
+            <td class="bg-light-khaki" v-text="item.rejected_item_sku"></td>
+            <td class="bg-light-khaki" v-text="item.rejected_item_name"></td>
+            <td class="bg-light-khaki">
+                <div v-for="item_quality_label in item.rejected_item_quality_label">
+                    <span class="badge badge-primary"
+                        v-show="item_quality_label.quality_label === '正品'" v-text="'正品数量:' + item_quality_label.amount"></span>
+                    <span class="badge badge-danger"
+                        v-show="item_quality_label.quality_label === '次品'" v-text="'次品数量' + item_quality_label.amount"></span>
+                    <span class="badge badge-secondary"
+                        v-show="item_quality_label.quality_label === '未知'" v-text="'未知数量' + item_quality_label.amount"></span>
+                </div>
+            </td>
+        </tr>
+    </table>
+    <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogCommoditiesEqualsVisible = false">关 闭</el-button>
+    </div>
+</el-dialog>

+ 455 - 101
resources/views/order/workOrder/index.blade.php

@@ -1,8 +1,7 @@
 @extends("layouts.app")
 @section('title','处理工单')
 @section('head')
-    <link href="{{ mix('css/element-ui.css') }}" rel="stylesheet">
-    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
+    <link href="{{ asset('css/element-ui.css') }}" rel="stylesheet">
 @endsection
 
 @section("content")
@@ -11,6 +10,16 @@
             <div class="">
                 <div id="form_div" style="min-width: 1220px;"></div>
                 <div class="ml-3 form-inline" id="btn">
+                     <span class="dropdown">
+                        <button type="button"
+                                class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
+                                data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">导出Excel
+                        </button>
+                        <div class="dropdown-menu">
+                            <a class="dropdown-item" href="javascript:" @click="workOrderExport(false)">导出勾选内容</a>
+                            <a class="dropdown-item" href="javascript:" @click="workOrderExport(true)">导出所有页</a>
+                        </div>
+                    </span>
                     @can('订单管理-订单问题件生成')
                         <button type="button"
                                 class="ml-2 btn  btn-sm btn-outline-dark "
@@ -34,13 +43,13 @@
                     @if(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') || \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-承运商编辑'))
                         <button type="button"
                                 class="ml-1 btn btn-outline-primary btn-sm"
-                                @click="showBatchStoreProcessLogs">批量处理日志
+                                @click="showBatchStoreProcessLogs">工单批量处理日志
                         </button>
                     @endif
                     @can('订单管理-问题件-编辑')
                         <button type="button"
                                 class="ml-1 btn btn-outline-dark btn-sm"
-                                @click="showBatchEditOrderIssueLog">批量处理说明
+                                @click="showBatchEditOrderIssueLog">问题件批量处理日志
                         </button>
                     @endcan
 
@@ -77,11 +86,12 @@
 
                                     <template>
                                         <span class="badge badge-success" v-show="isLogisticHandler(item)">承</span>
-                                        <span v-show="item.order_detail && ['有','已处理'].includes(item.order_detail.is_new_rejecting)"
+                                        <span
+                                            v-show="item.order_detail && ['有','已处理'].includes(item.order_detail.is_new_rejecting)"
                                             class="badge badge-primary">退</span>
                                     </template>
 
-                                    <template >
+                                    <template>
                                         <br v-show="item.is_issue_order">
                                         <a :href="'{{url("order/issue/index")}}'+'?is_handle=ture&orderCode='+item.orderno"
                                            v-show="item.is_issue_order"
@@ -93,7 +103,7 @@
                                     <template v-show="item.order_detail">
                                         <br>
                                         <span class="badge  badge-light"
-                                            v-text="item.order_detail ? item.order_detail.rejecting_status : ''"></span>
+                                              v-text="item.order_detail ? item.order_detail.rejecting_status : ''"></span>
                                     </template>
                                 </td>
                                 <td>
@@ -106,6 +116,10 @@
                                     <button class="btn btn-sm btn-outline-secondary"
                                             @click="showOrderCommoditiesInfo(item)">商品详情
                                     </button>
+                                    <br>
+                                    <button class="btn btn-sm btn-outline-secondary" @click="getEqualsMap(item)">
+                                        商品比较
+                                    </button>
                                 </td>
                                 <td>
                                     @can('订单管理-订单问题件生成')
@@ -188,6 +202,7 @@
                                         </button>
                                     @endcan
                                 </td>
+                                <td v-text="item.created_at"></td>
                                 <td>
                                     <span v-text="item.issue_type_name"></span>
                                 </td>
@@ -205,12 +220,20 @@
                                         <span v-text="logistic_number"></span>
                                     </div>
                                 </td>
-
-                                <td v-text="item.created_at"></td>
                                 <td v-text="item.status"></td>
                                 <td v-text="item.creator ? item.creator.name : ''"></td>
                                 <td v-text="item.result_explain ? item.result_explain: item.remark"></td>
-                                <td class="text-muted child-layer-3-hide" >
+                                <td class="p-0 m-0 w-50" style="width:30px;" v-if="i===0"
+                                    :rowspan="workOrders.length">
+                                    <span class="btn"
+                                          style="max-width: 50px"
+                                          :class="hideRejectedBills ? 'btn-outline-secondary':'btn-outline-info'"
+                                          @click="toggleRejectedBill()" :style="{'min-height':toggleBtnHeight+'px'}"
+                                          v-text="hideRejectedBills ? '展开运单列' : '隐藏运单列'">
+                                    </span>
+                                </td>
+
+                                <td class="text-muted child-layer-3-hide" v-if="!hideRejectedBills">
                                     <div class="form-inline">
                                         <div class="form-group">
                                             <input type="text" class="form-control form-text form-control-sm mr-1">
@@ -225,17 +248,64 @@
                                              v-for="relation in item.order_issue_rejected_bills">
                                             <input type="text" class="form-control form-control-sm mt-1 mr-1"
                                                    :value="relation.logistic_number_return"
-{{--                                                       @change="reviseJoinRejectedBill(item,orderIssueRejectedBill.logistic_number_return,$event)"--}}
                                                    @focus="displayDelBtn(true,$event)"
                                                    @blur="displayDelBtn(false,$event)">
                                             <button type="button" class="btn btn-sm btn-outline-danger mt-1 d-none"
-                                                    @click="unJoinLogisticNumberReturn(item,relation.logistic_number_return,i)"
-                                            >
+                                                    @click="unJoinLogisticNumberReturn(item,relation.logistic_number_return,i)">
                                             </button>
                                         </div>
                                     </div>
                                 </td>
+                                @if( \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') || \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑') )
+                                    <td class="p-0 child-layer-3-hide align-center" v-if="!hideRejectedBills">
+                                        <div class="m-0 p-0" v-if="item.rejected_bill_items">
+                                            <table class="table table-sm m-0" v-show="showRejectedBillItem === item.id">
+                                                <tr v-for="rejected_bill_item in item.rejected_bill_items">
+                                                    <td class="w-50">
+                                                        <span v-text="rejected_bill_item.barcode_goods"></span>
+                                                    </td>
+                                                    <td>
+                                                        <p class="text-truncate text-primary m-0 p-0 tooltipTarget"
+                                                           style="width: 100px;cursor:pointer;text-decoration: underline"
+                                                           title="双击展开"
+                                                           @dblclick="nowrapText($event)"
+                                                           v-text="rejected_bill_item.name_goods"></p>
+                                                        <p class="text-nowrap m-0 p-0 tooltipTarget"
+                                                           style="display: none;cursor:pointer"
+                                                           title="双击收起"
+                                                           @dblclick="truncateText($event)"
+                                                           v-text="rejected_bill_item.name_goods"></p>
+                                                    </td>
+                                                    <td class="w-25">
+                                                        <span v-text="rejected_bill_item.amount"></span>
+                                                    </td>
+                                                    <td class="w-25">
+                                                        <span v-text="rejected_bill_item.quality_label"></span>
+                                                    </td>
+                                                    <td class="w-auto">
+                                                        <span v-text="rejected_bill_item.remark"></span>
+                                                    </td>
+                                                </tr>
+                                            </table>
+                                            <div class="text-center" v-show="item.rejected_bill_item_amount_count > 0">
+                                                <button type="button"
+                                                        class="btn btn-sm btn-outline-primary align-middle mt-1"
+                                                        v-show="showRejectedBillItem !== item.id"
+                                                        @click="showRejectedBillItem = item.id"
+                                                        v-text="'商品' + item.rejected_bill_item_amount_count + '件,点击展开'">
+                                                </button>
+                                                <button type="button"
+                                                        class="btn btn-sm btn-outline-primary align-middle mt-1"
+                                                        v-show="showRejectedBillItem === item.id"
+                                                        @click="showRejectedBillItem = null">
+                                                    点击收起
+                                                </button>
+                                            </div>
+                                        </div>
+                                    </td>
+                                @endif
+
 
                                 <td class="log-td"
                                     v-on:mouseover="showAddBtn($event)"
@@ -249,10 +319,72 @@
                                         @include('order.workOrder._issue_logs')
                                     </td>
                                 @endcan
-                                <td class="container">
+                                @can('订单管理-工单处理-宝时编辑')
+                                    <td>
+                                        <input type="number" class="form-control form-control-sm"
+                                               v-model="item.logistic_indemnity_money"
+                                               @change="changeWorkOrderInfo(item,'logistic_indemnity_money',$event)">
+                                    </td>
+                                    <td>
+                                        <select class="form-control form-control-sm"
+                                                v-model="item.logistic_express_remission"
+                                                @change="changeWorkOrderInfo(item,'logistic_express_remission',$event)">
+                                            <option v-for="type in workOrderRemissionType" :value="type.name"
+                                                    v-text="type.name"></option>
+                                        </select>
+                                    </td>
+                                    <td>
+                                        <input type="number" class="form-control form-control-sm"
+                                               v-model="item.bao_shi_indemnity_money"
+                                               @change="changeWorkOrderInfo(item,'bao_shi_indemnity_money',$event)">
+                                    </td>
+                                    <td>
+                                        <select
+                                            class="form-control form-control-sm"
+                                            v-model="item.bao_shi_express_remission"
+                                            @change="changeWorkOrderInfo(item,'bao_shi_express_remission',$event)">
+                                            <option v-for="type in workOrderRemissionType" :value="type.name"
+                                                    v-text="type.name"></option>
+                                        </select>
+                                    </td>
+
+                                    <td>
+                                        <table class="table table-sm">
+                                            <tr>
+                                                <td>
+                                                    <select class="form-control form-control-sm"
+                                                            @change="createUserWorkGroup(item,$event)">
+                                                        <option value=""></option>
+                                                        <option v-for="data in userWorkgroup" :value="data.name"
+                                                                v-text="data.value"></option>
+                                                    </select>
+                                                </td>
+                                            </tr>
+                                            <tr v-for="(user_workgroup,index) in item.user_work_groups">
+                                                <td>
+                                                    <span v-text="user_workgroup.name"></span>
+                                                    <button class="btn btn-sm btn-outline-danger float-right"
+                                                            @click="destroyUserWorkGroup(item,index,$event)">删
+                                                    </button>
+                                                </td>
+                                            </tr>
+                                        </table>
+
+
+                                    </td>
+                                    <td>
+                                        <select class="form-control form-control-sm"
+                                                v-model="item.user_owner_group_id"
+                                                @change="changeUserOwnerGroup(item,$event)">
+                                            <option v-for="data in userOwnerGroup" :value="data.name"
+                                                    v-text="data.value"></option>
+                                        </select>
+                                    </td>
+                                @endcan
+                                <td class="container" style="min-width: 500px">
                                     <div class="row">
                                         @can('订单管理-工单处理-删除')
-                                            <div class="col-1 ">
+                                            <div class="col-2 ">
                                                 <div class="header-alert">
                                                     <button type="button"
                                                             class="btn btn-sm btn-outline-danger"
@@ -262,16 +394,13 @@
                                                 </div>
                                             </div>
                                         @endcan
-                                        <div class="col-6 m-0 ">
+                                        <div class="col-10 m-0 ">
                                             @include('order.workOrder._work_order_details')
                                         </div>
-                                        <div @can('订单管理-工单处理-删除') class="col-5 m-0"
-                                             @else class="col-6 p-0" @endcan>
-                                            @include('order.workOrder._work_order_log')
-                                        </div>
                                     </div>
-
                                 </td>
+
+                            </tr>
                         </template>
                         </tbody>
                     </table>
@@ -279,9 +408,6 @@
                     {{ $workOrders->withQueryString()->links() }}
                 </div>
             </div>
-            @can('订单管理-工单处理-审核')
-                {{--                @include('order.workOrder._edit_issue_type')--}}
-            @endcan
         </div>
         <div class="row">
             @include('order.workOrder._work_order_show')
@@ -294,6 +420,7 @@
         @include('order.workOrder._edit_order_issue_log')
         @include('order.workOrder._edit_process_log')
         @include('order.workOrder._order_commodity_info')
+        @include('order.workOrder._rejected_item_equals_order_commodity')
     </div>
 @endsection()
 
@@ -301,7 +428,8 @@
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/element-ui.js') }}"></script>
-    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
+    <script type="text/javascript" src="{{asset('js/element/index.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
 
     <style>
         .fade-enter-active {
@@ -426,6 +554,20 @@
                     },
                     @endforeach
                 ],
+                userWorkgroup: [
+                        @foreach($userWorkgroup as $item)
+                    {
+                        name: '{{$item->id}}', value: '{{$item->name}}'
+                    },
+                    @endforeach
+                ],
+                userOwnerGroup: [
+                        @foreach($userOwnerGroup as $item)
+                    {
+                        name: '{{$item->id}}', value: '{{$item->name}}'
+                    },
+                    @endforeach
+                ],
                 logisticEditWorkOrder: {
                     id: null,
                     issue_type_name: null,
@@ -507,12 +649,16 @@
                 dialogBatchEditOrderIssueLogVisible: false,  // 问题件日志
                 dialogProcessLogVisible: false,              // 工单处理日志
                 dialogOrderCommoditiesVisible: false,              // 订单商品详情
+                dialogCommoditiesEqualsVisible: false,       // 商品对比
 
                 showProcessLogId: null,         // workOrder->id
                 showAddDetailProcessLog: null,        // workOrderDetail->ids
                 showAddProcessLogFrom: null,     //
                 showAddProcessLogBtn: null,
+                showWorkOrderProcessLog: null,
+                showOrderIssueProcessLog: null,
 
+                showRejectedBillItem: null,          // 退回商品详情
                 batchHandlerWorkOrder: {
                     issue_type_name: '',
                     process_progress: '',
@@ -526,7 +672,23 @@
                 orderInfo: {
                     commodities: [],
                 },
-                order_info_commodities_key:101,
+                order_info_commodities_key: 101,
+                workOrderRemissionType: [
+                    {name: '原单减免', value: '原单减免'},
+                    {name: '补发减免', value: '补发减免'},
+                    {name: '全部减免', value: '全部减免'},
+                ],
+                rejectingStatus: [
+                    {name: '无', value: '无'},
+                    {name: '未退回', value: '未退回'},
+                    {name: '全部退回', value: '全部退回'},
+                    {name: '部分退回', value: '部分退回'},
+                    {name: '差异退回', value: '差异退回'},
+                ],
+                commodityEqualsMap: [],
+                hideRejectedBills: true,
+                tableHeader:null,
+                toggleBtnHeight:0,
             },
             computed: {},
             mounted() {
@@ -614,6 +776,28 @@
                         ]
                     },
                     {name: 'is_end', type: 'checkbox', tip: '是否已拦截', data: [{name: 'ture', value: '已完成'}]},
+                ], [
+                    {name: 'logistic_indemnity_money', type: 'input', placeholder: '承运商赔偿金额'},
+                    {
+                        name: 'logistic_express_remission',
+                        type: 'select',
+                        placeholder: '承运商快递减免',
+                        data: this.workOrderRemissionType
+                    },
+                    {name: 'bao_shi_indemnity_money', type: 'input', placeholder: '宝时赔偿金额'},
+                    {
+                        name: 'bao_shi_express_remission',
+                        type: 'select',
+                        placeholder: '宝时快递减免',
+                        data: this.workOrderRemissionType
+                    },
+                    {
+                        name: 'user_work_group_id', type: 'select_multiple_select',
+                        tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的仓库责任方'],
+                        placeholder: ['仓库责任方', '定位或多选仓库责任方'], data: this.userWorkgroup
+                    },
+                    {name: 'user_owner_group_id', type: 'select', placeholder: '项目责任方', data: this.userOwnerGroup},
+                    {name: 'rejecting_status', type: 'select', placeholder: '退回状态', data: this.rejectingStatus},
                 ], [
                     {name: 'order_issue_log', type: 'input', placeholder: '问题件处理日志'},
                     {
@@ -641,6 +825,17 @@
                     },
                     {name: 'shop_name', type: 'input', placeholder: '商铺名'},
                     {name: 'work_order_process_log', type: 'input', placeholder: '工单处理日志'},
+                    {
+                        name: "rejectingStatus", type: 'select', placeholder: '退单状态',
+                        data: [
+                            {name: '无', value: '无'},
+                            {name: '未退回', value: '未退回'},
+                            {name: '全部退回', value: '全部退回'},
+                            {name: '部分退回', value: '部分退回'},
+                            {name: '差异退回', value: '差异退回'},
+                            {name: '超量退回', value: '超量退回'},
+                        ]
+                    }
                 ]];
                 this.form = new query({
                     el: '#form_div',
@@ -648,51 +843,7 @@
                     appendDom: "btn",
                 });
                 this.form.init();
-                let column = [
-                    {name: 'id', value: '工单号', neglect: true},
-                    {name: 'operation', value: '操作', neglect: true},
-                    {name: 'work_type', value: '工单类型', neglect: true},
-                    {name: 'process_progress', value: '当前进度', neglect: true},
-                    {name: 'owner', value: '客户', neglect: true},
-                    {name: 'shop_name', value: '店铺名称'},
-                    {name: 'client_no', value: '客户订单号'},
-                    {name: 'logistic_name', value: '承运人'},
-                    {name: 'logistic_numbers', value: '快递单号'},
-                    {name: 'created_at', value: '创建时间', neglect: true},
-                    {name: 'status', value: '当前处理人', neglect: true},
-                    {name: 'creator', value: '创建人'},
-                    {name: 'remark', value: '情况说明'},
-                    {name: 'return_logistic_number', value: '退回单号'},
-                    {name: 'process_logs', value: '处理日志'},
-                        @can('订单管理-工单处理-宝时编辑')
-                    {
-                        name: 'order_issue_log', value: '处理结果'
-                    },
-                        @endcan
-                    {
-                        name: 'ab_operation', type: 'multi', title: "其他操作", rows: [
-                                @can('订单管理-工单处理-删除')
-                            {
-                                value: "删除", col: "1"
-                            },
-                            {value: "查看资料", col: "6"},
-                            {value: "处理日志", col: "5"},
-                                @else
-                            {
-                                value: "查看资料", col: "6"
-                            },
-                            {value: "处理日志", col: "6"},
-                            @endcan
-                        ], neglect: true
-                    },
-                ];
-                new Header({
-                    el: "table",
-                    name: "work_orders",
-                    column: column,
-                    data: this.workOrders,
-                    fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
-                }).init();
+                this.initTableHeader();
             },
             created() {
                 this.workOrders.forEach(item => {
@@ -718,6 +869,18 @@
                 },
             },
             methods: {
+                initTableHeader(){
+                    let column = this.headerColumn();
+                    this.tableHeader = new Header({
+                        el: "table",
+                        name: "work_orders",
+                        column: column,
+                        data: this.workOrders,
+                        fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
+                    });
+                    this.tableHeader.init();
+                    this.toggleBtnHeight = document.getElementById('table').clientHeight;
+                },
                 waitingTempTip(message) {
                     window.tempTip.setIndex(2005);
                     window.tempTip.waitingTip(message);
@@ -779,15 +942,6 @@
                         $(e.target).text("记录共" + orderIssue.logs.length + "条,点击展开");
                     }
                 },
-                toggleWorkOrderLogs(item, e, index) {
-                    if (item.log_is_show === false) {
-                        item.log_is_show = true;
-                        $(e.target).text('点击收起');
-                    } else {
-                        item.log_is_show = false;
-                        $(e.target).text("记录共" + item.process_logs.length + "条,点击展开");
-                    }
-                },
                 sortOrder(workOrder) {
                     workOrder.last_handler_name = workOrder.last_handler ? workOrder.last_handler.name : '';
                     workOrder.detail_infos = this.groupDetails(workOrder);                          // 工单详情
@@ -811,6 +965,23 @@
                     workOrder.order_commodities = this.groupOrderPackageCommodities(workOrder);
                     workOrder.is_issue_order = workOrder.order_issue !== null;
                     if (workOrder.order_issue !== null) workOrder.order_issue.log_is_show = 'order_issue' in workOrder;
+                    let rejected_bill_items = this.groupRejectedBillItems(workOrder);
+                    workOrder.rejected_bill_items = rejected_bill_items;
+                    workOrder.rejected_bill_item_amount_count = rejected_bill_items ? rejected_bill_items.map(e => Number(e.amount)).reduce((a, b) => Number(a) + Number(b), 0) : 0;
+                },
+                groupRejectedBillItems(workOrder) {
+                    let {order_issue_rejected_bills} = workOrder;
+                    if (!order_issue_rejected_bills) return [];
+                    return order_issue_rejected_bills.map(e => e.rejected_bill).filter(e => e).map(e => e.items).reduce((a, b) => a.concat(b), [])
+                        .map(e => {
+                            return {
+                                amount: e.amount,
+                                quality_label: e.quality_label,
+                                barcode_goods: e.barcode_goods,
+                                name_goods: e.name_goods,
+                                remark: e.remark,
+                            }
+                        });
                 },
                 groupOrderPackageCommodities(workOrder) {
                     let order_packages = workOrder.order ? workOrder.order.packages : [];
@@ -1929,7 +2100,7 @@
                 getLogisticCheckResult() {
                     let {issue_type_name} = this.logisticEditWorkOrder;
                     let items = [
-                        {issue_type_name: '快递异常', option: ['已处理', '已拦截']},
+                        {issue_type_name: '快递异常', option: ['已签收', '拦截退回']},
                         {issue_type_name: '破损', option: ['核实全部破损', '核实部分破损', '核实未破损']},
                     ];
                     let item = items.find(e => e.issue_type_name === issue_type_name);
@@ -1978,7 +2149,7 @@
                 canTagWorkOrder(item) {
                     let {pending_detail, status, issue_type_name} = item;
                     if (status !== '承运商处理') return false;
-                    if (!['拦截', '取消拦截', '信息更改'].includes(issue_type_name)) return false;
+                    if (!['拦截', '取消拦截', '信息更改', '快递异常'].includes(issue_type_name)) return false;
                     let {logistic_handle_tag} = pending_detail;
                     return logistic_handle_tag !== '承运商处理中';
                 },
@@ -3318,54 +3489,237 @@
                         }, 100);
                     }
                 },
-
-                joinLogisticNumberReturn(item,e,index){
+                nowrapText(e) {
+                    let truncateSpan = $(e.target);
+                    truncateSpan.hide();
+                    truncateSpan.siblings('.text-nowrap').show();
+                },
+                truncateText(e) {
+                    let nowrapSpan = $(e.target);
+                    nowrapSpan.hide();
+                    nowrapSpan.siblings('.text-truncate').show();
+                },
+                joinLogisticNumberReturn(item, e, index) {
                     let logistic_number_return = $(e.target).prev().val();
-                    if (logistic_number_return.trim().length === 0){
+                    if (logistic_number_return.trim().length === 0) {
                         this.errorTempTip('请输入退回单号进行添加');
                         return;
                     }
                     let url = "{{route('workOrder.rejectedBill.storeApi')}}";
-                    let data = {order_id:item.order_id,logistic_number_return:logistic_number_return};
+                    let data = {order_id: item.order_id, logistic_number_return: logistic_number_return};
                     this.waitingTempTip('处理中');
-                    window.axios.post(url,data).then(res=>{
+                    window.axios.post(url, data).then(res => {
                         window.tempTip.cancelWaitingTip();
-                        if (res.data.success){
+                        if (res.data.success) {
                             this.sortOrder(res.data.data);
-                            this.$set(this.workOrders,index,res.data.data);
+                            this.$set(this.workOrders, index, res.data.data);
                             this.successTempTip('处理完成');
                             this.$forceUpdate();
                             $(e.target).prev().val('');
-                            return ;
+                            return;
                         }
-                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常' )
-                    }).catch(err=>{
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常')
+                    }).catch(err => {
                         window.tempTip.cancelWaitingTip();
                         this.errorTempTip(err);
                     });
                 },
-                unJoinLogisticNumberReturn(item,logistic_number_return,index){
-                    if (logistic_number_return.trim().length === 0){
+                unJoinLogisticNumberReturn(item, logistic_number_return, index) {
+                    if (logistic_number_return.trim().length === 0) {
                         this.errorTempTip('请输入退回单号进行添加');
                         return;
                     }
                     let url = "{{route('workOrder.rejectedBill.destroyApi')}}";
-                    let data = {order_id:item.order_id,logistic_number_return:logistic_number_return};
+                    let data = {order_id: item.order_id, logistic_number_return: logistic_number_return};
                     this.waitingTempTip('处理中');
-                    window.axios.post(url,data).then(res=>{
+                    window.axios.post(url, data).then(res => {
                         window.tempTip.cancelWaitingTip();
-                        if (res.data.success){
+                        if (res.data.success) {
                             this.sortOrder(res.data.data);
-                            this.$set(this.workOrders,index,res.data.data);
+                            this.$set(this.workOrders, index, res.data.data);
                             this.successTempTip('处理完成');
                             this.$forceUpdate();
-                            return ;
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常')
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                changeWorkOrderInfo(item, column, e) {
+                    let url = "{{route('workOrder.updateRemissionApi')}}";
+                    let data = {
+                        id: item.id,
+                        column: column,
+                        value: $(e.target).val(),
+                    };
+                    this.waitingTempTip('处理中');
+                    axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            item[column] = $(e.target).val();
+                            this.successTempTip('处理完成');
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新重试');
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    });
+                },
+                changeUserOwnerGroup(item, e) {
+                    let url = "{{route('workOrder.userOwnerGroup.updateApi')}}";
+                    let data = {
+                        id: item.id,
+                        user_owner_group_id: $(e.target).val(),
+                    };
+                    this.waitingTempTip('处理中');
+                    axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            item.user_work_group_id = $(e.target).val();
+                            this.successTempTip('处理完成');
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新后重试');
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    })
+                },
+                createUserWorkGroup(item, e) {
+                    let url = "{{route('workOrder.userWorkGroups.storeApi')}}";
+                    let data = {
+                        id: item.id,
+                        user_workgroup_id: $(e.target).val(),
+                    };
+                    this.waitingTempTip('处理中');
+                    axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.successTempTip('处理完成');
+                            item.user_work_groups = res.data.data;
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新后重试');
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    })
+                },
+                destroyUserWorkGroup(item, index, e) {
+                    if (!confirm('确认删除?')) return;
+                    let url = "{{route('workOrder.userWorkGroups.destroyApi')}}";
+                    let data = {
+                        id: item.id,
+                        user_workgroup_id: $(e.target).val(),
+                    };
+                    this.waitingTempTip('处理中');
+                    axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.successTempTip('处理完成');
+                            item.user_work_groups.splice(index, 1);
+                            return;
                         }
-                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常' )
-                    }).catch(err=>{
+                        this.errorTempTip(res.data.message ? res.data.message : '处理出现异常,刷新后重试');
+                    }).catch(err => {
+                        window.tempTip.cancelWaitingTip();
+                        this.errorTempTip(err);
+                    })
+                },
+                getEqualsMap(item) {
+                    let order_detail_id = item.pending_detail.id;
+                    let url = "{{route('workOrder.commodity.equalsMapApi')}}";
+                    let data = {
+                        id: order_detail_id,
+                    }
+                    this.waitingTempTip('获取中..');
+                    axios.post(url, data).then(res => {
+                        window.tempTip.cancelWaitingTip();
+                        if (res.data.success) {
+                            this.commodityEqualsMap = res.data.data;
+                            this.dialogCommoditiesEqualsVisible = true;
+                            return;
+                        }
+                        this.errorTempTip(res.data.message ? res.data.message : '获取失败');
+                    }).catch(err => {
                         window.tempTip.cancelWaitingTip();
                         this.errorTempTip(err);
                     });
+                },
+                workOrderExport(sign) {
+                    let url = '{{route('workOrder.exportApi')}}';
+                    let token = '{{ csrf_token() }}';
+                    if (sign) {
+                        excelExport(true, checkData, url, this.total, token);
+                    } else {
+                        excelExport(false, checkData, url, null, token);
+                    }
+                },
+                toggleRejectedBill() {
+                    this.hideRejectedBills = !this.hideRejectedBills;
+                    if(this.tableHeader !== null){
+                        let column = this.headerColumn();
+                        this.tableHeader.redrawHeader(column);
+                    }
+                },
+                headerColumn() {
+                    let columns = [];
+                    columns.push({name: 'id', value: '工单号', neglect: true},
+                        {name: 'operation', value: '操作', neglect: true},
+                        {name: 'created_at', value: '创建时间', neglect: true},
+                        {name: 'work_type', value: '工单类型', neglect: true},
+                        {name: 'process_progress', value: '当前进度', neglect: true},
+                        {name: 'owner', value: '客户', neglect: true},
+                        {name: 'shop_name', value: '店铺名称'},
+                        {name: 'client_no', value: '客户订单号'},
+                        {name: 'logistic_name', value: '承运人'},
+                        {name: 'logistic_numbers', value: '快递单号'},
+                        {name: 'status', value: '当前处理人', neglect: true},
+                        {name: 'creator', value: '创建人'},
+                        {name: 'remark', value: '情况说明'},
+                        {name: 'rejectedBills', value: '展开',neglect: true,max_width:30},)
+                    if (!this.hideRejectedBills) {
+                        columns.push({name: 'return_logistic_number', value: '退回单号'});
+                        @if( \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') || \Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑') )
+                        columns.push({name: 'rejected_bills_items', value: '退回商品详情'});
+                        @endif
+                    }
+                    columns.push({
+                            name: 'process_logs', value: '处理日志'
+                        },
+                            @can('订单管理-工单处理-宝时编辑')
+                        {
+                            name: 'order_issue_log', value: '问题件处理结果'
+                        },
+                            @endcan
+                            @can('订单管理-工单处理-宝时编辑')
+                        {
+                            name: 'logistic_indemnity_money', value: '承运商赔偿金额'
+                        },
+                        {name: 'logistic_express_remission', value: '承运商快递减免'},
+                        {name: 'bao_shi_indemnity_money', value: '宝时赔偿金额'},
+                        {name: 'bao_shi_express_remission', value: '宝时快递减免'},
+                        {name: 'user_work_groups', value: '仓库组责任方'},
+                        {name: 'user_owner_group', value: '项目组责任方'},
+                            @endcan
+                        {
+                            name: 'ab_operation', type: 'multi', title: "其他操作", rows: [
+                                    @can('订单管理-工单处理-删除')
+                                {
+                                    value: "删除", col: "2"
+                                },
+                                {value: "查看资料", col: "10"},
+                                    @else
+                                {
+                                    value: "查看资料", col: "12"
+                                },
+                                @endcan
+                            ], neglect: true
+                        },);
+                    return columns;
                 }
             },
         });

+ 2 - 2
resources/views/store/receivingTasks/create.blade.php

@@ -2,7 +2,7 @@
 @section('title')开单入库-创建@endsection
 @section('head')
     <link href="{{ mix('css/element-ui.css') }}" rel="stylesheet">
-    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
+    <link rel="stylesheet" href="{{ mix('css/element/index.css') }}">
 @endsection
 
 @section('content')
@@ -385,7 +385,7 @@
 
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{ mix('js/element-ui.js') }}"></script>
-    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
+    <script type="text/javascript" src="{{mix('js/element/index.js') }}"></script>
     <script type="text/javascript" src="{{mix('js/lodop/LodopFuncs.js')}}"></script>
 
     <script src='http://localhost:18000/CLodopfuncs.js?name=CLODOPA'></script>

+ 4 - 3
resources/views/store/receivingTasks/index.blade.php

@@ -1,8 +1,7 @@
 @extends('layouts.app')
 @section('title')开单入库-查询@endsection
 @section('head')
-    <link href="{{ mix('css/element-ui.css') }}" rel="stylesheet">
-    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
+    <link rel="stylesheet" href="{{ asset('css/element/index.css') }}">
 @endsection
 
 
@@ -29,6 +28,7 @@
                         <td v-text="i+1"></td>
                         <td v-text="item.number"></td>
                         <td v-text="item.status"></td>
+                        <td v-text="item.owner"></td>
                         <td>
                             <template v-for="(asn_no,i) in item.asn_nos">
                                 <div>
@@ -54,7 +54,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
-    <script type="text/javascript" src="{{mix('js/element-ui.js') }}"></script>
+    <script type="text/javascript" src="{{asset('js/element-ui.js') }}"></script>
     <script type="text/javascript" src="{{mix('js/lodop/LodopFuncs.js')}}"></script>
 
     <script type="text/javascript" src='http://localhost:18000/CLodopfuncs.js?name=CLODOPA'></script>
@@ -138,6 +138,7 @@
                     {name: 'id', value: '序号', neglect: true},
                     {name: 'number', value: '收货任务号'},
                     {name: 'status', value: '状态', neglect: true},
+                    {name: 'owner', value: '货主', neglect: true},
                     {name: 'asn_nos', value: 'ASN单号', neglect: true},
                     {name: 'created_at', value: '投单时间'},
                     {name: 'warehouse', value: '仓库'},

+ 7 - 0
routes/apiLocal.php

@@ -296,6 +296,11 @@ Route::group(['prefix' => 'print'],function (){
 });
 
 Route::prefix('workOrder')->group(function(){
+    Route::post('updateRemission',"WorkOrderController@updateRemissionApi")->name('workOrder.updateRemissionApi');
+    Route::post('userOwnerGroup/update',"WorkOrderController@updateUserOwnerGroupApi")->name('workOrder.userOwnerGroup.updateApi');
+    Route::post('userWorkGroup/store',"WorkOrderController@storeUserWorkGroupApi")->name('workOrder.userWorkGroups.storeApi');
+    Route::post('userWorkGroup/destroy',"WorkOrderController@destroyUserWorkGroupApi")->name('workOrder.userWorkGroups.destroyApi');
+
     Route::post('end','WorkOrderController@ownerEndWorkOrderApi')->name('workOrder.owner.endApi');                              // 承运商完结工单
     Route::post('batchEnd','WorkOrderController@ownerBatchEndWorkOrderApi')->name('workOrder.owner.batchEndApi');               // 承运商处理标记
     Route::post('logisticTag','WorkOrderController@logisticHandlerTagApi')->name('workOrder.logistic.handlerTagApi');           // 承运商处理标记
@@ -361,10 +366,12 @@ Route::prefix('workOrder')->group(function(){
     Route::post('buildOrderIssue','WorkOrderController@buildOrderIssueApi')->name('workOrder.buildOrderIssueApi');          // 生成问题件
     Route::delete('/{id}','WorkOrderController@destroyApi')->name('workOrder.destroyApi');                                  // 工单删除
     Route::post('check','WorkOrderController@checkWorkOrderApi')->name('workOrder.checkApi');                               // 检查订单是否存在工单
+
     Route::prefix('commodity')->group(function(){
         Route::post("/owner","WorkOrderCommoditiesController@ownerUpdateCommoditiesApi")->name("workOrder.commodity.ownerUpdateApi");          // 货主填充商品信息
         Route::post("/logistic","WorkOrderCommoditiesController@logisticUpdateCommoditiesApi")->name("workOrder.commodity.logisticUpdateApi"); // 承运商 更新商品 处理信息
         Route::post("/baoShi","WorkOrderCommoditiesController@baoShiUpdateCommoditiesApi")->name("workOrder.commodity.baoShiUpdateApi");       // 宝时客服 更新丢件信息
+        Route::post('/getCommodityEqualsMap',"WorkOrderCommoditiesController@getCommodityEqualsMapApi")->name('workOrder.commodity.equalsMapApi'); // 商品数量
     });
 
     Route::prefix('rejectedBill/relation')->group(function(){

+ 1 - 0
routes/web.php

@@ -935,6 +935,7 @@ Route::group(['middleware' => 'auth'], function ($route) {
         /** 工单 */
         Route::prefix('workOrder')->group(function () {
             Route::get('index', 'WorkOrderController@index');
+            Route::match(['get', 'post'], 'export', 'WorkOrderController@exportJsonExcel')->name('workOrder.exportApi');
         });
     });
     /** 结算 */

+ 4 - 0
webpack.mix.js

@@ -56,4 +56,8 @@ mix.copy('resources/js/login/swiper-bundle.min.js','public/js/login/swiper-bundl
 mix.copy('resources/sass/reset.css','public/css/reset.css');
 mix.copy('resources/sass/swiper-bundle.min.css','public/css/swiper-bundle.min.css');
 
+// element table 渲染
+mix.copy('resources/js/element/index.js','public/js/element/index.js')
+mix.copy('resources/sass/element/index.css','public/css/element/index.css');
+
 mix.version();

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff