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

Merge branch 'master' into Haozi

hu hao 5 лет назад
Родитель
Сommit
2cec92732e
100 измененных файлов с 2788 добавлено и 2236 удалено
  1. 6 4
      app/Console/Commands/BeforeCreateOwnerReport.php
  2. 1 1
      app/DeliveryAppointment.php
  3. 6 0
      app/DeliveryAppointmentCar.php
  4. 9 1
      app/DischargeTask.php
  5. 2 3
      app/Events/BroadcastToStation.php
  6. 2 3
      app/Events/ClockinEvent.php
  7. 2 2
      app/Events/DeliveryAppointmentEvent.php
  8. 2 1
      app/Events/ImportEvent.php
  9. 2 1
      app/Events/TeamAuditEvent.php
  10. 2 2
      app/Events/WeighedEvent.php
  11. 6 1
      app/Feature.php
  12. 15 10
      app/Filters/DischargeTaskFilters.php
  13. 110 0
      app/Filters/FacilitatorExternalFilters.php
  14. 59 13
      app/Http/Controllers/DeliveryAppointmentController.php
  15. 57 48
      app/Http/Controllers/DischargeTaskController.php
  16. 67 36
      app/Http/Controllers/FacilitatorController.php
  17. 61 0
      app/Http/Controllers/FacilitatorExternalController.php
  18. 5 1
      app/Http/Controllers/PriceModelController.php
  19. 54 325
      app/Http/Controllers/TestController.php
  20. 2 3
      app/Http/Controllers/WaybillPriceModelController.php
  21. 1 0
      app/Http/Controllers/api/thirdPart/flux/WaybillController.php
  22. 4 9
      app/Http/Controllers/api/thirdPart/haiq/StorageController.php
  23. 87 0
      app/Http/Controllers/api/thirdPart/hengli/PackageController.php
  24. 344 0
      app/Http/Controllers/api/thirdPart/weight/WeightBaseController.php
  25. 5 1
      app/Http/Requests/DischargeTask/DischargeTaskRequest.php
  26. 5 4
      app/Http/Requests/DischargeTask/FacilitatorRequest.php
  27. 2 1
      app/Imports/ExpressImport.php
  28. 120 0
      app/Jobs/LogisticZopSync.php
  29. 5 2
      app/OrderIssue.php
  30. 2 0
      app/OwnerPriceOperation.php
  31. 1 0
      app/OwnerPriceOperationItem.php
  32. 10 0
      app/Providers/RouteServiceProvider.php
  33. 5 5
      app/Services/DeliveryAppointmentService.php
  34. 31 9
      app/Services/DischargeTaskService.php
  35. 23 1
      app/Services/FacilitatorService.php
  36. 16 7
      app/Services/ForeignHaiRoboticsService.php
  37. 74 23
      app/Services/LogisticZopService.php
  38. 9 8
      app/Services/OrderPackageReceivedSyncService.php
  39. 38 22
      app/Services/OwnerPriceOperationService.php
  40. 2 2
      app/Services/StationService.php
  41. 15 0
      app/Services/StationTaskBatchService.php
  42. 5 1
      app/Services/StationTaskCommodityService.php
  43. 4 1
      app/Services/StationTaskMaterialBoxService.php
  44. 44 1
      app/Services/StoreService.php
  45. 1 1
      app/Services/common/QueryService.php
  46. 1 1
      app/StationTaskMaterialBox.php
  47. 2 1
      app/Waybill.php
  48. 3 3
      config/api_logistic.php
  49. 5 2
      database/factories/DischargeTaskFactory.php
  50. 65 0
      database/migrations/2021_03_30_104348_change_discharge_auth_name.php
  51. 46 0
      database/migrations/2021_03_30_135555_change_owner_operation_price_table_add_odd_price_column.php
  52. 37 0
      database/migrations/2021_04_02_134141_change_appointment_cars_add_status_column.php
  53. 1 1
      database/seeds/DischargeTaskSeeder.php
  54. 3 5
      laravel-echo-server.json
  55. 0 3
      laravel-echo-server.lock
  56. 64 565
      package-lock.json
  57. 0 1
      package.json
  58. 237 0
      resources/js/queryForm/header-temp.js
  59. 202 182
      resources/js/queryForm/header.js
  60. 5 5
      resources/sass/layout.scss
  61. 5 0
      resources/sass/text.scss
  62. 19 56
      resources/views/customer/project/area.blade.php
  63. 24 3
      resources/views/customer/project/create.blade.php
  64. 12 57
      resources/views/customer/project/index.blade.php
  65. 1 4
      resources/views/customer/project/part/_addFeature.blade.php
  66. 13 1
      resources/views/customer/project/part/_operation.blade.php
  67. 3 0
      resources/views/customer/project/part/_three.blade.php
  68. 12 51
      resources/views/finance/billConfirmation.blade.php
  69. 19 58
      resources/views/finance/instantBill.blade.php
  70. 14 56
      resources/views/inventory/statement/changeInventory.blade.php
  71. 13 52
      resources/views/inventory/statement/dailyLog.blade.php
  72. 13 63
      resources/views/inventory/statement/inventoryCompare.blade.php
  73. 19 60
      resources/views/inventory/stockInventory/inventoryMission.blade.php
  74. 11 53
      resources/views/inventory/stockInventory/mission.blade.php
  75. 2 2
      resources/views/maintenance/facilitator/_create.blade.php
  76. 2 2
      resources/views/maintenance/facilitator/_edit.blade.php
  77. 4 4
      resources/views/maintenance/facilitator/_table.blade.php
  78. 7 7
      resources/views/maintenance/facilitator/index.blade.php
  79. 2 2
      resources/views/maintenance/menu.blade.php
  80. 6 9
      resources/views/maintenance/role/index.blade.php
  81. 6 16
      resources/views/maintenance/user/index.blade.php
  82. 84 138
      resources/views/order/index/delivering.blade.php
  83. 6 8
      resources/views/order/index/index.blade.php
  84. 1 1
      resources/views/order/issue/index.blade.php
  85. 22 44
      resources/views/order/issue/workload.blade.php
  86. 0 1
      resources/views/order/tracking/index.blade.php
  87. 0 2
      resources/views/package/logistic/index.blade.php
  88. 12 50
      resources/views/package/weigh/index.blade.php
  89. 11 49
      resources/views/package/weightExcepted/index.blade.php
  90. 41 0
      resources/views/personnel/discharge/facilitator/QRcode.blade.php
  91. 91 0
      resources/views/personnel/discharge/facilitator/_table.blade.php
  92. 80 0
      resources/views/personnel/discharge/facilitator/external/_table.blade.php
  93. 110 0
      resources/views/personnel/discharge/facilitator/external/index.blade.php
  94. 45 16
      resources/views/personnel/discharge/facilitator/index.blade.php
  95. 3 3
      resources/views/personnel/discharge/facilitator/menu.blade.php
  96. 6 6
      resources/views/personnel/discharge/menu.blade.php
  97. 2 1
      resources/views/personnel/discharge/statement/_table.blade.php
  98. 6 8
      resources/views/personnel/discharge/statement/index.blade.php
  99. 2 2
      resources/views/personnel/discharge/statement/menu.blade.php
  100. 65 29
      resources/views/personnel/discharge/task/_createTask.blade.php

+ 6 - 4
app/Console/Commands/BeforeCreateOwnerReport.php

@@ -24,6 +24,7 @@ class BeforeCreateOwnerReport extends Command
     protected $description = 'Create owner report in advance and build cache';
 
 
+    const TTL = 2764800;
     /**
      * Execute the console command.
      *
@@ -42,10 +43,11 @@ class BeforeCreateOwnerReport extends Command
                     "counting_month" => date("Y-m-d"),
                     "created_at"     => $date
                 ];
-                //B:business C:customer D:date
-                Cache::put(date("Y-m")."|B|".$owner->id,0,2764800);
-                Cache::put(date("Y-m")."|C|".$owner->id,0,2764800);
-                Cache::put(date("Y-m")."|D|".$owner->id,time(),2764800);
+                //A:件 B:business C:customer D:date
+                Cache::put(date("Y-m")."|B|".$owner->id,0,self::TTL);
+                Cache::put(date("Y-m")."|C|".$owner->id,0,self::TTL);
+                Cache::put(date("Y-m")."|D|".$owner->id,time(),self::TTL);
+                Cache::put(date("Y-m")."|A|".$owner->id,0,self::TTL);
             }
             OwnerReport::query()->insert($insert);
         }

+ 1 - 1
app/DeliveryAppointment.php

@@ -28,7 +28,7 @@ class DeliveryAppointment extends Model
     ];
     //时段 映射date_period字段 必须有序 否则展示数据错乱
     const PERIOD=[
-        0 => "9-11",
+        0 => "09-11",
         1 => "13-17",
     ];
     //时长 映射PERIOD常量

+ 6 - 0
app/DeliveryAppointmentCar.php

@@ -18,6 +18,12 @@ class DeliveryAppointmentCar extends Model
         "driver_phone",
         "appointment_number",
         "delivery_time",
+        "status",
+    ];
+    const STATUS = [
+        0 => "未送达",
+        1 => "作业中",
+        2 => "已完成",
     ];
     public $timestamps=false;
 

+ 9 - 1
app/DischargeTask.php

@@ -22,6 +22,8 @@ class DischargeTask extends Model
 
     const types = [
         '装车',
+        '卸车',
+        '翻托',
         '卸车'
     ];
 
@@ -36,7 +38,7 @@ class DischargeTask extends Model
         'owner_id','type','numbers','status',
         'income_amount','income_unit','income_unit_price','income_total_cost','income_remark',
         'facilitator_id','expenditure_amount','expenditure_unit','expenditure_unit_price','expenditure_total_cost','expenditure_remark',
-        'income_at','expenditure_at'
+        'income_at','expenditure_at','warehouse_id'
     ];
 
     function owner(): BelongsTo
@@ -54,4 +56,10 @@ class DischargeTask extends Model
         return $filters->apply($query);
     }
 
+    public function warehouse(): BelongsTo
+    {
+        return $this->belongsTo(Warehouse::class);
+    }
+
+
 }

+ 2 - 3
app/Events/BroadcastToStation.php

@@ -3,10 +3,9 @@
 namespace App\Events;
 
 use Illuminate\Broadcasting\Channel;
-use Illuminate\Broadcasting\PresenceChannel;
-use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
 
-class BroadcastToStation implements ShouldBroadcast
+class BroadcastToStation implements ShouldBroadcastNow
 {
     public $json;
     private $id;

+ 2 - 3
app/Events/ClockinEvent.php

@@ -2,15 +2,14 @@
 
 namespace App\Events;
 
-use App\Http\Controllers\Controller;
 use App\LaborReport;
 use App\UserDutyCheck;
 use Illuminate\Broadcasting\Channel;
-use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
 use Illuminate\Queue\SerializesModels;
 
 
-class ClockinEvent implements ShouldBroadcast
+class ClockinEvent implements ShouldBroadcastNow
 {
     use  SerializesModels;
 

+ 2 - 2
app/Events/DeliveryAppointmentEvent.php

@@ -4,11 +4,11 @@ namespace App\Events;
 
 use App\DeliveryAppointmentCar;
 use Illuminate\Broadcasting\Channel;
-use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
 use Illuminate\Foundation\Events\Dispatchable;
 use Illuminate\Queue\SerializesModels;
 
-class DeliveryAppointmentEvent implements ShouldBroadcast
+class DeliveryAppointmentEvent implements ShouldBroadcastNow
 {
     use Dispatchable, SerializesModels;
 

+ 2 - 1
app/Events/ImportEvent.php

@@ -5,10 +5,11 @@ namespace App\Events;
 use App\LaborReport;
 use Illuminate\Broadcasting\Channel;
 use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
 use Illuminate\Queue\SerializesModels;
 
 
-class ImportEvent implements ShouldBroadcast
+class ImportEvent implements ShouldBroadcastNow
 {
     use  SerializesModels;
 

+ 2 - 1
app/Events/TeamAuditEvent.php

@@ -6,10 +6,11 @@ use App\LaborReport;
 use App\UserDutyCheck;
 use Illuminate\Broadcasting\Channel;
 use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
 use Illuminate\Queue\SerializesModels;
 
 
-class TeamAuditEvent implements ShouldBroadcast
+class TeamAuditEvent implements ShouldBroadcastNow
 {
     use  SerializesModels;
 

+ 2 - 2
app/Events/WeighedEvent.php

@@ -4,10 +4,10 @@ namespace App\Events;
 
 use App\OrderPackage;
 use Illuminate\Broadcasting\Channel;
-use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
 use Illuminate\Queue\SerializesModels;
 
-class WeighedEvent implements ShouldBroadcast
+class WeighedEvent implements ShouldBroadcastNow
 {
     use  SerializesModels;
 

+ 6 - 1
app/Feature.php

@@ -25,9 +25,11 @@ class Feature extends Model
         5 => "商品备注",  //二级
         6 => "长",       //二级
         7 => "订单备注",
+        10=> "订单商品数",//二级
+        11=> "属性仓",
     ];
     //额外定义 8:商品数量 9:商品
-    const TYPE_NODE = [0,5,6,8,9]; //标注二级类型
+    const TYPE_NODE = [0,5,6,8,9,10]; //标注二级类型
     const MAPPING = [
         "store" => [
             0 => "storeItems.name",
@@ -37,6 +39,8 @@ class Feature extends Model
             7 => "remark",
             8 => "storeItems.amount",
             9 => "storeItems.commodity",
+            10=> "storeItems.total",
+            11=> "warehouse.name",
         ],
         "order" => [
             0 => "packages.commodities.commodity.name",
@@ -49,6 +53,7 @@ class Feature extends Model
             7 => "remark",
             8 => 'packages.commodities.amount',
             9 => 'packages.commodities.commodity',
+            10=> 'packages.commodities.total',
         ]
     ];
 }

+ 15 - 10
app/Filters/DischargeTaskFilters.php

@@ -11,7 +11,7 @@ class DischargeTaskFilters
     protected $request;
     protected $queryBuilder;
     protected $filters = [
-        'owner_id', 'created_at_start', 'created_at_end', 'numbers', 'status', 'type', 'income_remark','facilitator_id'
+        'owner_id', 'created_at_start', 'created_at_end', 'numbers', 'status', 'type', 'income_remark','facilitator_id','created_range'
     ];
     protected $array_filter;
     protected $params = [];
@@ -62,46 +62,51 @@ class DischargeTaskFilters
 
     public function owner_id($owner_id)
     {
-        $this->queryBuilder->where('owner_id',$owner_id);
+        $this->queryBuilder->where('discharge_tasks.owner_id',$owner_id);
     }
 
     public function created_at_start($created_at_start)
     {
-        $this->queryBuilder->where('created_at','>=',$created_at_start);
+        $this->queryBuilder->where('discharge_tasks.created_at','>=',$created_at_start);
     }
     public function created_at_end($created_at_end)
     {
-        $this->queryBuilder->where('created_at','<=',$created_at_end);
+        $this->queryBuilder->where('discharge_tasks.created_at','<=',$created_at_end);
     }
 
     public function numbers($numbers)
     {
-        $this->searchWay($this->queryBuilder,$numbers,'numbers');
+        $this->searchWay($this->queryBuilder,$numbers,'discharge_tasks.numbers');
     }
 
     public function status($status)
     {
-        $this->queryBuilder->where('status',$status);
+        $this->queryBuilder->where('discharge_tasks.status',$status);
     }
 
     public function type($type)
     {
-        $this->queryBuilder->where('type',$type);
+        $this->queryBuilder->where('discharge_tasks.type',$type);
     }
 
     public function income_remark($income_remark)
     {
-        $this->queryBuilder->where('income_remark','like',$income_remark."%");
+        $this->queryBuilder->where('discharge_tasks.income_remark','like',$income_remark."%");
     }
 
     public function id($ids)
     {
-        $this->queryBuilder->whereIn('id',$ids);
+        $this->queryBuilder->whereIn('discharge_tasks.id',$ids);
     }
 
     public function facilitator_id($facilitator_id)
     {
-        $this->searchWay($this->queryBuilder,$facilitator_id,'facilitator_id');
+        $this->searchWay($this->queryBuilder,$facilitator_id,'discharge_tasks.facilitator_id');
+    }
+
+    public function created_range($created_range)
+    {
+        $this->queryBuilder->where('discharge_tasks.created_at','like',$created_range.'%');
     }
 
 }

+ 110 - 0
app/Filters/FacilitatorExternalFilters.php

@@ -0,0 +1,110 @@
+<?php
+
+
+namespace App\Filters;
+
+
+use App\Facilitator;
+use App\Traits\ModelSearchWay;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+
+class FacilitatorExternalFilters
+{
+
+    use ModelSearchWay;
+
+    protected $request;
+    protected $queryBuilder;
+    protected $filters = [
+        'created_at_start', 'created_at_end', 'facilitator_id', 'range_data', 'id'
+    ];
+    protected $array_filter;
+    protected $params = [];
+
+    public function __construct(Request $request)
+    {
+        $this->request = $request;
+        $this->params = $request->all();
+        $request['range_data'] = $request['data'];
+        unset($request['data']);
+        $this->array_filter = array_filter($this->request->only($this->filters));
+    }
+
+    public function apply($builder)
+    {
+        $this->queryBuilder = $builder;
+        foreach ($this->array_filter as $filter => $value) {
+            if (method_exists($this, $filter)) {
+                $this->$filter($value, $this->queryBuilder);
+            }
+        }
+        return $this->queryBuilder;
+    }
+
+    public function created_at_start($created_at_start)
+    {
+        $this->queryBuilder->where('discharge_tasks.created_at', '>=', $created_at_start);
+    }
+
+    public function created_at_end($created_at_end)
+    {
+        $this->queryBuilder->where('discharge_tasks.created_at', '<=', $created_at_end);
+    }
+
+    // 卸货队 和 时间区间
+    public function range_data($range_data)
+    {
+        $rangeData = explode(',', $range_data);
+        $params = [];
+        foreach ($rangeData as $rangeDatum) {
+            $data = explode(';', $rangeDatum);
+            $data = $this->getSearchArr($data);
+            if (empty($params[$data['id']])) {
+                $params[$data['id']] = [];
+            }
+            $params[$data['id']][] = $data['months'];
+        }
+        $arr = [];
+        foreach ($params as $key => $param) {
+            $facilitator_id = $key;
+            $rangeData = '';
+            foreach ($param as $item) {
+                $rangeData .= $item . '|';
+            }
+            $rangeData = rtrim($rangeData, '|');
+            $arr[$facilitator_id] = $rangeData;
+        }
+
+        $this->queryBuilder->where(function ($query) use ($arr) {
+            foreach ($arr as $key => $item) {
+                $query->orWhere(function ($query) use ($key, $item) {
+                    /** @var Builder $query */
+                    $query->where('discharge_tasks.facilitator_id', $key)->where('discharge_tasks.created_at', 'regexp', '(' . $item . ')');
+                });
+            }
+        });
+    }
+
+    private function getSearchArr($data): array
+    {
+        $param = [];
+        foreach ($data as $datum) {
+            $arr = explode(':', $datum);
+            $param[$arr[0]] = $arr[1];
+        }
+        return $param;
+    }
+
+    public function facilitator_id($facilitator_id)
+    {
+        $this->searchWay($this->queryBuilder, $facilitator_id, 'discharge_tasks.facilitator_id');
+    }
+
+    public function id($id)
+    {
+        $facilitator =  Facilitator::query()->fromQuery('select id from facilitators where MD5(id) = ?',[$id]);
+        $this->queryBuilder->whereIn('discharge_tasks.facilitator_id',$facilitator);
+    }
+
+}

+ 59 - 13
app/Http/Controllers/DeliveryAppointmentController.php

@@ -84,6 +84,8 @@ class DeliveryAppointmentController extends Controller
                 $total = $capacity*DeliveryAppointment::HOUR[$key];//仓库该时段产能总量
                 $used = $map[$date."-".$key] ?? 0; //已使用产能
                 $available = $total-$used; //可用产能
+                $period = explode("-",$period);
+                $period = $period[0].":00 - ".$period[1].":00";
                 if ($available < $need)$periods[] = ["time"=>$period,"index"=>$key,"isAvailable"=>false];
                 else $periods[] = ["time"=>$period,"index"=>$key,"isAvailable"=>true];
             }
@@ -298,22 +300,51 @@ class DeliveryAppointmentController extends Controller
         foreach (DeliveryAppointment::PERIOD as $key=>$period){
             $arr = explode("-",$period);
             if (count($arr)!=2)continue;
-            if ($hour<$arr[1])$index = $key;
+            if ($hour<$arr[1]){
+                $index = $key;
+                break;
+            }
         }
-        if ($index===null)$this->success([]);
+        if ($index===null)$this->success();
         DeliveryAppointmentCar::query()->whereHas("deliveryAppointment",function (Builder $query)use($index){
-            $query->where("appointment_date",date("Y-m-d"))->whereIn("status",[0,2])
-                ->where("date_period",">=",$index);
-        })->orderByDesc("id")->limit(10)->get()->each(function ($car)use(&$list){
-            $diff = $car->delivery_time ? (strtotime($car->delivery_time)+1799)-time() : 0;
+            $query->where("appointment_date",date("Y-m-d"))->whereIn("status",[0,2]);
+        })->where(function ($query)use($index){
+            /** @var Builder $query */
+            $query->where("status",1)->orWhereHas("deliveryAppointment",function (Builder $query)use($index){
+                $query->where("date_period",">=",$index);
+            });
+        })->orderByRaw("(CASE WHEN status=0 THEN 2 WHEN status=2 THEN 3 END),IF(ISNULL(delivery_time),1,0),delivery_time")
+            ->limit(10)->get()->each(function ($car)use(&$list){
+            //$diff = $car->delivery_time ? (strtotime($car->delivery_time)+1799)-time() : 0;
             $list[] = [
+                "id" => $car->id,
                 "license_plate_number" => $car->license_plate_number,
                 "driver_name" => $car->driver_name,
                 "driver_phone" => $car->driver_phone,
-                "diff" => $diff>0 ? $diff*1000 : 0,
+                "status" => $car->status,
+                //"diff" => $diff>0 ? $diff*1000 : 0,
             ];
         });
-        $result = ["list"=>$list];
+        $counts = DeliveryAppointmentCar::query()->whereHas("deliveryAppointment",function (Builder $query)use($index){
+            $query->where("appointment_date",date("Y-m-d"))->whereIn("status",[0,2]);
+        })->selectRaw("status, COUNT(1) AS c")->groupByRaw("status")->get();
+        $success = 0;
+        $work = 0;
+        $notReached = 0;
+        if ($counts)foreach ($counts as $c){
+            switch ($c->status){
+                case 0:
+                    $notReached = $c->c;
+                    break;
+                case 1:
+                    $work = $c->c;
+                    break;
+                case 2:
+                    $success = $c->c;
+                    break;
+            }
+        }
+        $result = ["list"=>$list,"success"=>$success,"work"=>$work,"notReached"=>$notReached];
         $nextTime = DeliveryAppointment::PERIOD[$index+1] ?? null;
         if ($nextTime){
             $nextTime = explode("-",$nextTime)[0];
@@ -345,6 +376,7 @@ html;
 
     /**
      * 检查key有效性
+     * 21-4-2 切换永久二维码 取消时段校验
      *
      * @param string $key
      * @param int $offset
@@ -357,11 +389,11 @@ html;
         $key = base64_decode($key);
         $ch = app("DeliveryAppointmentService")->getKey();
         $len = strlen($ch);
-        $timeLen = strlen($key)-$len;
         if (substr($key,0,$len)!=$ch)return false;
+        /*$timeLen = strlen($key)-$len;
         $time = substr($key,$len)+$offset;
         $thisTime = (integer)substr(time(),$timeLen*-1);
-        if ($thisTime>$time)return false;
+        if ($thisTime>$time)return false;*/
         return true;
     }
     /**
@@ -384,16 +416,15 @@ html;
         if (!$number)return ["status"=>417];
         $period = app("DeliveryAppointmentService")->getPeriod();
         if ($period===false)return ["status"=>416]; //非法时段扫码
-        $car = DeliveryAppointmentCar::query()->whereNull("delivery_time")
+        $car = DeliveryAppointmentCar::query()->whereNull("delivery_time")->where("status",0)
             ->where("appointment_number",$number)->whereHas("deliveryAppointment",function (Builder $query)use($period){
                 $query->where("appointment_date",date("Y-m-d"))
                 ->where("date_period",$period)->where("status",0);
             })->first();
         if (!$car)return ["status"=>417];
-        $car->update(["delivery_time"=>date("Y-m-d H:i:s")]);
+        $car->update(["delivery_time"=>date("Y-m-d H:i:s"),"status"=>1]);
         /** @var DeliveryAppointmentCar $car */
         event(new DeliveryAppointmentEvent($car));
-        app("DeliveryAppointmentService")->checkFull($car->delivery_appointment_id);
         return ["status"=>200,"k"=>$car->delivery_appointment_id];
     }
 
@@ -407,4 +438,19 @@ html;
         }])->find(request("k"));
         return view("store.deliveryAppointment.deliverySuccess",["cars"=>$appointment->cars]);
     }
+
+    /**
+     * 卸货完成
+     */
+    public function unloading()
+    {
+        if (!request("id"))$this->error("非法参数");
+        /** @var DeliveryAppointmentCar|\stdClass $car */
+        $car = DeliveryAppointmentCar::query()->find(request("id"));
+        if (!$car || !$car->deliveryAppointment)$this->error("单据不存在");
+        $car->update(["status"=>2]);
+        app("DeliveryAppointmentService")->checkFull($car->delivery_appointment_id);
+        event(new DeliveryAppointmentEvent($car));
+        $this->success();
+    }
 }

+ 57 - 48
app/Http/Controllers/DischargeTaskController.php

@@ -9,79 +9,63 @@ use App\Filters\DischargeTaskFilters;
 use App\Http\Requests\DischargeTask\DischargeTaskRequest;
 use App\Services\common\ExportService;
 use App\Services\OwnerService;
+use App\Warehouse;
 use Illuminate\Http\Request;
-use Illuminate\Http\Response;
-use Illuminate\Support\Facades\Gate;
+ use Illuminate\Support\Facades\Gate;
 
 class DischargeTaskController extends Controller
 {
     use AsyncResponse;
 
+
     public function index(Request $request, DischargeTaskFilters $filters)
     {
-        if (!Gate::allows('运输管理-卸货-查询')) {
+        if (!Gate::allows('人事管理-卸货-查询')) {
             return redirect(url('/'));
         }
-        $dischargeTasks = DischargeTask::query()->with(['facilitator', 'owner'])->filter($filters)->orderByDesc('id')->paginate($request['paginate'] ?? 50);
+
+        $dischargeTasks = DischargeTask::query()->with(['facilitator', 'owner','warehouse'])->filter($filters)->orderByDesc('id')->paginate($request['paginate'] ?? 50);
         $owners = app(OwnerService::class)->getAuthorizedOwners();
+        $warehouses = Warehouse::query()->select('id','name')->get();
         $facilitators = Facilitator::query()->select('name', 'id')->get();
-        return view('transport.discharge.task.index', compact('dischargeTasks', 'owners', 'facilitators'));
+
+        return view('personnel.discharge.task.index', compact('dischargeTasks', 'owners', 'facilitators','warehouses'));
     }
 
     // 结算报表
     public function statementIndex(Request $request, DischargeTaskFilters $filters)
     {
-        if (!Gate::allows('运输管理-卸货-结算报表-查询')) {
+        if (!Gate::allows('人事管理-卸货-结算报表-查询')) {
             return redirect(url('/'));
         }
-        $dischargeStatements = DischargeTask::query()->with('facilitator')->filter($filters)->orderBy('id')->paginate($request['paginate'] ?? 50);
+
+        $dischargeStatements = DischargeTask::query()->with('facilitator')->filter($filters)->orderByDesc('id')->paginate($request['paginate'] ?? 50);
         $owners = app(OwnerService::class)->getAuthorizedOwners();
         $facilitators = Facilitator::query()->select('name', 'id')->get();
-        return view('transport.discharge.statement.index', compact('dischargeStatements', 'owners', 'facilitators'));
-    }
-
-
-    public function create()
-    {
 
-    }
-
-
-    public function store(Request $request)
-    {
+        return view('personnel.discharge.statement.index', compact('dischargeStatements', 'owners', 'facilitators'));
     }
 
     // async 创建
     public function storeApi(DischargeTaskRequest $request)
     {
-        $this->gate('运输管理-卸货-创建');
+        $this->gate('人事管理-卸货-创建');
+
         $result = app('DischargeTaskService')->createTask($request->all());
+
         if ($result['success']) $this->success($result['data']);
         $this->error('任务创建异常,刷新当前页面重试');
     }
 
-    public function show(DischargeTask $dischargeTask)
-    {
-        //
-    }
-
-
-    public function edit(DischargeTask $dischargeTask)
-    {
-        //
-    }
-
-    public function update(Request $request, DischargeTask $dischargeTask)
-    {
-        //
-    }
-
     // async 编辑
     public function updateApi(DischargeTaskRequest $request)
     {
-        $this->gate('运输管理-卸货-编辑');
+        $this->gate('人事管理-卸货-编辑');
+
         $dischargeTask = DischargeTask::query()->where('id', $request['id'])->first();
+
         $result = app('DischargeTaskService')->updateDischargeTask($dischargeTask, $request->all());
+
         if ($result['success']) $this->success($result['data']);
         else $this->error($result['message'] ?? '操作异常,请刷新页面重试');
     }
@@ -89,7 +73,7 @@ class DischargeTaskController extends Controller
     // 修改任务服务商
     public function updateTaskFacilitatorApi(DischargeTaskRequest $request)
     {
-        $this->gate('运输管理-卸货-编辑');
+        $this->gate('人事管理-卸货-编辑');
         /** @var  DischargeTask $dischargeTask */
         $dischargeTask = DischargeTask::query()->where('id', $request['id'])->first();
         if (!$dischargeTask) $this->error('没有找对应的卸货任务');
@@ -98,18 +82,16 @@ class DischargeTaskController extends Controller
         else $this->error($result['message'] ?? '操作异常,请刷新页面重试');
     }
 
-    public function destroy(DischargeTask $dischargeTask)
-    {
-
-    }
-
     //  async 删除
     public function destroyApi(DischargeTaskRequest $request)
     {
-        $this->gate('运输管理-卸货-删除');
+        $this->gate('人事管理-卸货-删除');
+
         /** @var DischargeTask $dischargeTask */
         $dischargeTask = DischargeTask::query()->where('id', $request['id'])->first();
+
         $result = app('DischargeTaskService')->deleteDischargeTask($dischargeTask);
+
         if ($result['success']) $this->success();
         else $this->error($result['message']);
     }
@@ -117,9 +99,11 @@ class DischargeTaskController extends Controller
     // 执行任务
     public function executingTaskApi(DischargeTaskRequest $request)
     {
-        $this->gate('运输管理-卸货-编辑');
+        $this->gate('人事管理-卸货-编辑');
+
         $dischargeTask = DischargeTask::query()->where('id', $request['id'])->first();
         $result = app('DischargeTaskService')->updateTaskProvider($dischargeTask, $request->all());
+
         if ($result['success']) $this->success($result['data']);
         $this->error($result['message'] ?? '操作异常,请刷新页面重试');
     }
@@ -127,22 +111,47 @@ class DischargeTaskController extends Controller
     // 卸货任务下载
     public function export(Request $request, DischargeTaskFilters $filters)
     {
-        $this->gate('运输管理-卸货-查询');
+        $this->gate('人事管理-卸货-查询');
+
         $dischargeTasks = DischargeTask::query()->with(['Facilitator', 'owner'])->filter($filters)->orderByDesc('id')->get();
+
         $row = ['日期', '客户名称', '作业名称', '入库单号', '数量', '单位', '单价', '收费', '状态', '备注'];
         $json = app('DischargeTaskService')->getJson($dischargeTasks);
+
         return app(ExportService::class)->json($row, $json, "卸货任务");
     }
 
     // 结算报表下载
     public function exportStatements(Request $request, DischargeTaskFilters $filters)
     {
-        $this->gate('运输管理-卸货-结算报表-查询');
+        $this->gate('人事管理-卸货-结算报表-查询');
 
-        $dischargeTasks = DischargeTask::query()->with(['facilitator', 'owner'])->filter($filters)->orderByDesc('id')->get();
-        $row = ['日期', '客户名称', '作业名称', '入库单号', '数量', '单位', '收入单价', '收入合计', '服务商', '数量', '单位', '支出单价', '支出合计', '状态', '收入备注', '支出备注'];
+        $dischargeTasks = DischargeTask::query()->with(['facilitator', 'owner','warehouse'])->filter($filters)->orderByDesc('id')->get();
+
+        $row = ['日期', '客户名称','仓库', '作业名称', '入库单号', '数量', '单位', '收入单价', '收入合计', '装卸队', '数量', '单位', '支出单价', '支出合计', '状态', '收入备注', '支出备注'];
         $json = app('DischargeTaskService')->getStatementsJson($dischargeTasks);
+
         return app(ExportService::class)->json($row, $json, "卸货结算报表");
     }
 
+    public function show(DischargeTask $dischargeTask)
+    {
+    }
+    public function edit(DischargeTask $dischargeTask)
+    {
+    }
+    public function update(Request $request, DischargeTask $dischargeTask)
+    {
+    }
+    public function store(Request $request)
+    {
+    }
+    public function create()
+    {
+    }
+    public function destroy(DischargeTask $dischargeTask)
+    {
+
+    }
+
 }

+ 67 - 36
app/Http/Controllers/FacilitatorController.php

@@ -6,8 +6,10 @@ use App\Components\AsyncResponse;
 use App\Facilitator;
 use App\DischargeTask;
 use App\Filters\DischargeTaskFilters;
+use App\Filters\FacilitatorExternalFilters;
 use App\Http\Requests\DischargeTask\FacilitatorRequest;
 use App\Services\common\ExportService;
+use App\Services\FacilitatorService;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Gate;
@@ -16,95 +18,124 @@ class FacilitatorController extends Controller
 {
     use AsyncResponse;
 
-    // 服务商基础设置
     public function index(Request $request)
     {
-        if (!Gate::allows('服务商-查询')) {
+        if (!Gate::allows('装卸队-查询')) {
             return redirect(url('/'));
         }
+
         $facilitators = Facilitator::query()->select(['id', 'name', 'created_at'])->orderByDesc('id')->paginate($request['paginate'] ?? 50);
+
         return view('maintenance.facilitator.index', compact('facilitators'));
     }
 
-    // 服务商对账单
+    // 装卸队对账单
     public function statementIndex(Request $request, DischargeTaskFilters $filters)
     {
-        if (!Gate::allows('服务商-对账单-查询')) {
+        if (!Gate::allows('装卸队-对账单-查询')) {
             return redirect(url('/'));
         }
+
         $facilitatorStatements = DischargeTask::query()
+            ->selectRaw('sum( discharge_tasks.expenditure_total_cost ) total_cost,' . ' count( 1 ) sum , ' . ' facilitators.name facilitators_name,' . ' facilitators.id id,' . " DATE_FORMAT( discharge_tasks.created_at, '%Y-%m' ) months ")
+            ->leftJoin('facilitators', 'discharge_tasks.facilitator_id', '=', 'facilitators.id')
             ->filter($filters)
-            ->with('facilitator')
-            ->select(['id', 'facilitator_id', 'expenditure_amount', 'expenditure_unit', 'expenditure_unit_price', 'expenditure_total_cost', 'expenditure_remark', 'created_at'])
-            ->whereNotNull('facilitator_id')
-            ->where('facilitator_id','!=','0')
-            ->orderByDesc('id')->paginate($request['paginate'] ?? 50);
+            ->groupBy('months', 'facilitator_id')
+            ->orderByDesc('months')
+            ->paginate($request['paginate'] ?? 50);
+
         $facilitators = Facilitator::query()->get();
-        return view('transport.discharge.facilitator.index', compact('facilitatorStatements', 'facilitators'));
-    }
 
-    public function create()
-    {
+        return view('personnel.discharge.facilitator.index', compact('facilitatorStatements', 'facilitators'));
     }
 
-    public function store(Request $request)
+    // 卸货队扫描二维码
+    public function getQrCode(Request $request)
     {
-    }
+        /** @var FacilitatorService $service */
+        $service = app(FacilitatorService::class);
+        $qrCodeUrl = $service->getQrCodeUrl($request->all());
 
-    public function storeApi(FacilitatorRequest $request)
-    {
-        $this->gate('服务商-创建');
-        $facilitator = Facilitator::query()->create($request->all());
-        $this->success($facilitator);
-    }
+        $facilitator = Facilitator::query()->where('id',$request['facilitator_id'])->first();
 
-    public function show(Facilitator $facilitator)
-    {
+        return view('personnel/discharge/facilitator/external/Qrcode',compact('qrCodeUrl','facilitator'));
     }
 
-    public function edit(Facilitator $facilitator)
+    public function gainStatementApi(Request $request,DischargeTaskFilters $filters)
     {
+        $facilitatorStatements = DischargeTask::query()
+            ->with('facilitator')
+            ->filter($filters)
+            ->get();
+
+        $this->success($facilitatorStatements);
     }
 
-    public function update(Request $request, Facilitator $facilitator)
+    public function storeApi(FacilitatorRequest $request)
     {
+        $this->gate('装卸队-创建');
+
+        $facilitator = Facilitator::query()->create($request->all());
+
+        $this->success($facilitator);
     }
 
     public function updateApi(FacilitatorRequest $request)
     {
-        $this->gate('服务商-编辑');
+        $this->gate('装卸队-编辑');
+
         $facilitator = Facilitator::query()->where('id', $request['id'])->update($request->only(['name']));
+
         if ($facilitator) $this->success(Facilitator::query()->find($request['id']));
         $this->error('更新失败');
     }
 
-    public function destroy(Facilitator $facilitator)
-    {
-    }
-
     public function destroyApi(FacilitatorRequest $request)
     {
-        $this->gate('服务商-删除');
+        $this->gate('装卸队-删除');
+
         $count = Facilitator::query()->where('id', $request['id'])->delete();
+
         if ($count > 0) $this->success('删除成功');
         $this->error('删除失败');
     }
 
     // 对账单导出
-    public function exportStatement(Request $request, DischargeTaskFilters $filters)
+    public function exportStatement(Request $request, FacilitatorExternalFilters $filters)
     {
-        $this->gate('服务商-对账单-查询');
         /** @var Collection $facilitatorStatements */
         $facilitatorStatements = DischargeTask::query()
             ->filter($filters)
             ->with('facilitator')
             ->select(['id', 'facilitator_id', 'expenditure_amount', 'expenditure_unit', 'expenditure_unit_price', 'expenditure_total_cost', 'expenditure_remark', 'created_at'])
             ->whereNotNull('facilitator_id')
-            ->where('facilitator_id','!=','0')
+            ->where('facilitator_id', '!=', '0')
             ->orderByDesc('id')->get();
-        $row = ['日期', '服务商', '数量', '单位', '单价', '总金额合计'];
+
+        $row = ['日期', '装卸队', '数量', '单位', '单价', '总金额合计'];
+
         $json = app('DischargeTaskService')->getFacilitatorStatementsJson($facilitatorStatements);
-        return app(ExportService::class)->json($row, $json, "服务商对账单报表");
+
+        return app(ExportService::class)->json($row, $json, "装卸队对账单报表");
     }
 
+
+    public function create()
+    {
+    }
+    public function store(Request $request)
+    {
+    }
+    public function show(Facilitator $facilitator)
+    {
+    }
+    public function edit(Facilitator $facilitator)
+    {
+    }
+    public function update(Request $request, Facilitator $facilitator)
+    {
+    }
+    public function destroy(Facilitator $facilitator)
+    {
+    }
 }

+ 61 - 0
app/Http/Controllers/FacilitatorExternalController.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Components\AsyncResponse;
+use App\DischargeTask;
+use App\Facilitator;
+use App\Filters\FacilitatorExternalFilters;
+use App\Services\common\ExportService;
+use App\Services\DischargeTaskService;
+use App\Services\FacilitatorService;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Http\Request;
+
+class FacilitatorExternalController extends Controller
+{
+    // 卸货队可访问的页面
+    use AsyncResponse;
+
+    // 查询页面
+    public function index(Request $request,$id)
+    {
+        $facilitator =  Facilitator::query()->fromQuery('select * from facilitators where MD5(id) = ?',[$id])->first();
+        if(!$facilitator)return redirect('exception.404');
+
+        $request['id'] = $id;
+        $filters = new FacilitatorExternalFilters($request);
+
+        $facilitatorStatements = DischargeTask::query()
+            ->selectRaw('sum( discharge_tasks.expenditure_total_cost ) total_cost,' . ' count( 1 ) sum , ' . ' facilitators.name facilitators_name,' . ' facilitators.id id,' . " DATE_FORMAT( discharge_tasks.created_at, '%Y-%m' ) months ")
+            ->leftJoin('facilitators', 'discharge_tasks.facilitator_id', '=', 'facilitators.id')
+            ->filter($filters)
+            ->groupBy('months', 'facilitator_id')
+            ->orderByDesc('months')
+            ->paginate($request['paginate'] ?? 50);
+
+        return view('personnel.discharge.facilitator.external.index',compact('facilitatorStatements','id'));
+    }
+
+    // 下载
+    public function export(Request $request,$id)
+    {
+        $request['id'] = $id;
+        $filters = new FacilitatorExternalFilters($request);
+
+        /** @var Collection $facilitatorStatements */
+        $facilitatorStatements = DischargeTask::query()
+            ->filter($filters)
+            ->with('facilitator')
+            ->select(['id', 'facilitator_id', 'expenditure_amount', 'expenditure_unit', 'expenditure_unit_price', 'expenditure_total_cost', 'expenditure_remark', 'created_at'])
+            ->whereNotNull('facilitator_id')
+            ->where('facilitator_id', '!=', '0')
+            ->orderByDesc('id')->get();
+
+        $row = ['日期', '装卸队', '数量', '单位', '单价', '总金额合计'];
+        $json = app('DischargeTaskService')->getFacilitatorStatementsJson($facilitatorStatements);
+
+        return app(ExportService::class)->json($row, $json, "卸货结算报表");
+    }
+
+}

+ 5 - 1
app/Http/Controllers/PriceModelController.php

@@ -1164,6 +1164,8 @@ class PriceModelController extends Controller
             "strategy"          => request("strategy"),
             "feature"           => request("feature"),
             "type_mark"         => request()->has("type_mark") ? \request("type_mark") : null,
+            "surcharge"         => request("surcharge") ? request("surcharge") : null,
+            "surcharge_unit_id" => request("surcharge_unit_id") ? request("surcharge_unit_id") : null,
             "remark"            => request("remark"),
             "discount_count"    => implode(",",request("discount_count")),
             "total_price"       => request("total_price"),
@@ -1174,7 +1176,7 @@ class PriceModelController extends Controller
             if ($model->operation){
                 app('OwnerPriceOperationService')->findUpdate($model,$operation);
                 $delete = [];//需要删除子项
-                $update = [["id","strategy","amount","unit_id","unit_price","feature","discount_price"]];//需要更新子项
+                $update = [["id","strategy","amount","unit_id","unit_price","feature","discount_price","odd_price"]];//需要更新子项
                 $insert = [];//需要新增子项
                 foreach ($params["items"] as $item){
                     $obj = [
@@ -1183,6 +1185,7 @@ class PriceModelController extends Controller
                         "unit_id"   => $item["unit_id"],
                         "unit_price"=> $item["unit_price"],
                         "feature"   => $item["feature"] ?? null,
+                        "odd_price" => $item["odd_price"] ?? null,
                         "discount_price"   => implode(",",$item["discount_price"] ?? []),
                     ];
                     if (isset($item["id"])){
@@ -1209,6 +1212,7 @@ class PriceModelController extends Controller
                     $temp["discount_price"]  = implode(",",$item["discount_price"] ?? []);
                     $temp["owner_price_operation_id"] = $model->id;
                     $temp["feature"] = $item["feature"] ?? null;
+                    $temp["odd_price"] = $item["odd_price"] ?? null;
                     $temp["strategy"] = $item["strategy"];
                     $temp["amount"] = $item["amount"];
                     $temp["unit_id"] = $item["unit_id"];

+ 54 - 325
app/Http/Controllers/TestController.php

@@ -26,6 +26,7 @@ use App\Events\CancelOrder;
 use App\Events\SendEmailEvent;
 use App\Exceptions\Exception;
 use App\Http\Controllers\api\thirdPart\haiq\PickStationController;
+use App\Http\Controllers\api\thirdPart\hengli\PackageController;
 use App\Http\Requests\ForeignHaiRobotic_taskUpdateRequest;
 use App\Http\Requests\TestAaRequest;
 use App\Imports\OrderTrackingImport;
@@ -61,7 +62,6 @@ use App\Owner;
 use App\OwnerFeeDetail;
 use App\OwnerFeeDetailLogistic;
 use App\OwnerPriceExpress;
-use App\OwnerPriceExpressProvince;
 use App\OwnerPriceOperation;
 use App\OwnerPriceOperationItem;
 use App\OwnerReport;
@@ -83,6 +83,7 @@ use App\Services\CacheService;
 use App\Services\CommodityService;
 use App\Services\common\BatchUpdateService;
 use App\Services\common\DataHandlerService;
+use App\Services\common\QueryService;
 use App\Services\DocWaveHeaderService;
 use App\Services\FeatureService;
 use App\Services\InventoryCompareService;
@@ -101,13 +102,11 @@ use App\Services\OrderTrackingOwnerService;
 use App\Services\OrderTrackingService;
 use App\Services\OwnerPriceOperationService;
 use App\Services\OwnerService;
-use App\Services\ProcurementWeiXinSendMessageService;
 use App\Services\RegionService;
 use App\Services\RejectedBillService;
 use App\Services\ShopService;
 use App\Services\StoreService;
 use App\Services\WarehouseService;
-use App\Station;
 use App\StationRuleBatch;
 use App\StationTask;
 use App\StationTaskMaterialBox;
@@ -160,6 +159,12 @@ class TestController extends Controller
     {
         return call_user_func([$this, $method], $request);
     }
+
+    public function test()
+    {
+        return view("test");
+    }
+
     public function assignBatch(){
         $batches = collect([
             [
@@ -271,13 +276,22 @@ class TestController extends Controller
     {
         app('ForeignHaiRoboticsService')->markBinProcessed(
             '1',
-            'IDE0005680',
+            'IDE0005714',
             true,
             "2021-56-24 05-03-15",
             '',
             true
         );
     }
+    function hHasTaken(Request $request)
+    {
+        app('ForeignHaiRoboticsService')->taskUpdate(
+            301
+            ,1
+            ,0
+            ,'IDE0005714'
+        );
+    }
     function hBatch(Request $request)
     {
         $a=[
@@ -302,6 +316,9 @@ class TestController extends Controller
 
     function packageT(Request $request)
     {
+
+        $stationTaskBatch=app('StationTaskBatchService')->get(['batch_id'=>93037])->first();
+        dd($stationTaskBatch['id']??null);
     }
 
     function injectJS(Request $request)
@@ -544,7 +561,6 @@ class TestController extends Controller
         });
         dd($authorities);
     }
-
     public function output2()
     {
         StationTaskBatch::query()->insert([[
@@ -717,7 +733,7 @@ class TestController extends Controller
 
     public function reNewBatches3()
     {
-        $batches = Batch::query()->where('id', '>', 84301)->get('code');
+        $batches = Batch::query()->where('id', '>', 94486)->get('code');
         $batchCodes = $batches->map(function ($batch) {
             return $batch['code'];
         })->toArray();
@@ -744,7 +760,7 @@ class TestController extends Controller
 //        dd($logs);
         foreach ($batchCodes as $code) {
 //            $request=Cache::get('temp'.$code)['description'];
-            $request = Log::query()->select('description')->where('CREATED_AT', '>=', '2021-03-05')
+            $request = Log::query()->select('description')->where('CREATED_AT', '>=', '2021-04-05')
                 ->where('method', "issued_newBatch")
                 ->where('description', 'like', "%{$code}%")
                 ->first();
@@ -762,40 +778,6 @@ class TestController extends Controller
     }
 
 
-    public function testSyncOrderTask()
-    {
-        Cache::flush();
-        dump('hendle...');
-        dump((string)Carbon::now());
-        dump(memory_get_usage() / 1024 / 1024);
-        $task = new SyncWMSOrderTask();
-        $task->handle();
-        dump((string)Carbon::now());
-        dump('hendle...end');
-        dump(memory_get_usage() / 1024 / 1024);
-        dump(memory_get_peak_usage() / 1024 / 1024);
-        return view('test');
-    }
-
-    public function testSyncWaveNo()
-    {
-        $waveHeader = OracleDOCWaveHeader::query()->where('waveno', 'W201209000024')->first();
-//        Batch::query()->create([
-//            'code' => $waveHeader->waveno,
-//            'wms_created_at' => $waveHeader->addtime,
-//            'remark' => $waveHeader->descr,
-//            'wms_status' => '99',
-//        ]);
-        $waveHeaderDetails = OracleDOCWaveDetails::query()->where('waveno', $waveHeader->waveno)->get();
-        $orderNos = $waveHeaderDetails->map(function ($item) {
-            return $item->orderno;
-        });
-        $orderHeaderService = new OracleDOCOrderHeaderService();
-        $orderHeaders = $orderHeaderService->getOrderInfoByOrderNos($orderNos);
-        $orderService = new OrderService();
-        $orderService->syncOrderByWMSOrderHeaders($orderHeaders);
-    }
-
 
     public function testUpdateSkuNameBarcodeToCommodity_id()
     {
@@ -841,145 +823,42 @@ class TestController extends Controller
         if (count($updateParams) > 0) app(BatchUpdateService::class)->batchUpdate('store_items', $updateParams);
     }
 
-    public function syncOrderTrackingTask()
-    {
-        $service = new OrderTrackingService();
-        $start_data = Carbon::parse('2020-12-21 10:00:00');
-        $end_data = Carbon::parse('2020-12-21 10:05:00');
-        $orderNos = OracleDOCOrderHeader::query()->selectRaw('orderno')
-            ->where('addTime', '>=', $start_data)
-            ->where('addTime', '<=', $end_data)
-            ->get()->map(function ($orderHeader) {
-                return $orderHeader->orderno;
-            });
-        $order_no_list = $orderNos->chunk(3000);
-        foreach ($order_no_list as $order_nos) {
-            $orderHeaders = OracleDOCOrderHeader::query()->selectRaw(implode(',', OracleDOCOrderHeaderService::$columns))
-                ->with(['oracleBASCustomer' => function ($query) {
-                    $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
-                }, 'oracleDOCOrderDetails' => function ($query) {
-                    $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered,doc_order_details.Location');
-                }, 'actAllocationDetails' => function ($query) {
-                    $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku,ACT_Allocation_Details.Location');
-                }, 'oracleBASCode' => function ($query) {
-                    $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-                }, 'orderType' => function ($query) {
-                    $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-                }])
-                ->whereIn('DOC_Order_Header.OrderNo', $order_nos)
-                ->get();
-            app(OrderService::class)->syncOrderByWMSOrderHeaders($orderHeaders);
-            app("OrderCommodityService")->syncOrderCommodity($orderHeaders);
-            app('OrderPackageService')->syncOrderPackage($orderHeaders);
-            app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);
-            $service->createByWmsOrderHeader($orderHeaders);
-            unset($orderHeaders);
-        }
-    }
-
-    public function syncOrderTask()
+    function testUpdateStores()
     {
-        $service = new OrderService();
-        $start_data = Carbon::parse('2020-12-21 10:00:00');
-        $end_data = Carbon::parse('2020-12-21 11:00:00');
-        $orderNos = OracleDOCOrderHeader::query()->selectRaw('orderno')
-            ->where('addTime', '>=', $start_data)
-            ->where('addTime', '<=', $end_data)
-            ->get()->map(function ($orderHeader) {
-                return $orderHeader->orderno;
-            });
-        $order_no_list = $orderNos->chunk(3000);
-        foreach ($order_no_list as $order_nos) {
-            $orderHeaders = OracleDOCOrderHeader::query()->selectRaw(implode(',', OracleDOCOrderHeaderService::$columns))
-                ->with(['oracleBASCustomer' => function ($query) {
-                    $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
-                }, 'oracleDOCOrderDetails' => function ($query) {
-                    $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered,doc_order_details.Location');
-                }, 'actAllocationDetails' => function ($query) {
-                    $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku,ACT_Allocation_Details.Location');
-                }, 'oracleBASCode' => function ($query) {
-                    $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-                }, 'orderType' => function ($query) {
-                    $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-                }])
-                ->whereIn('DOC_Order_Header.OrderNo', $order_nos)
-                ->get();
-            $service->syncOrder($orderHeaders);
-            unset($orderHeaders);
+        $stores = Store::query()->where('stored_method', '快速入库')->get();
+        $updated_at = Carbon::now()->toDateTimeString();
+        $updateParams = [[
+            'id', 'is_fast_stored', 'updated_at'
+        ]];
+        foreach ($stores as $store) {
+            if ($store->stored_method != '快速入库') continue;
+            $updateParams[] = [
+                'id' => $store->id,
+                'is_fast_stored' => '快速入库',
+                'updated_at' => $updated_at,
+            ];
         }
+        if (count($updateParams) > 1) app(BatchUpdateService::class)->batchUpdate('stores', $updateParams);
     }
 
-    public function testOrderissue()
+    public function testSyncAsn()
     {
-        $orderIssue_unique = \App\OrderIssue::withTrashed()
-            ->selectRaw('count(1) as count,id,order_id')
-            ->whereNotNull('order_id')
-            ->orderByDesc('created_at')
-            ->groupBy('order_id')
-            ->having('count', '>', 1)
-            ->limit(100)
-            ->get();
-        if ($orderIssue_unique->count() == 0) return;
-        foreach ($orderIssue_unique as $item) {
-            $orderIssue_delete = OrderIssue::withTrashed()->where('order_id', $item->order_id)->get();
-            /** @var OrderIssue $order_issue_unique */
-            $order_issue_unique = $orderIssue_delete->whereNull('deleted_at')->first();
-            if (!$order_issue_unique) $order_issue_unique = $orderIssue_delete->first();
-            $ids = [];
-            foreach ($orderIssue_delete as $key => $order_issue) {
-                if ($order_issue->id == $order_issue_unique->id) continue;
-                $ids[] = $order_issue->id;
-                if ($order_issue['logistic_number_return']) $order_issue_unique['logistic_number_return'] = $order_issue['logistic_number_return'];
-                if ($order_issue['rejecting_status'] != '未退回') $order_issue_unique['rejecting_status'] = $order_issue['rejecting_status'];
-                if ($order_issue['is_new_rejecting'] != '无') $order_issue_unique['is_new_rejecting'] = $order_issue['is_new_rejecting'];
-                if ($order_issue['user_workgroup_id']) $order_issue_unique['user_workgroup_id'] = $order_issue['user_workgroup_id'];
-                if ($order_issue['imported_status'] != '正常') $order_issue_unique['imported_status'] = $order_issue['imported_status'];
-                if ($order_issue['custom_code']) $order_issue_unique['custom_code'] = $order_issue['custom_code'];
-            }
-            $order_issue_unique->save();
-            app('LogService')->log(__METHOD__, __FUNCTION__, '修改OrderIssue:' . json_encode($order_issue_unique));
-            $orderIssues = OrderIssue::query()->whereIn('id', $ids)->get();
-            $bool = OrderIssue::query()->whereIn('id', $ids)->forceDelete();
-            if ($bool) app('LogService')->log(__METHOD__, __FUNCTION__, '删除OrderIssue:' . json_encode($orderIssues));
-        }
+//        dump('hendle...');
+        dump((string)Carbon::now());
+//        dump(memory_get_usage() / 1024 / 1024);
+        $task = new WasSyncWmsAsnInformation();
+        $task->handle();
+        dump((string)Carbon::now());
+//        dump('hendle...end');
+//        dump(memory_get_usage() / 1024 / 1024);
+//        dump(memory_get_peak_usage() / 1024 / 1024);
+//        return view('test');
     }
 
-    public function testChangeOrderTracking()
+    public function editOrderSyncAt()
     {
-        /** @var OrderTrackingService $service */
-        $service = app(OrderTrackingService::class);
-        $maxId = \App\OrderTracking::query()->orderByDesc('id')->first();
-        $orderTracking_min = \App\OrderTracking::query()->where('logistic_id', 0)->orderBy('id')->first();
-        if (!$maxId) return;
-        $maxId = $maxId->id;
-        $minId = $orderTracking_min->id;
-        $logistic = \App\Logistic::query()->where('name', '新杰物流')->first();
-        $logistic_zt = \App\Logistic::query()->where('name', '自提')->first();
-        for ($i = $minId; $i <= $maxId; $i += 100) {
-            $orderTrackings = \App\OrderTracking::query()
-                ->where('id', '>=', $i)
-                ->where('id', '<=', $i + 100)
-                ->where('logistic_id', '=', 0)
-                ->where('created_at', '!=', '0000-00-00 00:00:00')
-                ->get();
-            if ($orderTrackings->count() == 0) continue;
-            $update_params = [['id', 'logistic_id']];
-            $orderTrackings->each(function ($orderTracking) use ($logistic_zt, $logistic, &$update_params) {
-                $order = $orderTracking->commodities->package->order;
-                $logistic_id = $order->logistic_id;
-                if ($logistic_id != null) {
-                    if ($order->logistic_id == $logistic_zt->id) $logistic_id = $logistic->id;
-                    if ($logistic_id == 0) dd($order, $logistic_id);
-                    $update_params[] = [
-                        'id' => $orderTracking->id,
-                        'logistic_id' => $logistic_id,
-                    ];
-                }
-            });
-            if (count($update_params) > 1) {
-                $service->batchUpdate($update_params);
-            }
-        }
+        ValueStore::query()->where('name', 'order_last_created_sync_at')->update(['value' => '2020-12-22 09:00:00']);
+        ValueStore::query()->where('name', 'order_last_updated_sync_at')->update(['value' => '2020-12-22 09:00:00']);
     }
 
     public function testHz()
@@ -1038,100 +917,6 @@ class TestController extends Controller
         $controller->index();
     }
 
-    public function processOrderIssueRejectedBill()
-    {
-        OrderIssue::query()->withTrashed()->whereNotNull('logistic_number_return')->chunkById(200, function ($orderIssues) {
-            $orderIssues->each(function ($orderIssue) {
-                if ($orderIssue->logistic_number_return)
-                    $orderIssue->rejectedBills()->syncWithoutDetaching([trim($orderIssue->logistic_number_return)]);
-            });
-        });
-    }
-
-    public function SyncOrderTracking()
-    {
-        $start_data = Carbon::parse('2021-01-01 00:00:00');
-        $service = new OrderTrackingService();
-        $service->trackingWmsOrderOnCreate($start_data);
-    }
-
-    public function SyncUpdateOrderTracking()
-    {
-        $start_data = Carbon::parse('2021-01-14 00:00:00');
-        $service = new OrderTrackingService();
-        $service->trackingWmsOrderOnEdit($start_data);
-    }
-
-    public function orderTrackingUpdate()
-    {
-        $start_at = '2021-01-08 00:00:00';
-        $end_at = '2021-01-12 00:00:00';
-        // 修改【安桥,锐活】 订单号
-        $orderHeaderService = new OracleDOCOrderHeaderService();
-        $orderTrackingService = new OrderTrackingService();
-        $query = $orderHeaderService->getQuery();
-        $orderHeaders = $query->whereIn('Doc_Order_Header.customerid', ['ONKYO', 'RUIHUO'])
-            ->where('Doc_Order_Header.AddTime', '>=', $start_at)
-            ->where('Doc_Order_Header.AddTime', '<=', $end_at)
-            ->get();
-        $orderTrackingService->updateByWmsOrderHeaders($orderHeaders);
-    }
-
-    public function updateOrderTracking()
-    {
-        OrderTracking::query()->with(['commodities' => function ($query) {
-            $query->with(['commodity', 'package.order']);
-        }])->whereNotNull('client')
-            ->where('created_at', '>=', '2021-01-01')
-            ->where('created_at', '<=', '2021-01-07')
-            ->where('created_at', '!=', '0000-00-00 00:00:00')
-            ->chunkById('200', function ($orderTrackings) {
-                /**
-                 * @var DataHandlerService $dataService
-                 */
-                $service = new OrderTrackingService();
-                $update = [];
-                $update[] = ['id', 'order_client_code_wms'];
-                foreach ($orderTrackings as $orderTracking) {
-                    if ($orderTracking->commodities->order ?? false) {
-                        $update = [
-                            'id' => $orderTracking->id,
-                            'order_client_code_wms' => $orderTracking->commodities->order->client_code
-                        ];
-                    }
-                }
-                if (count($update) > 1) {
-                    $service->batchUpdate($update);
-                }
-            });
-    }
-
-    public function deleteOrderTracking()
-    {
-        $deleteId_arr = [];
-        $deleteCommoditiesId_arr = [];
-        OrderTracking::query()->with(['commodities.package'])
-            ->where('created_at', '!=', '0000-00-00 00:00:00')
-            ->chunkById('200', function ($orderTrackings) use (&$deleteId_arr, &$deleteCommoditiesId_arr) {
-                $deleteIds = [];
-                $deleteCommoditiesId = [];
-                foreach ($orderTrackings as $orderTracking) {
-                    if (!($orderTracking->commodities->package ?? false)) {
-                        $deleteIds[] = $orderTracking->id;
-                        if ($orderTracking->commodities) {
-                            $deleteCommoditiesId[] = $orderTracking->commodities->id;
-                        }
-                    }
-                }
-                if ($deleteIds) {
-                    $deleteId_arr[] = $deleteIds;
-                    $deleteCommoditiesId_arr[] = $deleteCommoditiesId;
-                    OrderTracking::query()->whereIn('id', $deleteIds)->delete();
-                    OrderPackageCommodities::query()->whereIn('id', $deleteCommoditiesId)->delete();
-                }
-            });
-    }
-
     public function updateRejectBillCheckedStatus()
     {
         $time = Carbon::parse("2021-01-22 00:00:00")->subDays(15)->toDateTimeString();
@@ -1148,60 +933,7 @@ class TestController extends Controller
         }
     }
 
-    public function clearCancelledOrder()
-    {
-        $wave_nos = ['W210129000248', 'W210202000216', 'W210202000251', 'W210202000216', 'W210202000282'];
-        $order_nos = ['SO210129004112', 'SO210202003333', 'SO210202003333', 'SO210202003236', 'SO210202003247', 'SO210202003719'];
-        try {
-            OracleDOCWaveDetails::query()->whereIn('WaveNo', $wave_nos)->whereIn('OrderNo', $order_nos)->delete();
-            app('LogService')->log(__CLASS__, __METHOD__, 'Delete OracleDOCWaveDetails' . '  ' . json_encode($order_nos) . json_encode($wave_nos));
-        } catch (Exception $e) {
-            app('LogService')->log(__CLASS__, __METHOD__, 'Error clearCancelledOrder' . json_encode($order_nos) . json_encode($wave_nos));
-        }
-    }
-
-    public function syncOrderByWaveNo(Request $request)
-    {
-        $input = $request->input('wave');
-        if (!$input) {
-            echo 'no wave code!';
-        } else {
-            echo 'syncing ' . $input;
-            return;
-        }
-        $oracleDOCOrderHeaderService = new OracleDOCOrderHeaderService();
-        $orderService = new OrderService();
-        $waveNos = [$input];
-        $orderHeaders = OracleDOCOrderHeader::query()
-            ->selectRaw(implode(',', OracleDOCOrderHeaderService::$columns))
-            ->whereIn('WaveNo', $waveNos)
-            ->get();
-        $orderHeaderList = $orderHeaders->chunk(2000);
-        foreach ($orderHeaderList as $item) {
-            $item = $oracleDOCOrderHeaderService->loadMissing($item);
-//            $last_order = $item->first();                                                               // 时间点靠后的
-//            $newest_orders = $item->where('addtime',$last_order->addtime);
-            if (count($orderHeaders) > 0) {
-                $orderService->syncOrder($item);                                             //  同步订单
-            }
-        }
-    }
 
-    public function syncOrderByWaveNo2(Request $request)
-    {
-        $oracleDOCOrderHeaderService = new OracleDOCOrderHeaderService();
-        $orderService = new OrderService();
-        $waveNos = ['W210220000010', 'W210220000009'];
-        $orderHeaders = OracleDOCOrderHeader::query()
-            ->selectRaw(implode(',', OracleDOCOrderHeaderService::$columns))
-            ->whereIn('WaveNo', $waveNos)
-            ->get();
-        $orderHeaderList = $orderHeaders->chunk(2000);
-        foreach ($orderHeaderList as $item) {
-            $item = $oracleDOCOrderHeaderService->loadMissing($item);
-            $orderService->syncOrder($item);
-        }
-    }
 
     public function updateLaborReport()
     {
@@ -1233,12 +965,9 @@ class TestController extends Controller
         dd($procurementQuotations->toJson());
     }
 
-    public function syncOrdersHeader()
+    public function testWeight(Request $request )
     {
-        $service  =new OracleDOCOrderHeaderService();
-        $orderService = new  OrderService();
-        $edit_date =  "2021-03-14 22:04:30";
-        $syncOrderHeader = $service->getQuery()->where('editTime',">=",$edit_date)->whereNotIn("SOStatus",["90","99"])->get();
-        $orderService->syncOrder($syncOrderHeader);
+
+        Log::query()->create(['method'=>'test hengli','description'=>json_encode($request->all())]);
     }
 }

+ 2 - 3
app/Http/Controllers/WaybillPriceModelController.php

@@ -6,7 +6,6 @@ use App\Region;
 use App\WaybillPriceModel;
 use App\Events\WaybillPriceModelEvent;
 use App\Imports\WaybillPriceModelsImport;
-use App\Province;
 use App\Unit;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -21,7 +20,7 @@ class WaybillPriceModelController extends Controller
     {
         if(!Gate::allows('计费模型-查询')){ return redirect(url('/'));  }
         $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
-        $provinces=Province::query()->get();
+        $provinces=Region::query()->where("type",1)->get();
         $data=$request->input();
         $waybillPriceModels= WaybillPriceModel::query()->with(["logistic","province","city","unit"])->orderBy('id', 'DESC');
         if ($data){
@@ -159,7 +158,7 @@ class WaybillPriceModelController extends Controller
             'WaybillPriceModel.province_id'=>'required|integer',
             'WaybillPriceModel.logistic_id'=>'required|integer',
             'WaybillPriceModel.unit_id'=>'required|integer',
-            'WaybillPriceModel.city_id'=>'nullable|Integer',
+            'WaybillPriceModel.city_id'=>'nullable|integer',
             'WaybillPriceModel.range_min'=> 'nullable|min:0|numeric|max:999999',
             'WaybillPriceModel.range_max'=> "nullable|min:{$min}|numeric|max:999999",
             'WaybillPriceModel.unit_price'=>'required|min:0|numeric|max:999999',

+ 1 - 0
app/Http/Controllers/api/thirdPart/flux/WaybillController.php

@@ -82,6 +82,7 @@ class WaybillController extends Controller
                 'recipient'=>$receiveInputting['ConsigneeName']??'',
                 'recipient_mobile'=>$recipient_mobile??'',
                 'source_bill'=>$receiveInputting['ReservedField01']??'',
+                'is_to_pay'=>strstr($receiveInputting['CarrierID']??'','DF')===false ? 0 : 1,
                 'destination_city_id'=>app(RegionService::class)->getCity($receiveInputting['C_City']),
             ]);
             $dflist=config('merchantsInfo.waybill.DFList');

+ 4 - 9
app/Http/Controllers/api/thirdPart/haiq/StorageController.php

@@ -38,22 +38,17 @@ class StorageController
             "priority" => 99,//优先级 1-2147483647 1最低
             "sequenceFlag" => -1,//是否需要有序 1:需要有序 0:不需要有序
             "bins" => [$bin],//可执行货箱任务
-        ]];*/
+        ]];*///IDE0005714,IDE0004970
         $this->post = [[
             "taskMode"      => 1,
             "bins"=>[[
                 "taskCode"  =>'t'.microtime(true),
-                "binCode"   => "IDE0005665",
+                "binCode"   => "IDE0005714",
                 "fromLocCode" => "BIN-IN1",
                 "toLocCode" => "",
             ],[
                 "taskCode"  =>'t1'.microtime(true),
-                "binCode"   => "IDE0005656",
-                "fromLocCode" => "BIN-IN1",
-                "toLocCode" => "",
-            ],[
-                "taskCode"  =>'t2'.microtime(true),
-                "binCode"   => "IDE0005657",
+                "binCode"   => "IDE0004970",
                 "fromLocCode" => "BIN-IN1",
                 "toLocCode" => "",
             ],],
@@ -254,7 +249,7 @@ class StorageController
            return ['success'=>false,"data"=>$response["msg"]];
         }
         app('LogService')->log(__METHOD__,"haiq-料箱出库成功","REQUEST:".json_encode($this->post)." | RESPONSE:".$response);
-        return ["success"=>true];
+        return ["success"=>true,'data'=>$response->body()];
     }
     public function light(Request $request,$post){
         $response = Http::post(config('api.haiq.storage.light'),$post);

+ 87 - 0
app/Http/Controllers/api/thirdPart/hengli/PackageController.php

@@ -0,0 +1,87 @@
+<?php
+
+
+namespace App\Http\Controllers\api\thirdPart\hengli;
+
+use App\Http\Controllers\api\thirdPart\weight\WeightBaseController;
+use App\Log;
+use Illuminate\Http\Request;
+
+class PackageController extends WeightBaseController
+{
+    // 参数
+    protected $weight = 'weight';     // 重量
+    protected $length = 'length';     // 长
+    protected $width = 'width';      // 宽
+    protected $height = 'height';     // 高
+    protected $code = 'code';       // 快递单号
+    protected $weight_at = 'weight_at';  // 称重时间
+    protected $hid = 'hid';        // 称重设备id
+    protected $name = 'HengLi';       // 名称
+
+    public function new_(Request $request)
+    {
+        app('LogService')->log(__METHOD__, $this->name, "上传信息:".  json_encode($request->getContent()));
+        return $this->new($request);
+    }
+
+    public function conversionRequest($request)
+    {
+        $params = [];
+        $arr = $request->all();
+        $data = array_key_first($arr);
+        $data = explode(',',$data);
+        foreach ($data as $key=>$value){
+            switch ($key){
+                case '0':
+                    $params['hid'] = $value;
+                    break;
+                case '1':
+                    $params['code'] = $value;
+                    break;
+                case '2':
+                    $params['weight'] =  $value;
+                    break;
+                case '3':
+                    $params['weight_at'] = $value;
+                    break;
+                default:
+                    break;
+            }
+        }
+        return $params;
+    }
+
+    public function getWeightValue($params)
+    {
+        $value = $this->getValue($this->weight,$params);
+        return str_replace('_','.',$value);
+    }
+
+    // 信息返回
+
+    // 返回称重成功信息
+    public function getSuccessMessage($params, $orderPackage): array
+    {
+        return ['success' => true, 'message' => '称重成功'];
+    }
+
+    // 返回包裹未找到异常
+    public function getNotFindOrderPackageMessage($params, $orderPackage): string
+    {
+        return json_encode(['success'=>false,'message'=>'未找打包裹信息',JSON_UNESCAPED_UNICODE]);
+    }
+
+    // 返回富勒信息未找到异常
+    public function getNotFindOrderHeaderMessage($params, $orderPackage):string
+    {
+        return json_encode(['success'=>false,'message'=> '富勒信息未找到'],JSON_UNESCAPED_UNICODE);
+    }
+
+    // 返回称重下发错误
+    public function getWeightMessage($orderPackage,$e)
+    {
+        return json_encode(['success'=>false,'message'=> $e->getMessage],JSON_UNESCAPED_UNICODE);
+    }
+
+}

+ 344 - 0
app/Http/Controllers/api/thirdPart/weight/WeightBaseController.php

@@ -0,0 +1,344 @@
+<?php
+
+
+namespace App\Http\Controllers\api\thirdPart\weight;
+
+
+use App\Events\WeighedEvent;
+use App\Jobs\WeightUpdateInstantBill;
+use App\MeasuringMachine;
+use App\OracleActAllocationDetails;
+use App\OracleDOCOrderHeader;
+use App\OrderPackage;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+
+class WeightBaseController
+{
+
+    protected $weight = '';     // 重量
+    protected $length = '';     // 长
+    protected $width = '';      // 宽
+    protected $height = '';     // 高
+    protected $code = '';       // 快递单号
+    protected $weight_at = '';  // 称重时间
+    protected $hid = '';        // 称重设备id
+    protected $name = '';       // 名称
+
+    public function new(Request $request)
+    {
+        app('LogService')->log(__METHOD__, 'WeightBaseController', "记录上传日志:" . json_encode($request->getContent()) . '||' , null);
+
+        $errors = $this->validator($request);
+        if(count($errors)){
+            return $this->validatorErrors($errors);
+        }
+        return $this->weightOrderPackage($request);
+    }
+
+    public function weightOrderPackage(Request $request)
+    {
+        /**
+         * @var OrderPackage $orderPackage
+         * @var MeasuringMachine $measuringMachine
+         */
+        // 1、转化数据
+        $params = $this->conversionRequest($request);
+
+        // 2.获取快递单号
+        $logistic_number = $this->getCodeValue($params);
+        // 3、获取称重设备
+        $measuringMachine = $this->getMeasuringMachine($params);
+        // 4、快递单号对应的OrderPackage
+        $orderPackage = $this->getOrderPackageByCode($logistic_number);
+        if (is_null($orderPackage)) {
+            /** @var OracleDOCOrderHeader $orderHeader */
+            $orderHeader = $this->findOrderHeaderByLogisticNumber($logistic_number);
+            if (is_null($orderHeader)) {
+                return $this->getNotFindOrderHeaderMessage($params, $orderPackage);
+            }
+            try {
+                $order = $this->createOrderByOrderHeader($orderHeader);
+                $orderPackage = $this->createOrderPackage($params, $measuringMachine, $order);
+            } catch (\Exception $e) {
+                return json_encode(["success" => false, "message" => "写入WAS失败!"], JSON_UNESCAPED_UNICODE);
+            }
+        }
+        // 5、更新包裹信息
+        $bool = $this->updateOrderPackage($orderPackage, $params, $measuringMachine);
+        if (!$bool) return $this->getUpdatePackageMessage($orderPackage);
+        // 6、处理波次信息
+        try {
+            $this->activityWaveNoProcessing($orderPackage);
+        } catch (\Exception $e) {
+            app('LogService')->log(__METHOD__, $this->name, ' weightApi (Error)', json_encode($orderPackage) . '||' . json_encode($e), null);
+            return $this->getWeightMessage($orderPackage, $e);
+        }
+        // 7、称重完成之后操作
+        $this->afterApply($orderPackage);
+        $response = $this->getSuccessMessage($params, $orderPackage);
+        app('LogService')->log(__METHOD__, $this->name, "下发写入包裹成功:" . json_encode($request->getContent()) . '||' . json_encode($response), null);
+        return json_encode($response, JSON_UNESCAPED_UNICODE);
+    }
+
+// region ---数据转化
+
+    public function conversionRequest(Request  $request)
+    {
+        //  1、转化数据
+        $params = [];
+        foreach ($request->input() as $key => $item) {
+            $params[strtolower($key)] = $item;
+        }
+        return $params;
+    }
+// endregion
+
+
+//  region ---称重完成之后的操作
+    // 后续操作
+    public function afterApply(OrderPackage $orderPackage)
+    {
+        $orderPackage->loadMissing(['order' => function ($query) {
+            $query->with('owner', 'logistic');
+        }, 'measuringMachine', 'paperBox']);
+        event(new WeighedEvent($orderPackage));
+        dispatch(new WeightUpdateInstantBill($orderPackage));
+    }
+// endregion
+
+// region ---消息返回
+
+    // 返回称重成功信息
+    public function getSuccessMessage($params, $orderPackage): array
+    {
+        return ['success' => true, 'message' => '称重成功'];
+    }
+
+    // 返回包裹未找到异常
+    public function getNotFindOrderPackageMessage($params, $orderPackage): string
+    {
+        return json_encode(['success' => false, 'message' => '未找打包裹信息', JSON_UNESCAPED_UNICODE]);
+    }
+
+    // 返回富勒信息未找到异常
+    public function getNotFindOrderHeaderMessage($params, $orderPackage): string
+    {
+        return json_encode(['success' => false, 'message' => '富勒信息未找到'], JSON_UNESCAPED_UNICODE);
+    }
+
+    // 返回称重下发错误
+    public function getWeightMessage($orderPackage, $e)
+    {
+        return json_encode(['success' => false, 'message' => $e->getMessage], JSON_UNESCAPED_UNICODE);
+    }
+
+    public function getUpdatePackageMessage($orderPackage)
+    {
+        return json_encode(['success' => false, 'message' => '更新包裹信息出现异常'], JSON_UNESCAPED_UNICODE);
+    }
+
+// endregion
+
+//  region  ---参数校验
+
+    public function validator(Request $request): array
+    {
+        return [];
+    }
+
+    public function validatorErrors($errors)
+    {
+        return json_encode(['success' => false, 'message' => '更新包裹信息出现异常'.json_encode($errors)],JSON_UNESCAPED_UNICODE);
+    }
+
+// endregion
+
+// region  ---参数获取
+    // 重量
+    public function  getWeightValue($params)
+    {
+        return $this->getValue($this->width, $params);
+    }
+
+    // 高
+    public function getHeightValue($params)
+    {
+        return $this->getValue($this->height, $params);
+    }
+
+    // 长
+    public function getLengthValue($params)
+    {
+        return $this->getValue($this->length, $params);
+    }
+
+    // 宽
+    public function getWidthValue($params)
+    {
+        return $this->getValue($this->width, $params);
+    }
+
+    // 快递单号
+    public function getCodeValue($params)
+    {
+        return $this->getValue($this->code, $params);
+    }
+
+    // 称重时间
+    public function getWeightAtValue($params)
+    {
+        return $this->getValue($this->weight_at, $params);
+    }
+
+    // 获取参数
+    public function getValue($name, $param)
+    {
+        $names = explode(',', $name);
+        $value = array_reduce($names, function ($data, $key) {
+            if (isset($data[$key])) $data = $data[$key];
+            else $data = [];
+            return $data;
+        }, $param);
+        if (is_array($value) && count($value) == 0) return null;
+        return $value;
+    }
+
+    // 排序参数
+    public function getEdges($params): array
+    {
+        $length = $this->getLengthValue($params);
+        $height = $this->getHeightValue($params);
+        $width = $this->getWidthValue($params);
+        $edges = [$length ?? 0, $width ?? 0, $height ?? 0];
+        rsort($edges);
+        return $edges;
+    }
+
+
+// endregion
+
+//  region ---包裹
+    // 获取包裹
+    public function getOrderPackageByCode($code)
+    {
+        return OrderPackage::query()
+            ->with(['order' => function ($query) {
+                /** @var Builder $query */
+                $query->with('owner', 'logistic');
+            }])->where('logistic_number', $code)->first();
+    }
+
+    // 更新包裹
+    public function updateOrderPackage(OrderPackage $orderPackage, $params, $measuringMachine)
+    {
+        $edges = $this->getEdges($params);
+        $req_date = Carbon::now();
+        $orderPackage['weight'] = $this->getWeightValue($params);
+        $orderPackage['measuring_machine_id'] = $measuringMachine['id'];
+        $orderPackage['length'] = $edges[0];
+        $orderPackage['width'] = $edges[1];
+        $orderPackage['height'] = $edges[2];
+        $orderPackage['weighed_at'] = $req_date;
+        $orderPackage['bulk'] = $edges[0] * $edges[1] * $edges[2] / 1000;
+        if ($orderPackage->isActivityBatch()) {
+            $result = $this->activityWaveNoProcessing($orderPackage);
+            if (!$result) return false;
+        }
+        return $orderPackage->save();
+    }
+
+
+    // 创建包裹信息
+    public function createOrderPackage($params, $measuringMachine, $order)
+    {
+        $weighed_at = Carbon::now();
+        $edges = $this->getEdges($params);
+        OrderPackage::query()->create([
+            'order_id' => $order->id,
+            'logistic_number' => $this->getCodeValue($params),
+            'measuring_machine_id' => $measuringMachine->id,
+            'weight' => $this->getWeightValue($params),
+            'length' => $edges[0],
+            'width' => $edges[1],
+            'height' => $edges[2],
+            'bulk' => $edges[0] * $edges[1] * $edges[2],
+            'weighed_at' => $weighed_at,
+            'status' => "无",
+        ]);
+        return $this->getOrderPackageByCode($this->getCodeValue($params));
+    }
+
+
+//  endregion
+
+//  region ---称重设备
+    // 获取称重设备
+    public function getMeasuringMachine($params): MeasuringMachine
+    {
+        $hid = $this->getValue($this->hid, $params);
+        /** @var MeasuringMachine $measuringMachine */
+        $measuringMachine = MeasuringMachine::query()->firstOrCreate(['code' => $hid]); // 称重设备
+        $measuringMachine->turnOn();
+        $measuringMachine->turnOffInMinutes(30);
+        return $measuringMachine;
+    }
+//  endregion
+
+// region ---wms操作
+    // 获取orderHeader
+    public function findOrderHeaderByLogisticNumber($code)
+    {
+        $query = OracleActAllocationDetails::query()->select('order_no')->where('picktotraceid', $code);
+        return OracleDOCOrderHeader::query()->with('actAllocationDetails', 'oracleBASCode')->whereIn('Order_No', $query)->first();
+    }
+
+    // 根据WMS订单信息创建订单信息
+    public function createOrderByOrderHeader($orderHeader)
+    {
+        /** @var OrderService $orderService */
+        $orderService = app('OrderService');
+        $order_create_params = $orderService->getParamByOrderHeader($orderHeader);
+        $order = $orderService->first(['code' => $orderHeader->orderno]);
+        if ($order) return $order;
+        $order = $orderService->createOrder($order_create_params);
+        app('LogService')->log(__METHOD__, $this->name, ' 创建Order', json_encode($order) . " || " . $orderHeader);
+        return $order;
+    }
+
+    //处理活动波次
+    public function activityWaveNoProcessing(&$orderPackage)
+    {
+        $fluxController = new \App\Http\Controllers\api\thirdPart\flux\PackageController();
+        if ($orderPackage->isActivityBatch()) {
+            app('LogService')->log(__METHOD__, $this->name . " 依波次号同步所有包裹:", json_encode($orderPackage), null);
+            OrderPackage::query()->where('batch_number', $orderPackage['batch_number'])->update([
+                'weight' => $orderPackage['weight'] ?? null,
+                'length' => $orderPackage['length'] ?? null,
+                'width' => $orderPackage['width'] ?? null,
+                'height' => $orderPackage['height'] ?? null,
+                'bulk' => $orderPackage['bulk'] ?? null,
+                'measuring_machine_id' => $orderPackage['measuring_machine_id'] ?? null,
+                'weighed_at' => $orderPackage['weighed_at'] ?? null,
+                'paper_box_id' => $orderPackage['paper_box_id'] ?? null,
+            ]);
+            $result = $fluxController->markWMSOnBatch($orderPackage['batch_number'], $orderPackage['weight']);
+            if (!$result['result']) {
+                $orderPackage->uploaded_to_wms = "异常";
+            }
+        } else {
+            app('LogService')->log(__METHOD__, $this->name . " 写入包裹至WMS:", json_encode($orderPackage), null);
+            try {
+                $result = $fluxController->accomplishToWMS($orderPackage);
+                if ($result['result'] == 'success') $orderPackage->uploaded_to_wms = "是";
+                else $orderPackage->uploaded_to_wms = "异常";
+            } catch (\Exception $e) {
+                $orderPackage->uploaded_to_wms = "否";
+            }
+        }
+        return $orderPackage->save();
+    }
+// endregion
+}

+ 5 - 1
app/Http/Requests/DischargeTask/DischargeTaskRequest.php

@@ -5,7 +5,6 @@ namespace App\Http\Requests\DischargeTask;
 
 use App\Traits\RequestApiFormValidation;
 use Illuminate\Foundation\Http\FormRequest;
-use Illuminate\Support\Facades\Request;
 use Illuminate\Support\Facades\Route;
 
 
@@ -23,6 +22,7 @@ class DischargeTaskRequest extends FormRequest
         'owner_id' => 'required',
         'type' => 'required',
         'numbers' => 'required',
+        'warehouse_id' => 'required',
         'income_unit' => 'required',
         'income_amount' => 'required',
         'income_unit_price' => 'required',
@@ -31,14 +31,17 @@ class DischargeTaskRequest extends FormRequest
         'owner_id.required' => '货物为必选项',
         'type.required' => '任务类型为必选项',
         'numbers.required' => '入库单号为必填项',
+        'warehouse_id.required' => '仓库未必须选项',
         'income_amount.required' => '数量为必填项',
         'income_unit.required' => '单位为必选项',
         'income_unit_price.required'=> '单价为必填项',
+
     ];
     protected $updateApiRules =[
         'owner_id' => 'required',
         'type' => 'required',
         'numbers' => 'required',
+        'warehouse_id' => 'required',
         'income_unit' => 'required',
         'income_amount' => 'required',
         'income_unit_price' => 'required',
@@ -47,6 +50,7 @@ class DischargeTaskRequest extends FormRequest
         'owner_id.required' => '货物为必选项',
         'type.required' => '任务类型为必选项',
         'numbers.required' => '入库单号为必填项',
+        'warehouse_id.required' => '仓库未必须选项',
         'income_amount.required' => '数量为必填项',
         'income_unit.required' => '单位为必选项',
         'income_unit_price.required'=> '单价为必填项',

+ 5 - 4
app/Http/Requests/DischargeTask/FacilitatorRequest.php

@@ -2,8 +2,9 @@
 
 
 namespace App\Http\Requests\DischargeTask;
+
 use App\Traits\RequestApiFormValidation;
-use  Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Support\Facades\Route;
 
 class FacilitatorRequest extends FormRequest
@@ -45,7 +46,7 @@ class FacilitatorRequest extends FormRequest
     public function rules(): array
     {
         $routeName = Route::currentRouteName();
-        switch ($routeName){
+        switch ($routeName) {
             case 'facilitator.storeApi':
                 return $this->storeApiRules;
             case 'facilitator.updateApi':
@@ -57,10 +58,10 @@ class FacilitatorRequest extends FormRequest
         }
     }
 
-    public function massage():array
+    public function massage(): array
     {
         $routeName = Route::currentRouteName();
-        switch ($routeName){
+        switch ($routeName) {
             case 'facilitator.storeApi':
                 return $this->storeApiMessage;
             case 'facilitator.updateApi':

+ 2 - 1
app/Imports/ExpressImport.php

@@ -100,11 +100,12 @@ class ExpressImport implements WithMultipleSheets,ToArray
             }else $item[0] = $map[$province];
             $sign = false;
             for($i=1;$i<count($item);$i++){
-                if (($item[$i] && !is_numeric($item[$i]))||$item[$i]<=0){
+                if (($item[$i] && !is_numeric($item[$i])) || ($item[$i]!==null && $item[$i]<=0)){
                     $this->errors[] = "“".$province."”非法价格";
                     $sign = true;
                     break;
                 }
+                if ($item[$i]===null && $i>3)break;
             }
             if ($sign)continue;
             $result[] = $item;

+ 120 - 0
app/Jobs/LogisticZopSync.php

@@ -0,0 +1,120 @@
+<?php
+
+namespace App\Jobs;
+
+use App\library\zop\ZopClient;
+use App\library\zop\ZopProperties;
+use App\library\zop\ZopRequest;
+use App\Services\OrderPackageReceivedSyncService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Carbon;
+
+class LogisticZopSync implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $logistic_number;
+
+    /**
+     * Create a new job instance.
+     *
+     * @param $logistic_number
+     */
+    public function __construct($logistic_number)
+    {
+        $this->logistic_number = $logistic_number;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        //
+        ini_set('max_execution_time', 10);
+        $zopResult = [];
+        $url = config('api_logistic.ZTO.url');
+        $xAppKey = config('api_logistic.ZTO.x-appKey');
+        $appSecret = config('api_logistic.ZTO.appSecret');
+        $properties = new ZopProperties($xAppKey, $appSecret);
+        $client = new ZopClient($properties);
+        $request = new ZopRequest();
+
+        $request->setUrl($url);
+        $request->setBody(json_encode([
+            'billCode' => $this->logistic_number,
+        ]));
+        $response = json_decode($client->execute($request));
+        if ($response->status) {
+            $zopResult[] = [
+                'routes' => $response->result,
+                'logisticNum' => $this->logistic_number,
+            ];
+        }
+        $result = $this->transformRoutes($zopResult);
+
+        /**
+         * @var $orderPackageReceivedSyncService OrderPackageReceivedSyncService
+         */
+        $orderPackageReceivedSyncService = app('OrderPackageReceivedSyncService');
+        $orderPackageReceivedSyncService->update($result);
+    }
+
+    /**
+     * 转换快递路由信息
+     * @param array $routs 快递路由
+     * @return array
+     */
+    public function transformRoutes(array $routs): array
+    {
+        $result = [];
+        foreach ($routs as $route) {
+            $resultItem = [];
+            $resultItem['logistic_number'] = $route['logisticNum'];
+            $itemRoutes = $route['routes'];
+            if (empty($itemRoutes)) {
+                continue;
+            }
+            $lastRoute = $itemRoutes[count($itemRoutes) - 1];
+            switch ($lastRoute->scanType) {
+                case '收件':
+                    $resultItem['status'] = '已揽收';
+                    break;
+                case '到件':
+                case '发件':
+                    $resultItem['status'] = '在途';
+                    break;
+                case 'ARRIVAL':
+                case '派件':
+                    $resultItem['status'] = '派送中';
+                    break;
+                case 'SIGNED':
+                case '签收':
+                    $resultItem['status'] = '已收件';
+                    $resultItem['received_at'] = Carbon::parse($lastRoute->scanDate / 1000)->toDateTimeString();
+                    break;
+                default:
+                    break;
+            }
+            $transfer_status = [];
+            foreach ($itemRoutes as $item) {
+                $data = [];
+                $data['accept_time'] = Carbon::parse($item->scanDate / 1000)->toDateTimeString();
+                $scanSite = $item->scanSite;
+                $data['accept_address'] = $scanSite->prov . '-' . $scanSite->name;
+                $data['remark'] = $item->scanType;
+
+                $transfer_status[] = $data;
+            }
+            $resultItem['transfer_status'] = $transfer_status;
+            $result[] = $resultItem;
+        }
+        return $result;
+    }
+}

+ 5 - 2
app/OrderIssue.php

@@ -189,12 +189,15 @@ class OrderIssue extends Model
             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]) return "超量退回";                                 // 超量退回
                 if ( $rejectedMap[$key]['正品'] == $orderIssueMap[$key]) $equal += 1;
             }
         }
         if ($equal == count($orderIssueMap) && $equal == count($rejectedMap)  && $portion == 0) return "全部退回";        // 全部退回
-        if ($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 "无";
     }
 

+ 2 - 0
app/OwnerPriceOperation.php

@@ -23,6 +23,8 @@ class OwnerPriceOperation extends Model
         "operation",        //操作
         "target_id",        //目标ID
         "type_mark",        //类型标记
+        "surcharge",        //附加费
+        "surcharge_unit_id",//附加费单位
     ];
     public static $features = null;
     public static $columnMapping = null;

+ 1 - 0
app/OwnerPriceOperationItem.php

@@ -19,6 +19,7 @@ class OwnerPriceOperationItem extends Model
         "feature",                          //特征
         "priority",                         //优先级 值越大越高
         "discount_price",                   //减免单价
+        "odd_price",                        //零头价
     ];
     public $timestamps=false;
 

+ 10 - 0
app/Providers/RouteServiceProvider.php

@@ -80,19 +80,29 @@ class RouteServiceProvider extends ServiceProvider
             ->middleware('api')
             ->namespace('App\Http\Controllers\api\thirdPart\flux')
             ->group(base_path('routes/api/thirdPart/flux.php'));
+
         Route::prefix('api/thirdPart/weight')
             ->middleware('api')
             ->namespace('App\Http\Controllers\api\thirdPart\weight')
             ->group(base_path('routes/api/thirdPart/weight.php'));
+
+
         Route::prefix('api/thirdPart/weixin')
             ->namespace('App\Http\Controllers\api\thirdPart\weixin')
             ->group(base_path('routes/api/thirdPart/weixin.php'));
+
         Route::prefix('api/thirdPart/haiq')
             ->namespace('App\Http\Controllers\api\thirdPart\haiq')
             ->group(base_path('routes/api/thirdPart/haiq.php'));
+
         Route::prefix('api/thirdPart/goodscan')
             ->namespace('App\Http\Controllers\api\thirdPart\goodscan')
             ->group(base_path('routes/api/thirdPart/goodscan.php'));
+
+        Route::prefix('api/thirdPart/hengli')
+            ->namespace('App\Http\Controllers\api\thirdPart\hengli')
+            ->group(base_path('routes/api/thirdPart/hengli.php'));
+
         Route::prefix('api/thirdPart/haochuang')
             ->middleware('api')
             ->namespace('App\Http\Controllers\api\thirdPart\haochuang')

+ 5 - 5
app/Services/DeliveryAppointmentService.php

@@ -100,15 +100,15 @@ class DeliveryAppointmentService
     }
 
     /**
-     * 获取一个KEY值用于验证二维码
+     * 获取一个KEY值用于验证二维码 21-4-2 切换为永久二维码
      *
      * @return string
      */
     public function getKey()
     {
-        $y = date("y");
-        $m = date("m");
-        $d = date("d");
+        $y = 'w';//date("y");
+        $m = 'a';//date("m");
+        $d = 's';//date("d");
         $k1 = substr(env("APP_KEY"),7,2);
         $k2 = substr(env("APP_KEY"),10,2);
         $k3 = substr(env("APP_KEY"),15,2);
@@ -155,7 +155,7 @@ class DeliveryAppointmentService
         /** @var DeliveryAppointment|\stdClass $delivery */
         $delivery = DeliveryAppointment::query()->withCount(["cars"=>function($query){
             /** @var Builder $query */
-            $query->whereNull("delivery_time");
+            $query->whereNull("delivery_time")->where("status","!=",2);
         }])->find($id);
         if ($delivery->cars_count == 0)$delivery->update(["status"=>2]);
     }

+ 31 - 9
app/Services/DischargeTaskService.php

@@ -18,10 +18,18 @@ class DischargeTaskService
     public function updateDischargeTask(DischargeTask $dischargeTask, array $param): array
     {
         if ($dischargeTask->status == 3) return ['success' => false, 'message' => '已完成的卸货任务不可进行编辑'];
-        if(!empty($param['status']) && $param['status'] > 0 && $dischargeTask->facilitator_id == 0)
-            return ['success' => false, 'message' => '未指定服务商的卸货任务,不可进行当前编辑'];
-        // 归档入口
+
+        if(!empty($param['status'])){
+            if( $param['status'] > 0 && $dischargeTask->facilitator_id == 0){
+                return ['success' => false, 'message' => '未指定服务商的卸货任务,不可进行当前编辑'];
+            }
+            if($param['status'] ==3 && $dischargeTask->status == 0){
+                return ['success' => false, 'message' => '未指定服务商的卸货任务,不可进行当前编辑'];
+            }
+        }
+
         $bool = $dischargeTask->update($param);
+
         if ($bool){
             $dischargeTask->refresh();
             $dischargeTask->loadMissing('owner','facilitator');
@@ -34,6 +42,7 @@ class DischargeTaskService
     public function deleteDischargeTask(DischargeTask $dischargeTask): array
     {
         if ($dischargeTask->status == 3) return ['success' => false, 'message' => '已完成的卸货任务不可进行删除'];
+
         try {
             $dischargeTask->delete();
             return ['success' => true];
@@ -46,12 +55,16 @@ class DischargeTaskService
     public function updateTaskFacilitator(DischargeTask $dischargeTask, array $param): array
     {
         unset($param['owner'],$param['income_at']);
+
         if ($param['id']) unset($param['id']);
         if ($dischargeTask->status >= 1) return ['success' => false, 'message' => '当前任务状态不可修改'];
-        $param['expenditure_total_cost'] = $param['expenditure_unit_price'] * $param['expenditure_amount'];
         if (empty($param['expenditure_at'])) $param['expenditure_at'] = now();
         if (empty($param['status'])) $param['status'] = 1;
+
+        $param['expenditure_total_cost'] = $param['expenditure_unit_price'] * $param['expenditure_amount'];
+
         $bool = $dischargeTask->update($param);
+
         if ($bool == 1) {
             $dischargeTask->loadMissing('owner','facilitator');
             return ['success' => true, 'data' => $dischargeTask];
@@ -65,8 +78,10 @@ class DischargeTaskService
         if (empty($param['income_total_cost'])) $param['income_total_cost'] = $param['income_unit_price'] * $param['income_amount'];
         if (empty($param['income_at'])) $param['income_at'] = now();
         if (empty($param['status'])) $param['status'] = 0;
+
         $dischargeTask = DischargeTask::query()->create($param);
-        $dischargeTask->loadMissing('owner');
+        $dischargeTask->loadMissing('facilitator', 'owner','warehouse');
+
         return ['success' => true, 'data' => $dischargeTask];
     }
 
@@ -75,9 +90,11 @@ class DischargeTaskService
     {
         $json = [];
         foreach ($dischargeTasks as $dischargeTask) {
+
             /** @var DischargeTask $dischargeTask */
             /** @var Carbon $date */
             $date = $dischargeTask['created_at'];
+
             $json[] = [
                 $date->toDateTimeString(),
                 $dischargeTask->owner->name ?? '',
@@ -99,12 +116,15 @@ class DischargeTaskService
     {
         $json = [];
         foreach ($dischargeTasks as $dischargeTask) {
+
             /** @var DischargeTask $dischargeTask */
             /** @var Carbon $date */
             $date = $dischargeTask['created_at'];
+
             $json[] = [
-                $date->toDateTimeString(),                          //日期
+                $date->toDateTimeString() ,                          // 日期
                 $dischargeTask->owner->name ?? '',                  // 客户名称
+                $dischargeTask->warehouse->name ?? '',              // 仓库
                 DischargeTask::types[$dischargeTask['type']] ?? '',   // 作业名称
                 $dischargeTask['numbers'],                            // 入库单号
                 // --- 收入信息
@@ -132,15 +152,17 @@ class DischargeTaskService
     {
         $json = [];
         foreach ($dischargeTasks as $dischargeTask) {
+
             /** @var Carbon $date */
             $date = $dischargeTask->created_at;
+
             $json[] = [
                 $date->toDateTimeString(),                           // 日期
                 $dischargeTask->facilitator->name ?? '',      // 服务商
-                $dischargeTask['expenditure_amount'],                             // 数量
+                $dischargeTask['expenditure_amount'].'',                             // 数量
                 DischargeTask::units[$dischargeTask['expenditure_unit']] ?? '',   // 单位
-                $dischargeTask['expenditure_unit_price'],                         // 支出单价
-                $dischargeTask['expenditure_total_cost'],                         // 支出合计
+                $dischargeTask['expenditure_unit_price'].'',                         // 支出单价
+                $dischargeTask['expenditure_total_cost'].'',                         // 支出合计
             ];
         }
         return $json;

+ 23 - 1
app/Services/FacilitatorService.php

@@ -2,12 +2,34 @@
 
 namespace App\Services;
 
+use App\DischargeTask;
+use App\Filters\DischargeTaskFilters;
 use App\Traits\ServiceAppAop;
 use App\Facilitator;
+use Endroid\QrCode\QrCode;
 
 class FacilitatorService
 {
     use ServiceAppAop;
-    protected $modelClass=Facilitator::class;
+
+    protected $modelClass = Facilitator::class;
+
+
+    public function getQrCodeUrl(array $param): string
+    {
+        $facilitator_id = md5($param['facilitator_id']);
+        $urlString = '/personnel/discharge/facilitator/external/' . $facilitator_id . '/index';
+        $url = url($urlString);
+        $url .= '?created_range=' . ($param['range'] ?? '');
+
+        $qrCode = new QrCode($url);
+        $fileURL = base_path('public/images/QRCodeIMG/facilitator_id_' . $facilitator_id . '.png');
+
+        if (!file_exists($fileURL)) {
+            $qrCode->writeFile($fileURL);
+        }
+
+        return url('images/QRCodeIMG/facilitator_id_' . $facilitator_id . '.png');
+    }
 
 }

+ 16 - 7
app/Services/ForeignHaiRoboticsService.php

@@ -19,6 +19,8 @@ class ForeignHaiRoboticsService
 
     /** @var  $stationTaskMaterialBoxService StationTaskMaterialBoxService */
     private $stationTaskMaterialBoxService;
+    /** @var  $stationTaskBatchService StationTaskBatchService */
+    private $stationTaskBatchService;
     /** @var  $stationTaskCommoditiesService StationTaskCommodityService */
     private $stationTaskCommoditiesService;
     /** @var  $materialBoxService MaterialBoxService */
@@ -116,6 +118,7 @@ class ForeignHaiRoboticsService
         $this->instant($this->materialBoxService,'MaterialBoxService');
         $this->instant($this->stationTaskMaterialBoxService,'StationTaskMaterialBoxService');
         $this->instant($this->stationTaskCommoditiesService,'StationTaskCommodityService');
+        $this->instant($this->stationTaskBatchService,'StationTaskBatchService');
         try{
             LogService::log('海柔请求','markBinProcessed1.2',
                 json_encode([$binCode,$success,$exception,$is_in_plan]));
@@ -151,11 +154,9 @@ class ForeignHaiRoboticsService
             if(!$stationTaskMaterialBox){
                 throw new ErrorException('该料箱没有安排在处理队列中');
             }
-            $this->putBinToStore($stationTaskMaterialBox)
-                ?true
-                :(function(){throw new ErrorException('呼叫机器人回收U型线料箱失败');})();
-            $this->stationTaskMaterialBoxService
-                ->markProcessed($stationTaskMaterialBox);
+//            $this->putBinToStore($stationTaskMaterialBox)
+//                ?true
+//                :(function(){throw new ErrorException('呼叫机器人回收U型线料箱失败');})();
             LogService::log('海柔请求','markBinProcessed1.7',
                 json_encode($stationTaskMaterialBox));
             $stationTaskMaterialBox_next=
@@ -170,13 +171,21 @@ class ForeignHaiRoboticsService
                     ->markProcessing($stationTaskMaterialBox_next['stationTaskCommodities']);//因为上边商品任务被标记完成了,所以这里要将队列中找出正在处理的料箱对应的标记为“处理中”
             if(!$stationTaskMaterialBox_next){
                 $this->instant($this->stationTaskService,'StationTaskService');
+                LogService::log('海柔请求','markBinProcessed1.81',
+                    json_encode($stationTaskMaterialBox['stationTaskBatch']));
+                $stationTaskMaterialBox->loadMissing('stationTaskBatch');
+                $this->stationTaskBatchService->markProcessed($stationTaskMaterialBox['stationTaskBatch']);
+                LogService::log('海柔请求','markBinProcessed1.82',
+                    json_encode($stationTaskMaterialBox['stationTaskBatch']));
                 $this->stationTaskService->markProcessed($stationTaskMaterialBox['stationTask']);
             }
             LogService::log('海柔请求','markBinProcessed1.9',
-                json_encode($stationTaskMaterialBox_next));
+                json_encode($stationTaskMaterialBox));
             $this->stationService->broadcastBinMonitor($stationTaskMaterialBox['station_id'],$stationTaskMaterialBox['stationTask']);
+            $this->stationTaskMaterialBoxService
+                ->markProcessed($stationTaskMaterialBox);
             LogService::log('海柔请求','markBinProcessed1.99',
-                json_encode($stationTaskMaterialBox_next));
+                json_encode($stationTaskMaterialBox));
             return true;
         }catch (\Exception $e){
             $stationTaskMaterialBox = $stationTaskMaterialBox??$materialBox??null;

+ 74 - 23
app/Services/LogisticZopService.php

@@ -7,11 +7,20 @@ namespace App\Services;
 use App\library\zop\ZopClient;
 use App\library\zop\ZopProperties;
 use App\library\zop\ZopRequest;
+use Carbon\Carbon;
 
 class LogisticZopService
 {
-    public function get(array $logisticNums)
+
+
+    /**
+     * 获取中通快递路由信息
+     * @param array $logisticNums
+     * @return array
+     */
+    public function get(array $logisticNums): array
     {
+        $result = [];
 
         $url = config('api_logistic.ZTO.url');
         $xAppKey = config('api_logistic.ZTO.x-appKey');
@@ -22,30 +31,72 @@ class LogisticZopService
         $request = new ZopRequest();
 
         $request->setUrl($url);
-        $body = json_encode([
-            'type' => 1,
-            'billCode' => '75424921258500',
-        ]);
-        $request->setBody($body);
-        return json_decode($client->execute($request));
+        foreach ($logisticNums as $logisticNum) {
+            $request->setBody(json_encode([
+                'billCode' => $logisticNum,
+            ]));
+            $response = json_decode($client->execute($request));
+            if ($response->status) {
+                $result[] = [
+                    'routes' => $response->result,
+                    'logisticNum' => $logisticNum,
+                ];
+            } else {
+//                throw new WarningException("单号没有查询到快递路由信息','LogisticZopService->get->{$logisticNum}");
+            }
+        }
+        return $this->transformRoutes($result);
     }
-    public function tt(array $logisticNums)
-    {
-
-        $url = 'https://japi.zto.com/zto.open.obtainPicePrescription"';
-        $xAppKey = config('api_logistic.ZTO.x-appKey');
-        $xDataDigest = config('api_logistic.ZTO.appSecret');
 
-        $properties = new ZopProperties($xAppKey, $xDataDigest);
-        $client = new ZopClient($properties);
-        $request = new ZopRequest();
+    /**
+     * 转换快递路由信息
+     * @param array $routs 快递路由
+     * @return array
+     */
+    public function transformRoutes(array $routs): array
+    {
+        $result = [];
+        foreach ($routs as $route) {
+            $resultItem = [];
+            $resultItem['logistic_number'] = $route['logisticNum'];
+            $itemRoutes = $route['routes'];
+            if (empty($itemRoutes)) {
+                continue;
+            }
+            $lastRoute = $itemRoutes[count($itemRoutes) - 1];
+            switch ($lastRoute->scanType) {
+                case '收件':
+                    $resultItem['status'] = '已揽收';
+                    break;
+                case '到件':
+                case '发件':
+                    $resultItem['status'] = '在途';
+                    break;
+                case 'ARRIVAL':
+                case '派件':
+                    $resultItem['status'] = '派送中';
+                    break;
+                case 'SIGNED':
+                case '签收':
+                    $resultItem['status'] = '已收件';
+                    $resultItem['received_at'] = Carbon::parse($lastRoute->scanDate / 1000)->toDateTimeString();
+                    break;
+                default:
+                    break;
+            }
+            $transfer_status = [];
+            foreach ($itemRoutes as $item) {
+                $data = [];
+                $data['accept_time'] = Carbon::parse($item->scanDate / 1000)->toDateTimeString();
+                $scanSite = $item->scanSite;
+                $data['accept_address'] = $scanSite->prov . '-' . $scanSite->name;
+                $data['remark'] = $item->scanType;
 
-        $request->setUrl($url);
-        $body = json_encode([
-            'type' => 1,
-            'billCode' => '75424921258500',
-        ]);
-        $request->setBody("{\"transportType\":0,\"sender\":{\"address\":\"华志路1685号\",\"province\":\"上海\",\"city\":\"上海市\",\"district\":\"青浦区\"},\"addresser\":{\"district\":\"青浦区\",\"address\":\"华志路1685号\",\"province\":\"上海\",\"city\":\"上海市\"},\"weight\":1}");
-        return json_decode($client->execute($request));
+                $transfer_status[] = $data;
+            }
+            $resultItem['transfer_status'] = $transfer_status;
+            $result[] = $resultItem;
+        }
+        return $result;
     }
 }

+ 9 - 8
app/Services/OrderPackageReceivedSyncService.php

@@ -4,6 +4,7 @@
 namespace App\Services;
 
 
+use App\Jobs\LogisticZopSync;
 use App\OrderPackage;
 use Carbon\Carbon;
 use Exception;
@@ -22,7 +23,13 @@ class OrderPackageReceivedSyncService
      */
     public function syncLogisticRoute()
     {
-        $this->update($this->getLogisticRoutes($this->getLogisticNumbers()));
+        $logisticNumbers = $this->getLogisticNumbers();
+        $this->update($this->getLogisticRoutes($logisticNumbers));
+        //更新中通
+        $ZTOLogisticNumbers = $logisticNumbers['ZTO'];
+        foreach ($ZTOLogisticNumbers as $logisticNumber) {
+            LogisticZopSync::dispatch($logisticNumber);
+        }
     }
 
     /**
@@ -48,9 +55,7 @@ class OrderPackageReceivedSyncService
     public function getLogisticRoutes(array $request): array
     {
         $this->logisticSFService = new LogisticSFService();
-        $this->logisticZopService = new LogisticZopService();
         $resultSF = [];
-        $resultZT = [];
         $resultYD = [];
         $resultYT = [];
         $resultOther = [];
@@ -59,10 +64,6 @@ class OrderPackageReceivedSyncService
                 case "SF":
                     $resultSF = $this->logisticSFService->get($logisticNums);
                     break;
-                case "ZTO":
-//                    $resultZT = $this->logisticZopService->get($logisticNums);
-                    $resultZT = [];
-                    break;
                 case "YD":
                     $resultYD = [];
                     break;
@@ -74,7 +75,7 @@ class OrderPackageReceivedSyncService
                     break;
             }
         }
-        return array_merge($resultSF, $resultYD, $resultYT, $resultZT, $resultOther);
+        return array_merge($resultSF, $resultYD, $resultYT, $resultOther);
     }
 
     public function update(array $orderPackages)

+ 38 - 22
app/Services/OwnerPriceOperationService.php

@@ -83,7 +83,7 @@ class OwnerPriceOperationService
             $model->load("items");
             /** @var \stdClass $model */
             foreach ($model->items as $item){
-                $columns = ["strategy","amount","unit_id","unit_price","feature","priority","discount_price"];
+                $columns = ["strategy","amount","unit_id","unit_price","feature","priority","discount_price","odd_price"];
                 if ($items[$item->id] ?? false){
                     foreach ($columns as $column){
                         if (!array_key_exists($column,$items[$item->id]))$items[$item->id][$column] = $item[$column];
@@ -107,6 +107,7 @@ class OwnerPriceOperationService
                 $arr["unit_id"] = $item["unit_id"];
                 $arr["unit_price"] = $item["unit_price"];
                 $arr["feature"] = $item["feature"] ?? null;
+                $arr["odd_price"] = $item["odd_price"] ?? null;
                 $arr["priority"] = $item["priority"] ?? 0;
                 $arr["discount_price"] = isset($item["discount_price"]) ? (is_array($item["discount_price"]) ? implode(",",$item["discount_price"]) : $item["discount_price"]) : null;
                 $insert[] = $arr;
@@ -287,7 +288,7 @@ class OwnerPriceOperationService
      *
      *  2:没有总数量存在,都为子项内数量
      *
-     * @param array|object $matchObject  key-val
+     * @param array|object|Model $matchObject  key-val
      * @param array $columnMapping       key-val
      * @param string $ownerId
      * @param string $type
@@ -307,13 +308,16 @@ class OwnerPriceOperationService
      *      区分单据类型,增加字段
      * 六. 2021-03-23 zzd
      *      不严格区分入库出库差异 统一模型
+     * 七. 2021-03-30 zzd
+     *      增加一级二级特征,零头价,满减按总件,附加费用等
      */
     public function matching($matchObject, $columnMapping, $ownerId, $type = '出库', $typeMark = null)
     {
         $units = app("UnitService")->getUnitMapping(["件","箱"]); //获取单位映射集
         $rules = $this->getOwnerPriceOperation($ownerId,$type,$typeMark);//货主下的全部规则
         if (!$rules)return -2;  //规则不存在跳出
-        $total = app("OrderService")->getOrderQuantity($ownerId);//获取该货主本月C端单量
+        if ($type == '出库') $total = app("OrderService")->getOrderQuantity($ownerId);//获取该货主本月C端单量
+        else $total = app("StoreService")->getStoreAmount($ownerId);//获取该货主本月入库件数
         foreach ($rules as $rule){
             if (!$rule->items)continue; //不存在子规则跳出
 
@@ -323,34 +327,32 @@ class OwnerPriceOperationService
             if ($rule->strategy == '特征'){
                 if (app("FeatureService")->matchFeature($rule->feature,$columnMapping,$matchObject)){
                     if ($rule->total_price)return ["id"=>$rule->id,"money"=>$result ? explode(",",$rule->total_discount_price)[key($result)] : $rule->total_price];//按单计价存在,直接返回单总价或减免总价
-                    $money = $this->matchItem($rule->items,$columnMapping,$matchObject,$units,$ownerId,$result);
+                    $money = $this->matchItem($rule,$columnMapping,$matchObject,$units,$ownerId,$result);
                     if ($money>0)return ["id"=>$rule->id,"money"=>$money];
                 };
             }else{
                 if ($rule->total_price)return ["id"=>$rule->id,"money"=>$result ? explode(",",$rule->total_discount_price)[key($result)] : $rule->total_price]; //按单计价存在,直接返回单总价或减免总价
-                $money = $this->matchItem($rule->items,$columnMapping,$matchObject,$units,$ownerId,$result);
+                $money = $this->matchItem($rule,$columnMapping,$matchObject,$units,$ownerId,$result);
                 if ($money>0)return ["id"=>$rule->id,"money"=>$money];
             };
         }
         return $money ?? -7;
     }
     /**
-     * 根据货主 sku寻找箱规并将指定数量切换为箱
-     *      不满一箱视为一箱
+     * 根据货主 sku寻找箱规并将指定数量切换为箱 返回箱规
      *
-     * @param integer $amount
      * @param integer $ownerId
      * @param null|object $commodity
      *
      * @return int
      */
-    private function changeUnit($amount,$ownerId,$commodity)
+    private function changeUnit($ownerId,$commodity)
     {
         if (!$commodity)return -4;
-        if ($commodity->pack_spec)return ceil($amount/$commodity->pack_spec);
+        if ($commodity->pack_spec)return $commodity->pack_spec;
         $pack = app("CommodityService")->getPack($ownerId,$commodity->sku);
         if (!$pack)return -6;
-        return ceil($amount/$pack);
+        return $pack;
     }
 
     /**
@@ -384,23 +386,28 @@ class OwnerPriceOperationService
     /**
      * 匹配子策略
      *
-     * @param array $rules 策略对象组
+     * @param Model|\stdClass $obj 策略对象
      * @param array $columnMapping 映射对象
-     * @param array $matchObject 被匹配对象
+     * @param Model $matchObject 被匹配对象
      * @param array $units 单位集
      * @param integer $ownerId 货主ID
      * @param bool|array $result 满减信息
      *
      * @return double
      */
-    private function matchItem($rules, $columnMapping, $matchObject, $units, $ownerId, $result)
+    private function matchItem($obj, $columnMapping, $matchObject, $units, $ownerId, $result)
     {
-        /** @var Collection $matchObject */
         $matchObject = $this->resetChildNodeMapping($matchObject->toArray(),$columnMapping);
         if (!$matchObject)return -1;
-
+        $total = 0; //商品总数
+        foreach ($matchObject as $commodity)$total += $commodity[$columnMapping[8]]; //取对象内商品数量总数将其当作子属性插入原对象
+        $surcharge = 0;
         $unitName = "";
-        foreach ($rules as $rule){
+        if ($obj->surcharge_unit_id && $obj->surcharge && isset($units[$rule->surcharge_unit_id])){
+            if ($units[$obj->surcharge_unit_id] == '件')$surcharge += $obj->surcharge*$total;
+            else $surcharge += $obj->surcharge;
+        }//耗材附加费
+        foreach ($obj->items as $rule){
             if ($result)$rule->unit_price = explode(",",$rule->discount_price)[key($result)]; //满足满减条件,单价调整为满减单价
 
             if ($rule->strategy=='起步'){
@@ -410,25 +417,34 @@ class OwnerPriceOperationService
                 if ($startNumber)$matchObject=$this->settingCount($matchObject,$columnMapping[8],$startNumber);
                 if ($matchObject)foreach ($matchObject as $package)$money += $package[$columnMapping[8]] * $package["price"];
                 if (!$startNumber && $money<$rule->unit_price)$money = $rule->unit_price;
-                return $money;
+                return $money+$surcharge;
             }
             foreach ($matchObject as &$package){
                 if ($package["price"] ?? false)continue;
                 if (!isset($units[$rule->unit_id]))return -3;
                 if (!$unitName)$unitName = $units[$rule->unit_id];
                 else if ($unitName != $units[$rule->unit_id]) return -3;
-                if ($rule->strategy=='特征')if (!app("FeatureService")->matchFeature($rule->feature,$columnMapping,$package)) continue;
+                if ($rule->strategy=='特征'){
+                    $package[$columnMapping[10]] = $total; //设置一个不存在的总数进入原对象
+                    if (!app("FeatureService")->matchFeature($rule->feature,$columnMapping,$package)) continue;
+                }
                 $package["price"] = $rule->unit_price;
             }
             if ($units[$rule->unit_id] == '箱'){ //为箱时同步商品寻找箱规
                 $amount = 0;
-                foreach ($matchObject as $commodity)$amount += $this->changeUnit($commodity[$columnMapping[8]],$ownerId,$commodity[$columnMapping[9]]);
+                foreach ($matchObject as $commodity){
+                    $pack = $this->changeUnit($ownerId,$commodity[$columnMapping[9]]);
+                    if ($rule->odd_price){
+                        $amount += floor($amount/$pack);
+                        $surcharge += $rule->odd_price * ($amount%$pack); //零头附加费
+                    }else$amount += ceil($amount/$pack);
+                }
                 if ($amount<0)return $amount;
                 $package[$columnMapping[8]] = $amount;
             }
         }
         if ($matchObject){
-            $money = 0;
+            $money = $surcharge;
             foreach ($matchObject as $package)if ($package["price"])$money += $package[$columnMapping[8]] * $package["price"];
         }
         return $money ?? -7;
@@ -481,7 +497,7 @@ class OwnerPriceOperationService
                 $logistic_fee = 0;
                 if ($logistic_fee!==null && $logistic_fee<0)$logistic_fee = null;
 
-                $money = $this->matchItem($rule->items,Feature::MAPPING["order"],$order,$units,$owner,[$discountIndex=>true]);
+                $money = $this->matchItem($rule,Feature::MAPPING["order"],$order,$units,$owner,[$discountIndex=>true]);
                 if ($money>0)$detail->update(["work_fee"=>$money]);
                 else LogService::log(__CLASS__,"处理历史即时账单时发生匹配错误","账单主键:".$detail->id."; 错误代码".$money);
             };

+ 2 - 2
app/Services/StationService.php

@@ -64,6 +64,8 @@ class StationService
             $json = $stationTask->toJson();
         else
             $json =[];
+        LogService::log('海柔请求','broadcastBinMonitor',
+            $station_id.'|'.$json);
         broadcast(new BroadcastToStation($station_id, $json));
     }
 
@@ -79,8 +81,6 @@ class StationService
                 "stationTaskMaterialBoxes.materialBox",
             ]);
         $this->broadcast($station_id, $stationTask);
-        LogService::log('海柔请求','broadcastBinMonitor',
-            json_encode($stationTask));
     }
 
 }

+ 15 - 0
app/Services/StationTaskBatchService.php

@@ -223,6 +223,21 @@ class StationTaskBatchService
             ->whereIn('id', $ids)
             ->update(['status'=>'处理中']);
     }
+    function markProcessed($stationTaskBatch_orCollection)
+    {
+        if (get_class($stationTaskBatch_orCollection)==StationTaskBatch::class){
+            $stationTaskBatch_orCollection = collect([$stationTaskBatch_orCollection]);
+        }
+        $this->markProcessed_byIds(data_get($stationTaskBatch_orCollection, '*.id'));
+    }
+    function markProcessed_byIds($ids)
+    {
+        if(!$ids)$ids=[];
+        if(!is_array($ids))$ids=[$ids];
+        StationTaskBatch::query()
+            ->whereIn('id', $ids)
+            ->update(['status'=>'完成']);
+    }
 
 //    function markFinished($stationTaskBatches)
 //    {

+ 5 - 1
app/Services/StationTaskCommodityService.php

@@ -27,6 +27,8 @@ class StationTaskCommodityService
     private $stationTaskService;
     /** @var MaterialBoxService $materialBoxService */
     private $materialBoxService;
+    /** @var StationTaskBatchService $stationTaskBatchService */
+    private $stationTaskBatchService;
     public function __construct(){
         $this->stationService=null;
         $this->stationTypeService=null;
@@ -97,9 +99,11 @@ class StationTaskCommodityService
         $this->instant($this->stationTypeService,'StationTypeService');
         $this->instant($this->stationService,'StationService');
         $this->instant($this->materialBoxService,'MaterialBoxService');
+        $this->instant($this->stationTaskBatchService,'StationTaskBatchService');
         $stationTaskCommodities_toCreate=new Collection();
         $order_ids=data_get($batch['orders'],'*.id');
         $orderCommodities=OrderCommodity::query()->with('orderBin')->whereIn('order_id',$order_ids)->get();
+        $stationTaskBatch=$this->stationTaskBatchService->get(['batch_id'=>$batch['id']])->first();
         foreach ($orderCommodities as $orderCommodity){
             $stationType=$this->stationTypeService->getForCommodity();
             $station=$this->stationService->getStation_byType($stationType['name']);
@@ -114,7 +118,7 @@ class StationTaskCommodityService
                     'amount'=>$orderCommodity['amount'],
                     'bin_number'=>$orderCommodity['orderBin']['number']??'',
                     'order_id'=>$orderCommodity['order_id'],
-                    'station_task_batch_id'=>$batch['id'],
+                    'station_task_batch_id'=>$stationTaskBatch['id'],
                     'station_task_material_box_id'=>$stationTaskMaterialBoxId,
                     'status'=>'待处理',
                 ])

+ 4 - 1
app/Services/StationTaskMaterialBoxService.php

@@ -68,18 +68,20 @@ class StationTaskMaterialBoxService
         $this->instant($this->materialBoxService,'MaterialBoxService');
         $this->instant($this->stationTypeService,'StationTypeService');
         $this->instant($this->stationService,'StationService');
+        $this->instant($this->stationTaskBatchService,'StationTaskBatchService');
         $stationMaterialBoxes_toCreate=new Collection();
         $order_ids=data_get($batch['orders'],'*.id');
         $orderCommodities=OrderCommodity::query()->with('orderBin')->whereIn('order_id',$order_ids)->get();
         if($orderCommodities->isEmpty())return $stationMaterialBoxes_toCreate;
         $stationType=$this->stationTypeService->getForMaterialBox_onBatchProcess();
+        $stationTaskBatch=$this->stationTaskBatchService->get(['batch_id'=>$batch['id']])->first();
         foreach ($orderCommodities as $orderCommodity){
             $station=$this->stationService->getStation_byType($stationType['name']);
             $materialBox=$this->materialBoxService->firstOrCreate(['code' => $orderCommodity['location']]);
             $stationMaterialBoxes_toCreate->push([
                 'station_id'=>$station['id'],
                 'material_box_id'=>$materialBox['id'],
-                'station_task_batch_id'=>$batch['id'],
+                'station_task_batch_id'=>$stationTaskBatch['id'],
                 'status'=>'待处理'
             ]);
         }
@@ -151,6 +153,7 @@ class StationTaskMaterialBoxService
     }
     function markProcessed(StationTaskMaterialBox $stationTaskMaterialBox){
         $stationTaskMaterialBox['status'] = '完成';
+        $stationTaskMaterialBox['station_id'] = 4;
         $stationTaskMaterialBox->update();
     }
 

+ 44 - 1
app/Services/StoreService.php

@@ -17,6 +17,7 @@ use Carbon\Carbon;
 use Illuminate\Support\Facades\Cache;
 
 use App\Traits\ServiceAppAop;
+use Illuminate\Support\Facades\DB;
 
 
 class StoreService
@@ -322,8 +323,11 @@ class StoreService
         /** @var \stdClass $store */
         if (!$store || $store->status != "已入库") return false;
         if (OwnerFeeDetail::query()->where("outer_table_name","stores")->where("outer_id",$store->id)->first())return false;
-        $store->loadMissing("storeItems");
+        $store->loadMissing(["storeItems","warehouse"]);
 
+        $amount = 0;
+        if ($store->storeItems)foreach ($store->storeItems as $item)$amount += $item->amount;
+        $this->setStoreAmount($store->owner_id,$amount);
         /** @var OwnerPriceOperationService $service */
         $service = app("OwnerPriceOperationService");
 
@@ -370,4 +374,43 @@ class StoreService
         }
         if (count($insert_param)>0) StoreRejected::query()->insert($insert_param);
     }
+
+    /**
+     * 入库件数丢失补偿逻辑
+     *
+     * @param int $owner
+     */
+    private function storeAmountCompensationLogic($owner)
+    {
+        $query = DB::raw("SELECT sum(amount) total FROM `store_items` WHERE created_at LIKE ?");
+        $statistics = DB::selectOne($query,[$owner,date("Y-m")."%"]);
+        Cache::put(date("Y-m")."|A|".$owner,$statistics->total,2764800);
+    }
+
+    /**
+     * 设置货主下的本月入库件数
+     *
+     * @param int $owner
+     * @param int $amount
+     */
+    public function setStoreAmount($owner, $amount)
+    {
+        $date = date("Y-m");
+        if (!Cache::has($date."|A|".$owner))$this->storeAmountCompensationLogic($owner);//补偿逻辑
+        Cache::increment($date."|A|".$owner,$amount);
+    }
+
+    /**
+     * 获取货主下的本月入库件数
+     *
+     * @param int $owner
+     *
+     * @return int
+     */
+    public function getStoreAmount($owner)
+    {
+        $date = date("Y-m");
+        if (!Cache::has($date."|A|".$owner))$this->storeAmountCompensationLogic($owner);
+        return Cache::get($date."|A|".$owner);
+    }
 }

+ 1 - 1
app/Services/common/QueryService.php

@@ -97,7 +97,7 @@ class QueryService
                     $delete[] = $model->id;
                     continue;
                 }
-                if ($model->operation == "U")$delete[] = $model->target_id;
+                if ($model->operation == "U" && $model->target_id)$delete[] = $model->target_id;
                 $update[] = $model->id;
             }
         }else{

+ 1 - 1
app/StationTaskMaterialBox.php

@@ -25,7 +25,7 @@ class StationTaskMaterialBox extends Model
     }
     function stationTaskBatch(): BelongsTo
     {
-        return $this->belongsTo(StationTaskBatch::class,"id","station_id");
+        return $this->belongsTo(StationTaskBatch::class);
     }
     function stationTask(): BelongsTo
     {

+ 2 - 1
app/Waybill.php

@@ -58,7 +58,8 @@ class Waybill extends Model
         'other_charge_remark',
         'deliver_at',
         "district_id",
-        "order_id"
+        "order_id",
+        "is_to_pay" //0否 1是
     ];
 
     public function district()

+ 3 - 3
config/api_logistic.php

@@ -102,10 +102,10 @@ return [
     ],
     //中通 https://op.zto.cn/#/Console?type=API
     'ZTO' => [
-        'url' =>  'https://japi.zto.com/zto.open.getOrderInfo',
+        'url' =>  'https://japi.zto.com/zto.open.getRouteInfo',
         'x-appKey' => 'c51c718eb899e9f706979',
         'appSecret' => '9f664e3ab08049874aa417720840161a',
     ],
-    'init_date' => '2021-03-19 23:59:59',
-    'days' => 7,
+    'init_date' => '2021-04-07 23:59:59',
+    'days' => 2,
 ];

+ 5 - 2
database/factories/DischargeTaskFactory.php

@@ -8,7 +8,7 @@ use Illuminate\Database\Eloquent\Factory;
 
 $factory->define(DischargeTask::class, function (Faker $faker) {
     return [
-         'owner_id' => $faker->numberBetween(0, 10),
+         'owner_id' => $faker->numberBetween(1, 10),
         'type' => $faker->numberBetween(0, 1),
         'numbers' => $faker->name(11),
         'status' => $faker->numberBetween(0, 3),
@@ -17,11 +17,14 @@ $factory->define(DischargeTask::class, function (Faker $faker) {
         'income_unit_price' => $faker->numberBetween(0, 10),
         'income_total_cost' => $faker->numberBetween(0, 100),
         'income_remark' => $faker->title(),
-        'discharge_provider_id' => $faker->numberBetween(0, 10),
+        'facilitator_id' => $faker->numberBetween(1, 2),
         'expenditure_amount' => $faker->numberBetween(0, 20),
         'expenditure_unit' => $faker->numberBetween(0, 2),
         'expenditure_unit_price' => $faker->numberBetween(0, 10),
         'expenditure_total_cost' => $faker->numberBetween(0, 100),
         'expenditure_remark' => $faker->title(),
+        'created_at' => $faker->dateTime(),
+        'updated_at' => $faker->dateTime(),
+        'warehouse_id' => $faker->numberBetween(1,2),
     ];
 });

+ 65 - 0
database/migrations/2021_03_30_104348_change_discharge_auth_name.php

@@ -0,0 +1,65 @@
+<?php
+
+use App\Authority;
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class ChangeDischargeAuthName extends Migration
+{
+    protected $changeAuthNames = [
+        '运输管理-卸货-服务商报表-查询' => '人事管理-卸货-装卸队报表-查询',
+        '服务商' => '装卸队',
+        '服务商-查询' => '装卸队-查询',
+        '服务商-编辑' => '装卸队-编辑',
+        '服务商-删除' => '装卸队-删除',
+        '服务商-对账单-查询' => '装卸队-对账单-查询',
+        '服务商-创建' => '装卸队-创建',
+        '运输管理-卸货' => '人事管理-卸货',
+        '运输管理-卸货-查询' => '人事管理-卸货-查询',
+        '运输管理-卸货-编辑' => '人事管理-卸货-编辑',
+        '运输管理-卸货-创建' => '人事管理-卸货-创建',
+        '运输管理-卸货-删除' => '人事管理-卸货-删除',
+        '运输管理-卸货-结算报表-查询' => '人事管理-卸货-结算报表-查询',
+    ];
+
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        foreach ($this->changeAuthNames as $name => $changeName){
+            Authority::query()->where('name',$name)->update([
+                'name'=> $changeName,
+                'alias_name'=> $changeName,
+            ]);
+        }
+
+        Schema::table('discharge_tasks',function (Blueprint $table){
+            $table->integer('warehouse_id')->comment('仓库')->default(null);
+            $table->bigInteger('facilitator_id')->comment('装卸队')->default(null)->change();
+        });
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        foreach ($this->changeAuthNames as $changeName => $name){
+            Authority::query()->where('name',$name)->update([
+                'name'=> $changeName,
+                'alias_name'=> $changeName,
+            ]);
+        }
+
+        Schema::table('discharge_tasks',function (Blueprint $table){
+            $table->dropColumn('warehouse_id');
+        });
+    }
+}

+ 46 - 0
database/migrations/2021_03_30_135555_change_owner_operation_price_table_add_odd_price_column.php

@@ -0,0 +1,46 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOwnerOperationPriceTableAddOddPriceColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('owner_price_operation_items', function (Blueprint $table) {
+            $table->decimal("odd_price")->nullable()->comment("零头价");
+        });
+        Schema::table('waybills', function (Blueprint $table) {
+            $table->tinyInteger("is_to_pay")->default(0)->comment("是否到付");
+        });
+        Schema::table('owner_price_operations', function (Blueprint $table) {
+            $table->decimal("surcharge")->nullable()->comment("附加费");
+            $table->bigInteger("surcharge_unit_id")->nullable()->comment("附加费单位");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('owner_price_operation_items', function (Blueprint $table) {
+            $table->dropColumn("odd_price");
+        });
+        Schema::table('waybills', function (Blueprint $table) {
+            $table->dropColumn("is_to_pay");
+        });
+        Schema::table('owner_price_operations', function (Blueprint $table) {
+            $table->dropColumn("surcharge");
+            $table->dropColumn("surcharge_unit_id");
+        });
+    }
+}

+ 37 - 0
database/migrations/2021_04_02_134141_change_appointment_cars_add_status_column.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeAppointmentCarsAddStatusColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('delivery_appointment_cars', function (Blueprint $table) {
+            $table->tinyInteger("status")->default(0)->comment("状态");
+        });
+        \App\Authority::query()->firstOrCreate([
+            "name" => "入库管理-客户预约-预约管理-卸货完成",
+            "alias_name" => "入库管理-客户预约-预约管理-卸货完成",
+        ]);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('delivery_appointment_cars', function (Blueprint $table) {
+            $table->dropColumn("status");
+        });
+        \App\Authority::query()->where("name","入库管理-客户预约-预约管理-卸货完成")->delete();
+    }
+}

+ 1 - 1
database/seeds/DischargeTaskSeeder.php

@@ -12,7 +12,7 @@ class DischargeTaskSeeder extends Seeder
      */
     public function run()
     {
-        $params = factory(DischargeTask::class)->times(50)->make()->toArray();
+        $params = factory(DischargeTask::class)->times(100)->make()->toArray();
         DischargeTask::query()->insert($params);
     }
 }

+ 3 - 5
laravel-echo-server.json

@@ -1,5 +1,5 @@
 {
-	"authHost": "https://localhost",
+	"authHost": "http://localhost",
 	"authEndpoint": "/broadcasting/auth",
 	"clients": [
 		{
@@ -21,14 +21,12 @@
 			"databasePath": "/database/laravel-echo-server.sqlite"
 		}
 	},
-	"devMode": false,
+	"devMode": true,
 	"host": null,
 	"port": "6001",
-	"protocol": "https",
+	"protocol": "http",
 	"socketio": {},
 	"secureOptions": 67108864,
-	"sslCertPath": "/etc/letsencrypt/live/was.baoshi56.com/fullchain.pem",
-	"sslKeyPath": "/etc/letsencrypt/live/was.baoshi56.com/privkey.pem",
 	"sslCertChainPath": "",
 	"sslPassphrase": "",
 	"subscribers": {

+ 0 - 3
laravel-echo-server.lock

@@ -1,3 +0,0 @@
-{
-	"process": 18588
-}

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


+ 0 - 1
package.json

@@ -33,7 +33,6 @@
     "js-cookie": "^2.2.1",
     "jsbarcode": "^3.11.3",
     "laravel-echo": "^1.8.0",
-    "laravel-echo-server": "^1.6.2",
     "md5": "^2.3.0",
     "moment": "^2.28.0",
     "pusher-js": "^5.1.1",

+ 237 - 0
resources/js/queryForm/header-temp.js

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

+ 202 - 182
resources/js/queryForm/header.js

@@ -1,90 +1,148 @@
-/**
- * 需在页面定义三个元素 tr的元素当作当前元素 id 自定义 默认header
- * tr的父级元素 table id默认为tr的id加Parent后缀
- * 浮动表格元素 table id默认为tr的id加Roll后缀
- *
- * 21-03-04 zzd 注意:历史遗留问题在使用reset方法时column的key应为columns
- * */
-
-window.sort=require('../utilities/sort');
+window.checkData = []; //全选 数据池
+window.sort=require('../utilities/sort');//排序组件
 window.Header = function getHeader(object) {
-    this._header = object.el || '#header';  //基点元素
-    this._columns = object.column;   //列名
-    this._data = object.data;   //被排序数据
-    this._restorationColumn = object.restorationColumn; //恢复原数据基准字段
-    this._fixedTop = object.fixedTop || 0;  //同级浮动元素高度,使当前元素追加该元素高度浮动
-    this._offset = object.offset || 0;  //偏移量
-    this._is_restorationColumn_asc = object.is_restorationColumn_asc || false;    //恢复原数据基准字段的排序类型 true:asc false:desc
-    this._vue = object.vue || null; //vue容器
-    this._checkbox = object.checkbox || 'checkData';    //全选数据列名
-    this._closeFloat = object.closeFloat || false;  //是否开启浮动
+    let _targetDom = object.el ? document.getElementById(object.el) : document.getElementsByTagName("table")[0];//基点元素
+    let _columns = object.column;   //列名
+    let _fixedTop = object.fixedTop || 0;  //同级浮动元素高度,使当前元素追加该元素高度浮动
+    let _isCheckAllBox = object.isCheckAllBox || true;//是否开启全选框
+    let _data = object.data || [];   //被排序数据
+    let _restorationColumn = object.restorationColumn || 'id'; //恢复原数据基准字段
+    let _is_restorationColumn_asc = object.is_restorationColumn_asc || false;    //恢复原数据基准字段的排序类型 true:asc false:desc
+    let _before = object.before;//前置元素
+    let _name = object.name ? object.name+"." : "";//唯一名称 用于区别模块 本地存储
 
-    let _this = this;
-    let _parentNode = $(_this._header);
-    let sortType = {};
-    let columnArr = [];
-    // form fixed
-    let _headerParent = $(_this._header+"Parent");
-    let _parentNodeTemp = _parentNode.clone();
-    //滚动监听
-    function fixed() {
-        let _parentNode_top = _parentNode.offset().top;
-        $(window).scroll(function(){
-            let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
-            if (scrollTop > _parentNode_top-_this._fixedTop) {
-                $(_this._header+"Roll").removeClass('d-none');
-            } else {
-                $(_this._header+"Roll").addClass('d-none');
-            }
-            let scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
-            if (scrollLeft > 0){
-                _parentNodeTemp.css('margin-left',0-(scrollLeft));
-            }else{
-                _parentNodeTemp.css('margin-left',"");
+    let sortType = {}; //排序类型
+    let columnArr = []; //列数组
+
+    let moveTd = {}; //移动列
+
+    function getTargetChildNode(dom) { //递归获取input子节点
+        if (!dom || dom.tagName==='INPUT')return dom;
+        return getTargetChildNode(dom.firstElementChild);
+    }
+    function createHeaderBefore() {//生成前置元素
+        let tr = document.createElement("tr");
+        _before.forEach(be=>{
+            let th = document.createElement("th");
+            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;
+            tr.appendChild(th);
         });
-        let resetTrWidth = function(){
-            _parentNodeTemp.css('width',($(document).width()-_parentNodeTemp.offset().left*2)+'px');
-                // _this._columns.forEach(function (column){
-                //     let protoTargetWidth = (parseInt($("#dom_" + column.name ).css('width')))-16;
-                //     let floatingColumn = $("#dom_" + column.name + "_temp");
-                //     floatingColumn.css('width', protoTargetWidth);
-                //     floatingColumn.find('span').css('width', protoTargetWidth);
-                // })
-        };
-        $(window).resize(resetTrWidth);
-        setTimeout(resetTrWidth,200)
+        _targetDom.insertBefore(tr, _targetDom.firstChild);
+    }
+    function appendFloat(th) {
+        th.style.position = "sticky";
+        th.style.position = "-webkit-sticky";
+        th.style.top = _fixedTop+"px";
+        th.style.backgroundColor = "white";
+        th.style.zIndex = "99";
+    }
+    function createHeader() {//生成表头列
+        let tr = document.createElement("tr");
+        tr.className = "text-center";
+        let firstTr = _targetDom.getElementsByTagName("tr")[0];
+        let tds = [];
+        if (firstTr)tds = firstTr.children;
+
+        if (_isCheckAllBox){//是否开启全选
+            let th = document.createElement("th");
+            appendFloat(th);
+            if (firstTr) th.style.minWidth = tds[0].offsetWidth+"px";
+            th.className = "text-left";
+            let check = document.createElement("input");
+            check.type = "checkbox";
+            check.id = "checkAll";
+            if (firstTr)bindCheckbox(check);
+            th.appendChild(check);
+            tr.appendChild(th);
+        }
+
+        let i = (_isCheckAllBox && firstTr) ? 1 : 0;
+        for (i;i<(tds.length>0 ? tds.length : _columns.length);i++){
+            let th = document.createElement("th");
+            appendFloat(th);
+            let column = _columns[(_isCheckAllBox && firstTr) ? i-1 : i];
+            let wid = localStorage.getItem(_name+column.name);
+            if (wid){
+                let trs = _targetDom.children;
+                while(trs[0].tagName !== 'TR')trs = trs[0].children;
+                for (let j=0;j<trs.length;j++){
+                    trs[j].children[i].style.minWidth = wid+"px";
+                }
+            }
+            if (column){
+                if (column.type === 'multi')  multiColumn(th,column);
+                else defaultColumn(th,column);
+            }
+            tr.appendChild(th);
+        }
+        bindMove(tr);
+        if (_targetDom.firstChild) _targetDom.insertBefore(tr, _targetDom.firstChild);
+        else _targetDom.appendChild(tr);
+    }
+
+    function multiColumn(th,column) { //多列样式的生成
+        if (column.title){
+            let div = document.createElement("div");
+            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=>{
+                let node = document.createElement("div");
+                node.className = "col-"+(row.col ? row.col : 1);
+                node.appendChild(document.createTextNode(row.value));
+                div.appendChild(node);
+            });
+            th.appendChild(div);
+        }
+        return th;
+    }
+
+    function defaultColumn(th,column) { //默认列样式的生成
+        if (column.style)for (let key in column.style)if (column.style.hasOwnProperty(key)) th.style[key] = column.style[key];
+        if (column.class)th.className =  column.class;
+        let span = document.createElement("span");
+        span.style.display = "inline-block";
+        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.appendChild(document.createTextNode((column.value ? column.value : '')));
+        th.appendChild(span);
+        return th;
     }
 
-    /**
-     * column :{customization : null || bool   --是否自定义
-     *          dom : null || element           --自定义元素
-     *          style :  null || string         --样式
-     *          name : null || string           --字段名,英文
-     *          value : string                  --列名
-     *          neglect : null || bool          --是否忽略排序
-     *         }
-     * */
     //点击事件触发的排序规则
-    function rule(column,column_sort,column_sort_temp=null) {
+    function rule(column,columnSort) {
         return function () {
             if (!sortType[column.name]){
                 sortType[column.name] = 'asc';
                 columnArr.push(column.name);
-                column_sort.removeClass('fa-sort').addClass('fa-sort-asc');
-                if (column_sort_temp) column_sort_temp.removeClass('fa-sort').addClass('fa-sort-asc');
+                columnSort.className = "fa fa-sort-asc";
                 let columnArrTemp = [];
                 columnArrTemp.push.apply(columnArrTemp,columnArr);
-                window.sort.sort(_this._data,columnArrTemp,sortType);
+                window.sort.sort(_data,columnArrTemp,sortType);
                 return ;
             }
             if (sortType[column.name] === 'asc'){
                 sortType[column.name] = 'desc';
-                column_sort.removeClass('fa-sort-asc').addClass('fa-sort-desc');
-                if (column_sort_temp)column_sort_temp.removeClass('fa-sort-asc').addClass('fa-sort-desc');
+                columnSort.className = "fa fa-sort-desc";
                 let columnArrTemp = [];
                 columnArrTemp.push.apply(columnArrTemp,columnArr);
-                window.sort.sort(_this._data,columnArrTemp,sortType);
+                window.sort.sort(_data,columnArrTemp,sortType);
                 return ;
             }
             if (sortType[column.name] === 'desc'){
@@ -95,24 +153,23 @@ window.Header = function getHeader(object) {
                         return true;
                     }
                 });
-                column_sort.removeClass('fa-sort-desc').addClass('fa-sort');
-                if (column_sort_temp)column_sort_temp.removeClass('fa-sort-desc').addClass('fa-sort');
+                columnSort.className = "fa fa-sort";
                 if (columnArr.length === 0){
                     //希尔排序
                     let arr = [];
-                    arr.push.apply(arr,_this._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++) {
                             let j = i;
                             let current = arr[i];
-                            if (_this._is_restorationColumn_asc){
-                                while(j - gap >= 0 && Number(current[_this._restorationColumn]) < Number(arr[j - gap][_this._restorationColumn])) {
+                            if (_is_restorationColumn_asc){
+                                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[_this._restorationColumn]) > Number(arr[j - gap][_this._restorationColumn])) {
+                                while(j - gap >= 0 && Number(current[_restorationColumn]) > Number(arr[j - gap][_restorationColumn])) {
                                     arr[j] = arr[j - gap];
                                     j = j - gap;
                                 }
@@ -120,129 +177,92 @@ window.Header = function getHeader(object) {
                             arr[j] = current;
                         }
                     }
-                    //插入排序
-                    /*let preIndex, current;
-                    for(let i = 1; i < len; i++) {
-                        preIndex = i - 1;
-                        current = arr[i];
-                        while(preIndex >= 0 && arr[preIndex][_this._restorationColumn] > current[_this._restorationColumn]) {
-                            arr[preIndex + 1] = arr[preIndex];
-                            preIndex--;
-                        }
-                        arr[preIndex + 1] = current;
-                    }*/
-                    _this._data.length = 0;
-                    _this._data.push.apply(_this._data,arr);
+                    _data.length = 0;
+                    _data.push.apply(_data,arr);
                     return;
                 }
                 let columnArrTemp = [];
                 columnArrTemp.push.apply(columnArrTemp,columnArr);
-                window.sort.sort(_this._data,columnArrTemp,sortType);
+                window.sort.sort(_data,columnArrTemp,sortType);
             }
         }
-    };
-    //追加表头字段
-    function append() {
-        _this._columns.forEach(function (column) {
-            if (column.customization){
-                let _th = $("<th id='dom_"+column.name+"'><span style='display: inline-block'></span></th>");
-                $(_th.children()[0]).append(column.dom);
-                _parentNode.append(_th);
-            }else{
-                let _td = "<th id='dom_"+column.name+"' style='";
-                if(!column.neglect){
-                    _td += "cursor: pointer;"
-                }
-                if (column.style) _td += column.style;
-                _td += "' ";
-                if (column.class) _td += "class='"+column.class+"'";
-                _td += ">";
-                _td += "<span style='display: inline-block'>";
-                if(!column.neglect){
-                    _td += "<span id='sort_"+column.name+"' class='fa fa-sort'></span>";
+    }
+    function bindCheckbox(check) {
+        let trs = _targetDom.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++){
+                    let checkbox = getTargetChildNode(trs[i].children[0]);
+                    if (checkbox && !checkbox.checked){
+                        checkData.push(checkbox.value);
+                        checkbox.checked = true;
+                    }
                 }
-                _td += column.value+"</span>";
-                _td += "</th>";
-                _parentNode.append(_td);
-                if (!column.neglect) {
-                    let column_sort = $('#sort_' + column.name);
-                    let column_dom = $('#dom_'+column.name);
-                    column_dom.on('click',rule(column,column_sort));
+            }else{
+                checkData = [];
+                for (let i=0;i<trs.length;i++){
+                    let checkbox = getTargetChildNode(trs[i].children[0]);
+                    if (checkbox && checkbox.checked)checkbox.checked = false;
                 }
             }
-        });
-    }
-    //追加浮动表头:克隆表头元素,改变元素属性
-    function cloneDom(){
-        let height = _parentNode.height();
-        _parentNodeTemp.css('position',"fixed");
-        _parentNodeTemp.css('top',_this._fixedTop+"px");
-        _parentNodeTemp.css('z-index',"1030");
-        _parentNodeTemp.css('width',_headerParent.width()+"px");
-        _parentNodeTemp.css('background',"rgb(255, 255, 255)");
-        _parentNodeTemp.addClass('text-center');
-        _parentNodeTemp.height(height);
-        _parentNodeTemp.attr('id',_parentNode.attr('id')+"Temp");
-        $(_this._header+"Roll").append(_parentNodeTemp);
-        _this._columns.forEach(function (column) {
-            let column_dom = $('#dom_'+column.name);
-            let column_dom_temp = column_dom.clone();
-            let columnNameDom = column_dom_temp.children()[0];
-            if (column.customization){
-                if (column.type === 'checkAll'){
-                    var checkbox = $($(columnNameDom).children()[0]).children()[0];
-                    checkbox.id = checkbox.id+"_temp";
-                }
+        };
+        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 (!column.neglect){
-                $(columnNameDom).children()[0].id = 'sort_'+column.name+"_temp";
+        }
+    }
+    function bindMove(tr) {
+        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)
+                    this.style.cursor = 'w-resize';
+                else this.style.cursor = 'default';
             }
-            column_dom_temp.attr('id','dom_'+column.name+"_temp");
-            $(columnNameDom).css('width',column_dom.width()+_this._offset);
-            _parentNodeTemp.append(column_dom_temp);
-            if (!column.neglect){
-                let column_sort = $('#sort_'+column.name);
-                let column_sort_temp = $('#sort_'+column.name+"_temp");
-                column_dom.off('click');
-                column_dom.on('click',rule(column,column_sort,column_sort_temp));
-                column_dom_temp.on('click',rule(column,column_sort,column_sort_temp));
+        }
+        document.onmouseup = function (){ //全局监听拖拽列宽的发生 作用域设为全局是为了防抖动
+            if (moveTd.oldX){
+                event.stopPropagation();
+                moveTd.dom.style.cursor = 'default';
+                moveTd.oldX = undefined;
+                setTimeout(function () {
+                    let column = _columns[(_isCheckAllBox && _targetDom.firstChild) ? moveTd.index-1 : moveTd.index];
+                    if (column) localStorage.setItem(_name+column.name, moveTd.dom.offsetWidth);
+                });
             }
-            if (column.customization){
-                if (column.type === 'checkAll'){
-                    checkAll($(checkbox),column.column);
-                }
+        }; //移动时调整表头与表身的列宽
+        document.onmousemove = function(){
+            if (moveTd.oldX){
+                event.stopPropagation();
+                let diff = event.clientX-moveTd.oldX;
+                let newWidth = moveTd.dom.offsetWidth+diff+"px";
+                setTimeout(()=>{
+                    let trs = _targetDom.children;
+                    if (trs){
+                        while(trs[0].tagName !== 'TR')trs = trs[0].children;
+                        for (let j=0;j<trs.length;j++){
+                            if (trs[j].children[moveTd.index]) trs[j].children[moveTd.index].style.minWidth = newWidth;
+                        }
+                    }
+                },0);
+                moveTd.oldX = event.clientX;
             }
-        });
+        };
     }
     //初始化
     this.init = function() {
-        append();
-        if (_this._closeFloat)return;
-        fixed();
-        cloneDom();
-    };
-
-    this.reset = function(params = null){
-        _parentNode.empty();
-        _parentNodeTemp.empty();
-        if (params)for (let key in params)this["_"+key] = params[key];
-        this.init();
+        createHeader();
+        if (_before)createHeaderBefore();
     };
-
-    function checkAll(dom,column){
-        dom.on('click',function () {
-            if ($(this).is(":checked")== true) {
-                _this._vue[_this._checkbox].length = 0;
-                _this._data.forEach(function (object) {
-                    if (column) {
-                        object = object[column];
-                    }
-                    _this._vue[_this._checkbox].push(object);
-                });
-            } else {
-                _this._vue[_this._checkbox].length = 0;
-                _this._vue.$forceUpdate();
-            }
-        });
-    }
 };

+ 5 - 5
resources/sass/layout.scss

@@ -54,19 +54,19 @@ table,table.table-striped tbody{
     }
     th{
         &.td-warm{
-            background: #af7651;
+            background: #af7651 !important;
         }
         &.td-cool{
-            background: #aac7ea;
+            background: #aac7ea !important;
         }
         &.td-helpful{
-            background: #aaeace;
+            background: #aaeace !important;
         }
         &.td-yellow{
-            background: #f8eea0;
+            background: #f8eea0 !important;
         }
         &.td-calm{
-            background: #c6d8e3;
+            background: #c6d8e3 !important;
         }
     }
     td,tr:nth-of-type(odd){

+ 5 - 0
resources/sass/text.scss

@@ -220,4 +220,9 @@
     overflow-y: auto;
     border: RGB(204,204,204) solid 1px;
     border-radius: 5px
+}
+
+//规定最小宽度
+.td-min-width-80 tr td{
+    min-width: 80px;
 }

+ 19 - 56
resources/views/customer/project/area.blade.php

@@ -12,7 +12,7 @@
         <div class="d-none d-sm-block">
             <div id="form_div"></div>
             <div>
-                <button type="button" class="btn btn-outline-dark btn-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                <button type="button" class="btn btn-outline-dark btn-sm dropdown-toggle tooltipTarget"
                         data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
                     导出Excel
                 </button>
@@ -22,15 +22,10 @@
                 </div>
                 <button class="ml-1 btn btn-sm btn-outline-primary" data-toggle="modal" data-target="#selectedOwner">新 增</button>
             </div>
-            <label for="all" id="cloneCheckAll" class="d-none">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="d-none" id="headerRoll"></table>
-            <table class="table table-sm table-striped table-hover" id="headerParent">
-                <tr class="text-nowrap" id="header"></tr>
+            <table class="table table-sm table-striped table-hover table-bordered td-min-width-80" id="table">
                 <tr v-for="(area,i) in areas">
                     <td>
-                        <label><input type="checkbox" :value="area.id" v-model="checkData"></label>
+                        <label><input type="checkbox" :value="area.id"></label>
                     </td>
                     <td>@{{ i+1 }}</td>
                     <td>
@@ -41,8 +36,8 @@
                         <span v-if="area.status=='已完成'" class="text-success font-weight-bold">@{{ area.status }}</span>
                         <span v-if="area.status=='已审核'" class="text-primary font-weight-bold">@{{ area.status }}</span>
                     </td>
-                    <td>@{{ area.userOwnerGroupName }}</td>
-                    <td>@{{ area.customerName }}</td>
+                    <td style="min-width: 50px">@{{ area.userOwnerGroupName }}</td>
+                    <td style="min-width: 50px">@{{ area.customerName }}</td>
                     <td>@{{ area.ownerName }}</td>
                     <td>@{{ area.countingMonth }}</td>
                     <td>@{{ area.updatedAt }}</td>
@@ -148,7 +143,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>
+    <script type="text/javascript" src="{{asset('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script>
         let vue = new Vue({
@@ -190,26 +185,12 @@
                     @endforeach
                 ],
                 status : [{name:"编辑中",value:"编辑中"},{name:"已审核",value:"已审核"},{name:"已完成",value:"已完成"}],
-                checkData : [],
+
                 sum : Number("{{ $areas->total() }}"),
                 errors:[],
                 area:{},
                 index:"",
             },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.areas.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
-            },
             mounted(){
                 $(".up").slideUp();
                 $('#container').removeClass('d-none');
@@ -231,8 +212,6 @@
                 });
                 this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'status',value: '状态'},
                     {name:'userOwnerGroupName',value: '项目组'},
@@ -247,41 +226,25 @@
                     {name:'areaOnFlat',value: '平面区', neglect: true},
                     {name:'accountingArea',value: '结算', neglect: true},
                 ];
-                let _this=this;
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.reports,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form_div').height())+2,
-                        offset:0.5,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
+                new Header({
+                    el: "table",
+                    name: "area",
+                    column: column,
+                    isCheckAllBox: false,
+                    data: this.areas,
+                    fixedTop:($('#form_div').height())+2,
+                }).init();
             },
             methods:{
                 openAll(index){
                     $("#area_"+index).slideToggle();
                 },
                 areaExport(isAll){
+                    console.log(checkData);
+                    return;
                     let url = '{{url('customer/project/area/export')}}';
                     let token='{{ csrf_token() }}';
-                    //excelExport 定义在 js/queryForm/export.js
-                    excelExport(isAll,this.checkData,url,this.sum,token);
-                },
-                //全选事件
-                checkAll(e){
-                    if (e.target.checked){
-                        this.areas.forEach((el)=>{
-                            if (this.checkData.indexOf(el.id) === '-1'){
-                                this.checkData.push(el.id);
-                            }
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
+                    excelExport(isAll,checkData,url,this.sum,token);
                 },
                 edit(area,index){
                     $("#editArea").modal("show");
@@ -356,4 +319,4 @@
             },
         });
     </script>
-@stop
+@stop

+ 24 - 3
resources/views/customer/project/create.blade.php

@@ -176,7 +176,7 @@
                     discount_type:[
                         "无减免","按单减免","固定减免"
                     ],
-                    feature_type:{!! json_encode(\App\Feature::TYPE,JSON_UNESCAPED_UNICODE) !!},
+                    feature_type:[],
                     logic : ['包含','不包含','等于',"大于","大于等于","小于","小于等于"],
                 },
                 poolMapping:{},//基础数据选择池的映射对象 供展示使用
@@ -721,7 +721,7 @@
                             return;
                         }
                     }
-                    if (this.model.operation.strategy === '特征' && !this.model.operation.feature){
+                    if (!this.model.operation.isRejected && this.model.operation.strategy === '特征' && !this.model.operation.feature){
                         this.$set(this.errors,"feature",["特征未填写"]);
                         return;
                     }
@@ -738,6 +738,14 @@
                             if (i!==0 && !item)this.model.operation.total_discount_price[i] =  this.model.operation.total_discount_price[i-1];
                         })
                     }
+                    if (this.model.operation.surcharge && !this.model.operation.surcharge_unit_id){
+                        this.$set(this.errors,"surcharge_unit_id",["耗材附加费单位未选择"]);
+                        return;
+                    }
+                    if (this.model.operation.surcharge_unit_id && !this.model.operation.surcharge){
+                        this.$set(this.errors,"surcharge_unit_id",["耗材附加费未填写"]);
+                        return;
+                    }
                     if (!this.model.operation.isSingle){
                         for (let i=0;i<this.model.operation.items.length;i++){
                             if (this._verifyOperationItem(i))return;
@@ -786,7 +794,7 @@
                 _verifyOperationItem(itemIndex){//验证作业费子项信息完整
                     let obj = this.model.operation.items[itemIndex];
                     let sign = false;
-                    if (obj.strategy === '特征' && !obj.feature) {
+                    if (!this.model.operation.isRejected && obj.strategy === '特征' && !obj.feature) {
                         this.errors['items.' + itemIndex + '.feature'] = ["必须选择特征"];
                         sign = true;
                     }
@@ -990,6 +998,19 @@
                 },
                 //显示特征选择modal
                 showAddFeatureModal(index){
+                    let types = {!! json_encode(\App\Feature::TYPE,JSON_UNESCAPED_UNICODE) !!};
+                    let typeIn = {!! json_encode(array_keys(\App\Feature::MAPPING['store'])) !!};
+                    let typeOut = {!! json_encode(array_keys(\App\Feature::MAPPING['order'])) !!};
+                    let node = {!! json_encode(\App\Feature::TYPE_NODE) !!};
+                    let temp = [];
+                    if (this.model.operation.operation_type==='入库'){
+                        if (index === -1)typeIn.forEach(t=>{if (types[t] && node.indexOf(t)===-1) temp.push(types[t]);});
+                        else typeIn.forEach(t=>{if (types[t] && node.indexOf(t)!==-1) temp.push(types[t]);});
+                    }else{
+                        if (index === -1)typeOut.forEach(t=>{if (types[t] && node.indexOf(t)===-1) temp.push(types[t]);});
+                        else typeOut.forEach(t=>{if (types[t] && node.indexOf(t)!==-1) temp.push(types[t]);});
+                    }
+                    this.pool.feature_type = temp;
                     if (index === -1){
                         if (!this.model.operation.feature){
                             this.model.operation.features = this._createFeature();

+ 12 - 57
resources/views/customer/project/index.blade.php

@@ -43,7 +43,7 @@
             </div>
         </div>
         <div class="mt-1">
-            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                     data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
                 导出Excel
             </button>
@@ -56,15 +56,10 @@
         <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
         @endif
         <div>
-            <label for="all" id="cloneCheckAll" class="d-none">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="d-none" id="headerRoll"></table>
-            <table class="table table-sm text-nowrap table-striped table-hover" id="headerParent">
-                <tr id="header"></tr>
+            <table class="table table-sm text-nowrap table-striped table-hover td-min-width-80" id="table">
                 <tr v-for="(owner,i) in owners" :class="owner.id==id ? 'focusing' : ''"  @click="(selectTableRow(owner.id,$event)) && (id=owner.id)">
                     <td>
-                        <label><input type="checkbox" :value="owner.id" v-model="checkData"></label>
+                        <label><input type="checkbox" :value="owner.id"></label>
                     </td>
                     <td>@{{ i+1 }}</td>
                     <td>@{{ owner.name }}</td>
@@ -93,7 +88,7 @@
 @endsection
 
 @section('lastScript')
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
     <script>
@@ -108,11 +103,6 @@
                         name : "{{$owner->name}}",
                         created_at : "{{$owner->created_at}}",
                         subjection : "{{$owner->subjection}}",
-                        /*contracts : [
-                            {{--@foreach($owner->contracts as $contract)
-                            { number:"{{$contract->contract_number}}",salesman:"{{$contract->salesman}}" },
-                            @endforeach--}}
-                        ],*/
                         customer_company_name:"{{$owner->customer ? $owner->customer->company_name : ''}}",
                         user_owner_group_name:"{{$owner->userOwnerGroup ? $owner->userOwnerGroup->name : ''}}",
                         user_work_group_name:"{{$owner->userWorkGroup ? $owner->userWorkGroup->name : ''}}",
@@ -121,7 +111,6 @@
                     },
                     @endforeach
                 ],
-                checkData : [],
                 sum : Number("{{ $owners->total() }}"),
                 priceModel : {},
                 thisClickIndex : "",
@@ -165,8 +154,6 @@
                 });
                 this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'name',value: '项目'},
                     {name:'customer',value: '客户'},
@@ -180,33 +167,13 @@
                     {name:'relating_price',value: '关联报价', neglect: true},
                     {name:'operating',value: '操作', neglect: true},
                 ];
-                let _this=this;
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.owners,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form_div').height())+2,
-                        offset:0.5,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
-            },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.owners.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
+                new Header({
+                    el: "table",
+                    name: "customer",
+                    column: column,
+                    data: this.owners,
+                    fixedTop:($('#form_div').height())+2,
+                }).init();
             },
             methods:{
                 selectTableRow(id,e){
@@ -221,19 +188,7 @@
                 executeExport(isAll){
                     let url = '{{url('customer/project/index/export')}}';
                     let token='{{ csrf_token() }}';
-                    //excelExport 定义在 js/queryForm/export.js
-                    excelExport(isAll,this.checkData,url,this.sum,token);
-                },
-                //全选事件
-                checkAll(e){
-                    if (e.target.checked){
-                        this.checkData = [];
-                        this.owners.forEach((el)=>{
-                            this.checkData.push(el.id);
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
+                    excelExport(isAll,checkData,url,this.sum,token);
                 },
                 showModal(owner){
                     if (this.priceModel[owner.id]){

+ 1 - 4
resources/views/customer/project/part/_addFeature.blade.php

@@ -25,10 +25,7 @@
                         </label>
                         <label class="col-2">
                             <select class="form-control form-control-sm" v-model="feature.type">
-                                <option v-for="t in pool.feature_type" :value="t"
-                                        v-if="((thisOperationItemIndex===-1 && (t!=='商品名称' && t!=='长' && t!=='商品备注')) || (thisOperationItemIndex!==-1
-                                        && (t=='商品名称' || t=='长' || t=='商品备注'))) && ((model.operation.operation_type=='入库' && t!=='波次类型') || model.operation.operation_type=='出库')">
-                                    @{{ t }}</option>
+                                <option v-for="t in pool.feature_type" :value="t">@{{ t }}</option>
                             </select>
                         </label>
                         <label class="col-2">

+ 13 - 1
resources/views/customer/project/part/_operation.blade.php

@@ -120,9 +120,13 @@
             </div>
             <div class="row mt-2" v-if="item.strategy!='起步' || (item.strategy=='起步' && item.type==0)">
                 <label class="col-3">单位</label>
-                <label class="col-6 mb-0"><select v-model="item.unit_id" class="form-control" :class="errors['items.'+i+'.unit_id'] ? 'is-invalid' : ''">
+                <label class="col-3 mb-0"><select v-model="item.unit_id" class="form-control" :class="errors['items.'+i+'.unit_id'] ? 'is-invalid' : ''">
                     <option v-for="unit in pool.units" :value="unit.id" v-if="unit.name=='件' || unit.name=='箱'">@{{ unit.name }}</option>
                 </select></label>
+                <label class="col-2 text-right" v-if="model.operation.operation_type=='出库' && poolMapping.units[item.unit_id]=='箱'">零头价</label>
+                <label class="col-3 mb-0" v-if="model.operation.operation_type=='出库' && poolMapping.units[item.unit_id]=='箱'">
+                    <input class="form-control" :class="errors['items.'+i+'.odd_price'] ? 'is-invalid' : ''" v-model="item.odd_price" type="number" step="0.01" min="0">
+                </label>
             </div>
             <div class="row mt-0" v-if="errors['items.'+i+'.unit_id']">
                 <div class="offset-3"><small class="text-danger font-weight-bold ml-3">单位为必选项</small></div>
@@ -162,6 +166,14 @@
         </div>
     </div>
 </div>
+<div class="row mt-3" v-if="model.operation.operation_type=='出库'">
+    <label for="surcharge" class="col-2">耗材附加费</label>
+    <input id="surcharge" type="number" step="0.01" min="0" class="form-control col-3" :class="errors.surcharge ? 'is-invalid' : ''" v-model="model.operation.surcharge">
+    <label for="surcharge_unit_id" class="col-2 text-right">单位</label>
+    <select id="surcharge_unit_id" v-model="model.operation.surcharge_unit_id" class="form-control col-2" :class="errors.surcharge_unit_id ? 'is-invalid' : ''">
+        <option v-for="unit in pool.units" :value="unit.id" v-if="unit.name=='件' || unit.name=='单'">@{{ unit.name }}</option>
+    </select>
+</div>
 <div class="row mt-3">
     <label for="remark" class="col-2">备注</label>
     <textarea id="remark" class="col-6 form-control" v-model="model.operation.remark"></textarea>

+ 3 - 0
resources/views/customer/project/part/_three.blade.php

@@ -75,6 +75,7 @@
                                     </label>
                                     <label>@{{ operation.name }}</label><span class="badge badge-pill badge-danger" v-if="operation.isRejected">退</span>
                                     <label v-if="operation.remark" class="text-secondary">&nbsp;&nbsp;(@{{ operation.remark }})</label>
+                                    <label v-if="operation.surcharge">耗材附加费:<b>@{{ operation.surcharge }}</b>/@{{ poolMapping.units ? poolMapping.units[operation.surcharge_unit_id] : '' }}</label>
                                 </div>
                                 <div class="col-1">
                                     <span class="cursor-pointer text-danger font-weight-bold"
@@ -121,6 +122,7 @@
                                     </label>
                                     <label>@{{ operation.name }}</label>
                                     <label v-if="operation.remark" class="text-secondary">&nbsp;&nbsp;(@{{ operation.remark }})</label>
+                                    <label v-if="operation.surcharge">耗材附加费:<b>@{{ operation.surcharge }}</b>/@{{ poolMapping.units ? poolMapping.units[operation.surcharge_unit_id] : '' }}</label>
                                 </div>
                                 <div class="col-1">
                                     <span class="cursor-pointer text-danger font-weight-bold"
@@ -143,6 +145,7 @@
                                         <div class="col-10">
                                             <label>@{{ item.strategy }}<span v-if="item.strategy!='起步'">续费</span></label>:
                                             <span v-if="item.amount > 0"><b>@{{ item.amount }}</b>&nbsp;@{{ poolMapping.units ? poolMapping.units[item.unit_id] : '' }} /</span><b>&nbsp;@{{ item.unit_price }}</b>元
+                                            <span class="badge badge-secondary" v-if="item.odd_price">零头价:@{{ item.odd_price }}元</span>
                                             <span v-if="operation.isDiscount">&nbsp;(满减单价:
                                                 <span v-for="(value,k) in item.discount_price">
                                                     <span v-if="k!=0">,</span>

+ 12 - 51
resources/views/finance/billConfirmation.blade.php

@@ -6,7 +6,7 @@
     <div class="container-fluid d-none" id="container">
         <div id="form_div"></div>
         <div class="mt-1">
-            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                     data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
                 导出Excel
             </button>
@@ -18,15 +18,10 @@
             @can("结算管理-账单确认-重置账单确认")<button data-toggle="modal" data-target="#resetBillConfirmation" class="btn btn-sm btn-outline-primary">重置账单确认</button>@endcan
         </div>
         <div>
-            <label for="all" id="cloneCheckAll" class="d-none">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="d-none" id="headerRoll"></table>
-            <table class="table table-sm text-nowrap table-striped table-hover" id="headerParent">
-                <tr id="header"></tr>
+            <table class="table table-sm text-nowrap table-striped table-hover td-min-width-80" id="table">
                 <tr v-for="(bill,i) in bills">
                     <td>
-                        <label><input type="checkbox" :value="bill.id" v-model="checkData"></label>
+                        <label><input type="checkbox" :value="bill.id"></label>
                     </td>
                     <td>@{{ i+1 }}</td>
                     <td>@{{ bill.ownerGroupName }}</td>
@@ -54,14 +49,13 @@
 @stop
 
 @section("lastScript")
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script>
         let vue = new Vue({
             el:"#container",
             data:{
-                checkData:[],
                 bills : [
                     @foreach($bills as $bill)
                     {   id : "{{$bill->id}}",
@@ -98,20 +92,6 @@
                     owner:[],
                 }
             },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.bills.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
-            },
             mounted(){
                 $('#container').removeClass('d-none');
                 let data=[
@@ -131,8 +111,6 @@
                 });
                 this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'ownerGroupName',value: '项目小组'},
                     {name:'customerName',value: '客户'},
@@ -144,36 +122,19 @@
                     {name:'difference',value: '差额', neglect: true},
                     {name:'operating',value: '操作', neglect: true},
                 ];
-                let _this=this;
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.reports,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form_div').height())+2,
-                        offset:0.5,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
+                new Header({
+                    el: "table",
+                    name: "billConfirmation",
+                    column: column,
+                    data: this.reports,
+                    fixedTop:($('#form_div').height())+2,
+                }).init();
             },
             methods:{
                 billExport(isAll){
                     let url = '{{url('finance/billConfirmation/export')}}';
                     let token='{{ csrf_token() }}';
-                    excelExport(isAll,this.checkData,url,this.sum,token);
-                },
-                //全选事件
-                checkAll(e){
-                    if (e.target.checked){
-                        this.checkData = [];
-                        this.bills.forEach((el)=>{
-                            this.checkData.push(el.id);
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
+                    excelExport(isAll,checkData,url,this.sum,token);
                 },
                 updateConfirmFee(bill){
                     let confirm_fee = $('#confirmFee-'+bill.id).val();

+ 19 - 58
resources/views/finance/instantBill.blade.php

@@ -24,7 +24,7 @@
         </div>
         <div id="form_div"></div>
         <div class="mt-1">
-            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                     data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
                 导出Excel
             </button>
@@ -36,22 +36,11 @@
             @can("结算管理-即时账单-重置即时账单")<button data-toggle="modal" data-target="#resetInstantBill" class="btn btn-sm btn-outline-primary">重置即时账单</button>@endcan
         </div>
         <div>
-            <label for="all" id="cloneCheckAll" class="d-none">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="d-none" id="headerRoll"></table>
-            <table class="table table-sm text-nowrap" id="headerParent">
-                <tr class="text-center">
-                    <td colspan="2"></td>
-                    <td colspan="9" class="bg-light-info">单据信息</td>
-                    <td colspan="4" class="bg-light-khaki">物流作业信息</td>
-                    <td colspan="4" class="bg-light-cyanogen">费用信息</td>
-                </tr>
-                <tr id="header"></tr>
+            <table class="table table-sm text-nowrap td-min-width-80" id="table">
                 <tbody v-for="(bill,i) in bills" :class="i%2==0 ? 'bg-light-gray' : 'bg-white'">
                 <tr>
                     <td :rowspan="bill.rowspan">
-                        <label><input type="checkbox" :value="bill.id" v-model="checkData"></label>
+                        <label><input type="checkbox" :value="bill.id"></label>
                     </td>
                     <td :rowspan="bill.rowspan">@{{ i+1 }}</td>
                     <td :rowspan="bill.rowspan">@{{ bill.customerName }}</td>
@@ -92,14 +81,13 @@
 @stop
 
 @section("lastScript")
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script>
         let vue = new Vue({
             el:"#container",
             data:{
-                checkData:[],
                 bills : [
                     @foreach($details as $detail)
                     {   id : "{{$detail->id}}",
@@ -172,8 +160,6 @@
                 });
                 this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'customerName',value: '客户', class: "bg-info"},
                     {name:'ownerName',value: '项目', class: "bg-info"},
@@ -192,52 +178,27 @@
                     {name:'logisticFee',value: '物流费', class: "bg-cyanogen", neglect: true},
                     {name:'total',value: '合计', class: "bg-cyanogen", neglect: true},
                 ];
-                let _this=this;
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.bills,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form_div').height())+2,
-                        offset:7.5,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
+                new Header({
+                    el: "table",
+                    name: "instantBill",
+                    column: column,
+                    data: this.bills,
+                    restorationColumn: 'id',
+                    fixedTop:($('#form_div').height())+2,
+                    before:[
+                        {colspan:'2',value: ''},
+                        {colspan:'9',value: '单据信息', class:"bg-light-info"},
+                        {colspan:'4',value: '物流作业信息', class:"bg-light-khaki"},
+                        {colspan:'4',value: '费用信息', class:"bg-light-cyanogen"},
+                    ],
+                }).init();
                 this.thisType = document.getElementsByName("type")[0].value;
             },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.bills.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
-            },
             methods:{
                 billExport(isAll){
                     let url = '{{url('finance/instantBill/export')}}';
                     let token='{{ csrf_token() }}';
-                    //excelExport 定义在 js/queryForm/export.js
-                    excelExport(isAll,this.checkData,url,this.sum,token);
-                },
-                //全选事件
-                checkAll(e){
-                    if (e.target.checked){
-                        this.checkData = [];
-                        this.bills.forEach((el)=>{
-                            this.checkData.push(el.id);
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
+                    excelExport(isAll,checkData,url,this.sum,token);
                 },
                 resetInstantBill(){
                     window.tempTip.setDuration(3000);

+ 14 - 56
resources/views/inventory/statement/changeInventory.blade.php

@@ -5,7 +5,7 @@
 <div id="list" class="d-none card container-fluid" style="min-width: 1500px">
     <div id="form_div"></div>
     <span class="dropdown">
-        <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+        <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                 data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
             导出Excel
         </button>
@@ -14,15 +14,10 @@
             <a class="dropdown-item" @click="processExport(true)" href="javascript:">导出所有页</a>
         </div>
     </span>
-    <label for="all" id="cloneCheckAll" class="d-none">
-        <input id="all" type="checkbox" @click="checkAll($event)">全选
-    </label>
-    <table class="table table-sm table-bordered text-nowrap d-none" id="headerRoll"></table>
-    <table class="table table-sm table-striped table-bordered table-hover text-nowrap card-body mt-2" id="headerParent">
-        <tr id="header"></tr>
+    <table class="table table-sm table-striped table-bordered table-hover text-nowrap card-body mt-2 td-min-width-80" id="table">
         <tr v-for="(oracleActTransactingLog,i) in oracleActTransactingLogs" @click="selectedColor(oracleActTransactingLog.id,$event)">
             <td>
-                <input class="checkItem" type="checkbox" :value="oracleActTransactingLog" v-model="checkData">
+                <input class="checkItem" type="checkbox" :value="oracleActTransactingLog">
             </td>
             <td>@{{ i+1 }}</td>
             <td class="text-primary">@{{ oracleActTransactingLog.货主 }}</td>
@@ -55,7 +50,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         let vue=new Vue({
             el:"#list",
@@ -64,11 +59,9 @@
                 page:Number('{{$page}}'),
                 owners:[
                     @foreach($owners as $owner)
-                    {{--{name:'{{$owner->customerid}}',value:'{{$owner->descr_c}}'},--}}
                     {name:'{{$owner->code}}',value:'{{$owner->name}}'},
                     @endforeach
                 ],
-                checkData:[],
                 maxPage:1,
                 sum:0,
                 isPage:true,
@@ -123,8 +116,6 @@
                     });
                 }
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'货主',value: '货主', class:'text-primary'},
                     {name:'库位',value: '库位', class:'text-muted'},
@@ -142,37 +133,16 @@
                     {name:'在库数量',value: '在库数量', neglect: true},
                     {name:'占用数量',value: '占用数量', neglect: true},
                 ];
+                new Header({
+                    el: "table",
+                    name: "changeInventory",
+                    column: column,
+                    data: this.oracleActTransactingLogs,
+                    restorationColumn: 'rn',
+                    is_restorationColumn_asc:true,
+                    fixedTop:($('#form_div').height())+2,
+                }).init();
 
-                let header=null;
-                let _this = this;
-                setTimeout(function () {
-                    header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.oracleActTransactingLogs,
-                        restorationColumn: 'rn',
-                        is_restorationColumn_asc:true,
-                        fixedTop:($('#form_div').height())+2,
-                        offset:0.5,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
-
-            },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.oracleActTransactingLogs.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
             },
             methods:{
                 selectedColor(id,e){
@@ -210,24 +180,12 @@
                     }
                     window.location.href=url;
                 },
-                //全选事件
-                checkAll(e){
-                    if (e.target.checked){
-                        this.oracleActTransactingLogs.forEach((el,i)=>{
-                            if (this.checkData.indexOf(el) == '-1'){
-                                this.checkData.push(el);
-                            }
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
-                },
                 processExport(checkAllSign){
                     let url = '{{url('inventory/statement/allInventory/export')}}';
                     if (!this.isTotalStock)
                          url = '{{url('inventory/statement/changeInventory/export')}}';
                     let token='{{ csrf_token() }}';
-                    let data= JSON.stringify( this.checkData );
+                    let data= JSON.stringify( checkData );
                     excelExport(checkAllSign,data,url,this.sum,token);
                 },
             },

+ 13 - 52
resources/views/inventory/statement/dailyLog.blade.php

@@ -28,7 +28,7 @@
         </div>
         <div class="w-100 ml-4 mt-0 mb-0">
             <span class="dropdown">
-                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                         data-toggle="dropdown" title="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">
                     导出Excel
                 </button>
@@ -40,15 +40,10 @@
             @can('库存管理-库存体积-管理监听货主')<button class="btn btn-outline-info btn-sm tooltipTarget mt-1" @click="openModal()">管理监听货主</button>@endcan
         </div>
         <div class="card-body pt-1">
-            <label for="all" class="d-none" id="cloneCheckAll">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="table table-sm text-nowrap table-bordered d-none" id="headerRoll"></table>
-            <table class="table table-sm text-nowrap table-striped table-bordered m-0" id="headerParent">
-                <tr class="p-0" id="header"></tr>
+            <table class="table table-sm text-nowrap table-striped table-bordered m-0 td-min-width-80" id="table">
                 <tr v-for="(inventoryDailyLog,i) in inventoryDailyLogs" @click="selectedColor(i,$event)">
                    <td>
-                       <input type="checkbox" :value="inventoryDailyLog.id" v-model="checkData">
+                       <input type="checkbox" :value="inventoryDailyLog.id">
                    </td>
                     <td>@{{ i+1 }}</td>
                     <td>@{{ inventoryDailyLog.owner_name }}</td>
@@ -83,7 +78,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         let vue = new Vue({
             el:"#container",
@@ -112,27 +107,12 @@
                     {name:"{{$owner->id}}",value:"{{$owner->name}}"},
                     @endforeach
                 ],
-                checkData:[],
                 name : "",
                 loggingOwners : [],
                 seekOwners : [],
                 sum:{!! $inventoryDailyLogs->total() !!},
                 selectTr:''
             },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.inventoryDailyLogs.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
-            },
             mounted(){
                 $(".tooltipTarget").tooltip({'trigger': 'hover'});
                 $("#container").removeClass('d-none');
@@ -154,8 +134,6 @@
                 });
                 this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'owner_name',value: '货主'},
                     {name: 'created_at', value: '日期'},
@@ -171,18 +149,14 @@
                     {name: 'volumn_occupied', value: '总占用体积', neglect: true},
                     {name: 'gross_weight', value: '总毛重', neglect: true},
                 ];
-                let _this = this;
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.inventoryDailyLogs,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form').height())+2,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
+                new Header({
+                    el: "table",
+                    name: "dailyLog",
+                    column: column,
+                    data: this.inventoryDailyLogs,
+                    restorationColumn: 'id',
+                    fixedTop:($('#form').height())+2,
+                }).init();
             },
             methods:{
                 selectedColor(id,e){
@@ -194,19 +168,6 @@
                     this.selectTr=id;
                     $(e.target).parent('tr').addClass('focusing')
                 },
-                //全选事件
-                checkAll(e) {
-                    if (e.target.checked) {
-                        this.inventoryDailyLogs.forEach((el) => {
-                            if (!el.id) this.checkData.push(el.id);
-                            if (el.id && this.checkData.indexOf(el.id) === -1) {
-                                this.checkData.push(el.id);
-                            }
-                        });
-                    } else {
-                        this.checkData = [];
-                    }
-                },
                 openModal(){
                     let url = "{{url('inventory/statement/dailyLog/getLoggingOwner')}}";
                     axios.post(url).then(res=>{
@@ -259,7 +220,7 @@
                 dailyLogExport(checkAllSign){
                     let url = '{{url('inventory/statement/dailyLog/export')}}';
                     let token='{{ csrf_token() }}';
-                    excelExport(checkAllSign,this.checkData,url,this.sum,token);
+                    excelExport(checkAllSign,checkData,url,this.sum,token);
                 },
             },
         });

+ 13 - 63
resources/views/inventory/statement/inventoryCompare.blade.php

@@ -79,7 +79,7 @@
         </div>
         <div class="w-100 ml-4 mt-0 mb-0">
             <span class="dropdown ">
-                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                         data-toggle="dropdown" title="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">
                     导出Excel
                 </button>
@@ -89,20 +89,15 @@
                 </div>
             </span>
             <span>
-                <button class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" title="导入Excel生成库存对比" @click="importExcel">导入</button>
+                <button class="btn btn-outline-info btn-sm form-control-sm  tooltipTarget" title="导入Excel生成库存对比" @click="importExcel">导入</button>
             </span>
         </div>
     </span>
         <div class="card-body pt-1">
-            <label for="all" class="d-none" id="cloneCheckAll">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="table table-sm text-nowrap table-bordered d-none" id="headerRoll"></table>
-            <table class="table table-sm text-nowrap table-striped table-bordered m-0" id="headerParent">
-                <tr class="p-0" id="header"></tr>
+            <table class="table table-sm text-nowrap table-striped table-bordered m-0 td-min-width-80" id="table">
                 <tr v-for="(inventoryCompare,i) in inventoryCompares">
                    <td>
-                       <input type="checkbox" :value="inventoryCompare.id" v-model="checkData">
+                       <input type="checkbox" :value="inventoryCompare.id">
                    </td>
                     <td>@{{ i+1 }}</td>
                     <td>@{{ inventoryCompare.owner_name }}</td>
@@ -136,7 +131,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         let vue = new Vue({
             el:"#container",
@@ -166,24 +161,9 @@
                     @endforeach
                 ],
                 sum:{!! $inventoryCompares->total() !!},
-                checkData:[],
                 fakeOwners:'',
                 isSubmit:false,
             },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.inventoryCompares.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
-            },
             mounted(){
                 $(".tooltipTarget").tooltip({'trigger': 'hover'});
                 $("#container").removeClass('d-none');
@@ -208,8 +188,6 @@
                 });
                 this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'owner_name',value: '货主'},
                     {name:'mission_code',value: '任务号'},
@@ -223,33 +201,15 @@
                     {name: 'amount_in_compare', value: '参考库存', neglect: true},
                     {name: 'differ', value: '差值', neglect: true},
                 ];
-                let _this = this;
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.inventoryCompares,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form').height())+2,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
+                new Header({
+                    el: "table",
+                    name: "inventoryCompare",
+                    column: column,
+                    data: this.inventoryCompares,
+                    fixedTop:($('#form').height())+2,
+                }).init();
             },
             methods:{
-                //全选事件
-                checkAll(e) {
-                    if (e.target.checked) {
-                        this.inventoryCompares.forEach((el) => {
-                            if (!el.id) this.checkData.push(el.id);
-                            if (el.id && this.checkData.indexOf(el.id) === -1) {
-                                this.checkData.push(el.id);
-                            }
-                        });
-                    } else {
-                        this.checkData = [];
-                    }
-                },
                 importExcel(){
                     $('#importExcel').modal('show');
                 },
@@ -263,18 +223,8 @@
                 inventoryCompareExport(checkAllSign){
                     let url = '{{url('inventory/statement/inventoryCompare/export')}}'
                     let token='{{ csrf_token() }}';
-                    excelExport(checkAllSign,this.checkData,url,this.sum,token);
+                    excelExport(checkAllSign,checkData,url,this.sum,token);
                 },
-                // 定位货主(e){
-                //     let target = $(e.target).val();
-                //     if(target === ''){
-                //         this.fakeOwners = this.owners;
-                //     }else{
-                //         this.fakeOwners = this.fakeOwners.filter(function(map){
-                //             return map.value.includes(target) ;
-                //         })
-                //     }
-                // },
             },
         });
     </script>

+ 19 - 60
resources/views/inventory/stockInventory/inventoryMission.blade.php

@@ -26,7 +26,7 @@
             </span>
 
             <span class="dropdown">
-                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                         data-toggle="dropdown" title="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">
                     导出Excel
                 </button>
@@ -314,13 +314,8 @@
 
 
         <div class="card-body pt-1">
-            <label for="all" class="d-none" id="cloneCheckAll">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="table table-sm table-bordered d-none text-nowrap " id="headerRoll"></table>
-            <table class="table table-sm table-striped d-none d-xl-block p-0 text-nowrap table-bordered"
-                   id="headerParent" ref="boxPc">
-                <tr class="p-0" id="header"></tr>
+            <table class="table table-sm table-striped d-none d-xl-block p-0 text-nowrap table-bordered td-min-width-80"
+                   id="table" ref="boxPc">
                 <tr v-for="(inventoryMission, i) in 显示记录列" :key="i"
                     :style="{'opacity': inventoryMission.mark==='跳过'?'0.7':'','opacity': inventoryMission.mark==='确认差异'?'0.7':''}" :class="[
                     inventoryMission.mark==='已复盘有差异'?'td-cool':'',
@@ -332,7 +327,7 @@
                     inventoryMission.mark==='跳过'?'text-muted':'',
                     ]">
                     <td>
-                        <input type="checkbox" :value="inventoryMission" v-model="checkData">
+                        <input type="checkbox" :value="inventoryMission">
                         <span :id="'lockLine'+(i+1)"></span>
                     </td>
                     <td>@{{ i+1 }}</td>
@@ -588,7 +583,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         let hideHeaderTitle = function () {
             let $listOnPad = $('#listOnPad');
@@ -669,7 +664,6 @@
                 库位盘点记录:[],
                 条码索引_记录: {},
                 库位索引_记录: {},
-                checkData: [],
                 selectedStyle:'',
                 指定盘点记录列:[],
                 lastStockInventoryRecord:{},
@@ -686,7 +680,7 @@
                 isManualInputtingBarcode:false,
                 isManualInputtingAmount:true,
                 lastScannedBarcode:'',
-                inputMode:'regular',//regular,increasing,multiIncreasing
+                inputMode:'regular',
                 location:'',
                 inputting:{
                     barcode:'',amount:'',bin:'',produce_date:'',valid_date:'',batch_number:'',fromIncreasing:false
@@ -694,27 +688,13 @@
                 status:{
                     scanEndInputted:false,binDisable:false,barcodeDisable:true,amountDisable:false,
                 },
-                goodses:[],//{barcode,amount,bin,produce_date,valid_date,batch_number}
+                goodses:[],
                 selectTr:''
             },
             beforeMount: function () {
                 this.重排序并标记全列表类型();
                 this.加载下方数据并置空上方数据()//初始化先调用一次
             },
-            watch: {
-                checkData: {
-                    handler() {
-                        if (this.checkData.length === this.inventoryMissions.length) {
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        } else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep: true
-                }
-            },
             destroyed() {
                 window.removeEventListener('scroll', this.lazy)
             },
@@ -750,8 +730,6 @@
                     _this.listMode = false;
                 })();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'location',value: '库位'},
                     {name: 'commodity_name', value: '产品名'},
@@ -771,19 +749,14 @@
                     {name: 'occupied_amount', value: '分配数量', neglect: true},
                     {name: '跳过', value: '操作', neglect: true},
                 ];
-                setTimeout(function () {
-                    let _this=this;
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.inventoryMissions,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form').height())+2,
-                        vue:listVue,
-                    });
-                    header.init();
-                },0);
-                _this.建立记录索引();
+                new Header({
+                    el: "table",
+                    name: "inventoryMission",
+                    column: column,
+                    data: this.inventoryMissions,
+                    fixedTop:($('#form').height())+2,
+                }).init();
+                this.建立记录索引();
             },
             methods:{
                 selectedColor(id,e){
@@ -881,17 +854,6 @@
                 inputs() {
                     return inputs;
                 },
-                checkAll(e) {
-                    if (e.target.checked) {
-                        this.inventoryMissions.forEach((el,i)=>{
-                            if (this.checkData.indexOf(el) == '-1'){
-                                this.checkData.push(el);
-                            }
-                        });
-                    } else {
-                        this.checkData = [];
-                    }
-                },
                 barcodePress(e){
                     if(e.key==='Enter') {
                         this.barcodeChange(e);
@@ -978,9 +940,6 @@
                     $jqueryTable.forEach(function (newDom,i) {
                         newDom.remove();
                     })
-                    // $appointInventoryList.forEach(function (inventoryMission,i) {
-                    //     $appointInventoryList.splice(i,1);
-                    // });
                     $appointInventoryList=[];
                     $showBlueTable.attr('class','d-none');
                     _this.selectingId='';
@@ -1427,7 +1386,7 @@
                     let _this = this;
                     if (!confirm('确定对勾选内容进行批量操作吗?')) {return ;}
                     let url = '{{url('inventory/批量跳过或确认差异')}}';
-                    axios.post(url, {checkData: _this.checkData}).then(
+                    axios.post(url, {checkData: checkData}).then(
                         function (response) {
                             if (!response.data.success) {
                                 tempTip.setDuration(3000);
@@ -1609,7 +1568,7 @@
                     }
                 },
                 清空checkbox(){
-                    this.checkData=[];
+                    checkData=[];
                 },
                 不覆盖() {
                     let _this = this;
@@ -1713,7 +1672,7 @@
                         let data = JSON.stringify(allData1);
                         excelExport(false,data,url,this.sum,token);
                     } else {
-                        this.checkData.forEach(function (inventoryMission) {
+                        checkData.forEach(function (inventoryMission) {
                             if (inventoryMission.stock_persons.length > 0) inventoryMission.stock_person = inventoryMission.stock_persons[inventoryMission.stock_persons.length - 1].name;
                             if (inventoryMission.stock_persons.length <1) inventoryMission.stock_person='';
                             delete inventoryMission.commodity_barcodes;
@@ -1721,7 +1680,7 @@
                             delete inventoryMission.stockInventoryPersons;
                             delete inventoryMission.commodity;
                         });
-                        let data = JSON.stringify(this.checkData);
+                        let data = JSON.stringify(checkData);
                         excelExport(checkAllSign,data,url,this.sum,token);
                     }
                 },

+ 11 - 53
resources/views/inventory/stockInventory/mission.blade.php

@@ -34,31 +34,11 @@
         </form>
         </div>
         <div id="form_div" class="mt-2"></div>
-
-{{--        <div class="card-header pt-0">--}}
-{{--            <div id="form"></div>--}}
-{{--            <span class="dropdown">--}}
-{{--        <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"--}}
-{{--                data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">--}}
-{{--            导出Excel--}}
-{{--        </button>--}}
-{{--        <div class="dropdown-menu">--}}
-{{--            <a class="dropdown-item" @click="inventoryExport(false)" href="javascript:">导出勾选内容</a>--}}
-{{--            <a class="dropdown-item" @click="inventoryExport(true)" href="javascript:">导出所有页</a>--}}
-{{--        </div>--}}
-{{--        </span>--}}
-{{--        </div>--}}
-
         <div class=" pt-1">
-            <label for="all" class="d-none" id="cloneCheckAll">
-                <input id="all" type="checkbox" @click="checkAll($event)">全选
-            </label>
-            <table class="table table-sm text-nowrap table-bordered d-none" id="headerRoll"></table>
-            <table class="table table-sm text-nowrap table-striped table-bordered m-0" id="headerParent">
-                <tr class="p-0" id="header"></tr>
+            <table class="table table-sm text-nowrap table-striped table-bordered m-0 td-min-width-80" id="table">
                 <tr v-for="(inventory,i) in inventoryAccounts" @click="selectedColor(inventory.id,$event)" :style="{'font-weight': inventory.id==selectedStyle?'bold':''}">
                     <td>
-                        <input class="checkItem" type="checkbox" :value="inventory.id" v-model="checkData">
+                        <input class="checkItem" type="checkbox" :value="inventory.id">
                     </td>
                     <td>
                         @can('库存管理-盘点')
@@ -112,12 +92,11 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         let vue = new Vue({
             el: "#list",
             data: {
-                {{--inventoryAccounts:{!! $inventoryAccounts->toJson()!!}['data'],--}}
                 inventoryAccounts : [
                         @foreach($inventoryAccounts as $inventory)
                     {id:'{{$inventory->id}}',owner_name:'{{$inventory->owner?$inventory->owner->name:''}}',
@@ -136,11 +115,8 @@
                     {name:'{{$owner->id}}',value:'{{$owner->name}}'},
                     @endforeach
                 ],
-                {{--owners:{!! $owners !!},--}}
-                checkData: [],
                 selectedStyle:'',
                 sum:{!! $inventoryAccounts->total() !!},
-                // formData:{},
                 date_end:'',location:'',barcode:'', date_start:'',
                 fakeOwners:'',
                 owner_id:'',
@@ -167,10 +143,7 @@
                     condition:data,
                 });
                 this.form.init();
-                let _this = this;
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'operation',value: '操作', neglect: true},
                     {name:'check',value: '审核', neglect: true},
                     {name:'index',value: '序号', neglect: true},
@@ -192,17 +165,13 @@
                     {name: 'creator', value: '创建人', neglect: true},
                     {name:'remove',value: '操作', neglect: true},
                 ];
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.inventoryAccounts,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form').height())+2,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
+                new Header({
+                    el: "table",
+                    name: "stockInventory",
+                    column: column,
+                    data: this.inventoryAccounts,
+                    fixedTop:($('#form').height())+2,
+                }).init();
             },
             methods:{
                 selectedColor(id,e){
@@ -214,21 +183,10 @@
                     this.selectedStyle=id;
                     $(e.target).parent('tr').addClass('focusing')
                 },
-                checkAll(e){
-                    if (e.target.checked){
-                        this.inventories.forEach((el,i)=>{
-                            if (this.checkData.indexOf(el.id) == '-1'){
-                                this.checkData.push(el.id);
-                            }
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
-                },
                 inventoryExport(checkAllSign){
                     let url = '{{url('inventory/stockInventoryExport')}}';
                     let token='{{ csrf_token() }}';
-                    excelExport(checkAllSign,this.checkData,url,this.sum,token);
+                    excelExport(checkAllSign,checkData,url,this.sum,token);
                 },
                 //生成盘点任务
                 createInventoryMission(){

+ 2 - 2
resources/views/maintenance/facilitator/_create.blade.php

@@ -2,7 +2,7 @@
     <div class="modal-dialog modal-dialog-centered ">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title text-center">服务商添加</h5>
+                <h5 class="modal-title text-center">装卸队添加</h5>
                 <button type="button" class="close" data-dismiss="modal" @click="createFacilitator={}">
                     <span>&times;</span>
                 </button>
@@ -10,7 +10,7 @@
             <div class="modal-body">
                 <form class="form">
                     <div class="form-group row" >
-                        <label for="add-name" class="col-sm-3 col-form-label text-right">服务商名称</label>
+                        <label for="add-name" class="col-sm-3 col-form-label text-right">装卸队名称</label>
                         <div class="col-sm-9 form-inline">
                             <input type="text" class="form-control col-sm-12" v-model="createFacilitator.name" placeholder="输入服务商名称" :class="facilitatorError.name? 'is-invalid' :''">
                             <div class="invalid-feedback" >

+ 2 - 2
resources/views/maintenance/facilitator/_edit.blade.php

@@ -2,7 +2,7 @@
     <div class="modal-dialog modal-dialog-centered">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title text-center">服务商添加</h5>
+                <h5 class="modal-title text-center">装卸队添加</h5>
                 <button type="button" class="close" data-dismiss="modal" @click="editFacilitator={},selectIndex=null,facilitatorError={}">
                     <span>&times;</span>
                 </button>
@@ -10,7 +10,7 @@
             <div class="modal-body">
                 <form class="form">
                     <div class="form-group row" >
-                        <label for="add-name" class="col-sm-3 col-form-label text-right">服务商名称</label>
+                        <label for="add-name" class="col-sm-3 col-form-label text-right">装卸队名称</label>
                         <div class="col-sm-9 form-inline">
                             <input type="text" class="form-control col-sm-12" v-model="editFacilitator.name" placeholder="输入服务商名称" :class="facilitatorError.name? 'is-invalid' :''">
                             <div class="invalid-feedback" >

+ 4 - 4
resources/views/maintenance/facilitator/_table.blade.php

@@ -1,7 +1,7 @@
 <table class="table table-sm table-striped table-bordered table-hover card-body p-0 m-0">
     <tr class="text-center">
         <th>序号</th>
-        <th>服务商名称</th>
+        <th>装卸队名称</th>
         <th>创建时间</th>
         <th>操作</th>
     </tr>
@@ -12,11 +12,11 @@
             <td>@{{ facilitator.name }}</td>
             <td>@{{ facilitator.created_at }}</td>
             <td>
-                @can('服务商-编辑')
+                @can('装卸队-编辑')
                 <button class="btn btn-sm btn-outline-primary" @click="showUpDateModal(true,index,facilitator)">编辑
                 @endcan
                 </button>
-                @can('服务商-删除')
+                @can('装卸队-删除')
                 <button class="btn btn-sm btn-outline-danger" @click="destroyFacilitator(facilitator,index)">删除</button>
                 @endcan
             </td>
@@ -26,7 +26,7 @@
         <tr>
             <td colspan="4">
                 <div class="alert alert-info text-lg-center">
-                    服务商数据为空
+                    装卸队数据为空
                 </div>
             </td>
         </tr>

+ 7 - 7
resources/views/maintenance/facilitator/index.blade.php

@@ -1,17 +1,17 @@
 @extends('layouts.app')
 
-@section('title','服务商')
+@section('title','装卸队')
 
 @section('content')
-    <nav class="nav2">
+    <nav id="nav2">
         @component('maintenance.menu')@endcomponent
     </nav>
     <div class="container-fluid d-none" id="facilitator">
         <div class="card">
-            @can('服务商-创建')
+            @can('装卸队-创建')
             @include('maintenance.facilitator._create')
             @endcan
-            @can('服务商-编辑')
+            @can('装卸队-编辑')
             @include('maintenance.facilitator._edit')
             @endcan
             <div class="card-body">
@@ -92,7 +92,7 @@
                     axios.post(url,this.createFacilitator).then(res=>{
                         if(res.data.success){
                             this.facilitators.unshift(res.data.data);
-                            tempTip.showSuccess('添加服务商成功');
+                            tempTip.showSuccess('添加装卸队成功');
                             this.showCreatedModal(false)
                             return ;
                         }else if(res.data.error){
@@ -112,7 +112,7 @@
                     axios.put(url,this.editFacilitator).then(res=>{
                         if(res.data.success){
                             this.$set(this.facilitators,this.selectIndex,res.data.data);
-                            tempTip.showSuccess('服务商更新成功');
+                            tempTip.showSuccess('装卸队更新成功');
                             this.showUpDateModal(false);
                             return ;
                         }else if(res.data.error){
@@ -131,7 +131,7 @@
                     tempTip.setDuration(1999);
                     axios.delete(url).then(res=>{
                         if(res.data.success){
-                            tempTip.showSuccess("服务商删除成功");
+                            tempTip.showSuccess("装卸队删除成功");
                             this.$delete(this.facilitators,index);
                             return ;
                         }else if(res.data.error){

+ 2 - 2
resources/views/maintenance/menu.blade.php

@@ -123,9 +123,9 @@
                 <li class="nav-item">
                     <a class="nav-link text-muted" href="{{url('maintenance/configuration')}}" :class="{active:isActive('configuration',2)}">系统配置</a>
                 </li>@endcan
-            @can('服务商')
+            @can('装卸队')
                 <li class="nav-item">
-                    <a class="nav-link text-muted" href="{{url('maintenance/facilitator')}}" :class="{active:isActive('facilitator',2)}">服务商</a>
+                    <a class="nav-link text-muted" href="{{url('maintenance/facilitator')}}" :class="{active:isActive('facilitator',2)}">装卸队</a>
                 </li>
             @endcan
         </ul>

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

@@ -13,10 +13,7 @@
                 @if(Session::has('successTip'))
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                 @endif
-                <table class="table table-bordered table-sm d-none" id="headerRoll"></table>
-                <table class="table table-striped table-sm" id="headerParent">
-                    <tr id="header">
-                    </tr>
+                <table class="table table-striped table-sm td-min-width-80" id="table">
                     <tr v-for="(role,i) in roles"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td class="text-muted">@{{role.id}}</td>
                         <td>@{{role.name}}</td>
@@ -51,7 +48,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>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         new Vue({
             el:"#list",
@@ -82,13 +79,13 @@
                     {name:'created_at',value: '创建时间'},
                     {name:'operation',value: '操作', neglect: true},
                 ];
-                let header = new Header({
+                new Header({
+                    el:"table",
+                    name:"role",
                     column: column,
                     data: this.roles,
                     fixedTop: ($('#form_div').height())+2,
-                    restorationColumn: 'id',
-                });
-                header.init();
+                }).init();
             },
             methods:{
                 edit:function(id){

+ 6 - 16
resources/views/maintenance/user/index.blade.php

@@ -14,9 +14,7 @@
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                 @endif
                 <div id="list">
-                    <table class="table table-bordered table-sm d-none" id="headerRoll"></table>
-                    <table class="table table-striped table-sm" id="headerParent">
-                        <tr id="header"></tr>
+                    <table class="table table-striped table-sm td-min-width-80" id="table">
                         <tr v-for="(user,i) in users"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                             <td class="text-muted">@{{user.id}}</td>
                             <td>@{{user.name}}</td>
@@ -59,19 +57,11 @@
 
     </script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         new Vue({
             el:"#list",
             data:{
-                {{--users:[--}}
-                {{--    @foreach( $users as $user )--}}
-                {{--    {id:'{{$user->id}}',name:'{{$user->name}}',email:'{{$user->email}}',--}}
-                {{--        isSuperAdmin:'{{$user->isSuperAdmin}}',--}}
-                {{--        roles:{!! $user->roles !!},logistics:{!! $user->logistics !!},workgroup:{!! $user->userWorkgroups !!},created_at:'{{$user->created_at}}'},--}}
-                {{--    @endforeach--}}
-                {{--],--}}
-                {{--users:{!! $users !!},--}}
                 users:{!! $users->toJson() !!}['data'],
                 form:'',
                 selectTr:0
@@ -95,14 +85,14 @@
                     {name:'created_at',value: '创建时间'},
                     {name:'operation',value: '操作', neglect: true},
                 ];
-                let header = new Header({
+                new Header({
+                    el:"table",
+                    name:"user",
                     column: column,
                     data: this.users,
                     fixedTop: ($('#form_div').height())+2,
-                    restorationColumn: 'id',
                     is_restorationColumn_asc:true,
-                });
-                header.init();
+                }).init();
             },
             methods:{
                 edit:function(id){

+ 84 - 138
resources/views/order/index/delivering.blade.php

@@ -9,7 +9,7 @@
                 <div id="form_div"></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" :class="[checkData.length>0?'btn-dark text-light':'']"
+                        <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
                                 data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
                             导出Excel
                         </button>
@@ -24,22 +24,17 @@
                     </div>
                     @can('订单管理-批量备注')<button @click="modal()" type="button" class="btn btn-sm ml-2 btn-outline-primary">批量备注追加</button>@endcan
                     @can('订单管理-编辑')
-                        <span class="btn btn-sm tooltipTarget ml-1"  @click="freezeAll" style="cursor: pointer" title="订单的冻结条件要只局限在“创建订单”,“分配完成”,“拣货完成”,“播种完成”"
-                              :class="[checkData.length>0?'btn-dark':'btn-outline-dark']" >冻结</span>
-                        <button type="button" @click="thaw(checkData,true)" class="btn btn-sm tooltipTarget ml-1" title="解除已冻结订单"
-                                :class="[checkData.length>0?'btn-danger':'btn-outline-danger']" style="opacity: 0.7">解冻</button>
-                        <span class="btn btn-sm tooltipTarget ml-1" @click="deAllocationAll" style="cursor: pointer"  title="订单的取消分配条件要只局限在“分配完成”或“部分分配”"
-                              :class="[checkData.length>0?'btn-dark':'btn-outline-dark'] ">取消分配</span>
-                        <button type="button" @click="resetLogisticsGetMark()" class="btn btn-sm ml-1 btn-outline-success"
-                                :class="[checkData.length>0?'btn-success text-light':''] ">重置快递获取标记</button>
+                        <span class="btn btn-sm btn-outline-dark tooltipTarget ml-1"  @click="freezeAll" style="cursor: pointer" title="订单的冻结条件要只局限在“创建订单”,“分配完成”,“拣货完成”,“播种完成”">冻结</span>
+                        <button type="button" @click="thaw(null,true)" class="btn btn-sm btn-outline-danger tooltipTarget ml-1" title="解除已冻结订单" style="opacity: 0.7">解冻</button>
+                        <span class="btn btn-sm btn-outline-dark tooltipTarget ml-1" @click="deAllocationAll" style="cursor: pointer"  title="订单的取消分配条件要只局限在“分配完成”或“部分分配”">取消分配</span>
+                        <button type="button" @click="resetLogisticsGetMark()" class="btn btn-sm ml-1 btn-outline-success">重置快递获取标记</button>
                     @endcan
-                    @can('订单管理-订单-生成问题件')<button  @click="orderIssueTag()" type="button" class="btn btn-sm ml-1 btn-outline-primary "
-                                                 :class="[checkData.length>0?'btn-primary text-light':'']">标记问题件</button>@endcan
+                    @can('订单管理-订单-生成问题件')<button  @click="orderIssueTag()" type="button" class="btn btn-sm ml-1 btn-outline-primary">标记问题件</button>@endcan
                     @can('订单管理-订单-生成退货单')
-                        <button class="btn btn-sm ml-1" :class="[checkData.length>0?'btn-danger':'btn-outline-danger']" @click="isRejectedBillExist()"
+                        <button class="btn btn-sm btn-outline-dark ml-1"@click="isRejectedBillExist()"
                             style="opacity: 0.7">生成退货单</button>
                     @endcan
-                    <button class="btn btn-sm ml-1 btn-primary" v-if="checkData.length>0" @click="copyLogisticNumber()">复制快递单号</button>
+                    <button class="btn btn-sm ml-1 btn-primary" @click="copyLogisticNumber()">复制快递单号</button>
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
@@ -57,15 +52,10 @@
                         </div><!-- /.modal-content -->
                     </div><!-- /.modal -->
                 </div>
-                <label for="all" id="cloneCheckAll" class="d-none">
-                    <input id="all" type="checkbox" @click="checkAll($event)">
-                </label>
-                <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ml-3 d-none" id="headerRoll"></table>
-                <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ml-3" id="headerParent">
-                    <tr class="text-nowrap" id="header"></tr>
+                <table class="table table-striped table-bordered table-hover card-body td-min-width-80" id="table">
                     <tr v-for="(order,i) in orders" @click="selectedColor(order.orderno)" :style="{'background-color': order.orderno==selectedStyle?'#aac7ea':''}">
                         <td>
-                            <input class="checkItem" type="checkbox" :value="order.orderno" v-model="checkData">
+                            <input class="checkItem" type="checkbox" :value="order.orderno">
                         </td>
                         <td class="text-nowrap">
                             @{{ i+1 }}<span v-if="orderIssueNos.includes(order.orderno)" class="badge badge-pill badge-danger">问题件</span>
@@ -92,7 +82,7 @@
                             <span v-else>@{{ order.soreference5 }}</span>
                         </td>
                         <td class="text-muted text-wrap text-letter" style="max-width: 200px">@{{ order.c_contact }}</td>
-                        <td class="text-muted text-wrap text-letter" style="max-width: 200px">@{{ order.c_tel2?order.c_tel2:order.c_tel1 }}</td>
+                        <td class="text-muted text-wrap text-letter" style="width: 150px">@{{ order.c_tel2?order.c_tel2:order.c_tel1 }}</td>
                         <td class="text-nowrap"> @{{ order.c_province }}</td>
                         <td class="text-nowrap"> @{{ order.c_city }}</td>
                         <td class="text-nowrap"> @{{ order.c_district }}</td>
@@ -101,28 +91,24 @@
                         <td class="text-nowrap"> @{{ order.warehouseid }}</td>
                         <td class="text-nowrap"><span v-if="order.edisendflag2=='Y'">是</span><span v-if="order.edisendflag2=='N'">否</span><span v-if="order.edisendflag2=='W'">错误</span></td>
                         <td class="text-nowrap">@{{ order.edisendtime2 }}</td>
-                        <td colspan="7" class="text-center">
-                            <table v-if="commodities[order.orderno]&&commodities[order.orderno].length==1 || isBtn[order.orderno]" class="table text-nowrap table-sm">
-                                <tr v-for="oracleDOCOrderDetail in commodities[order.orderno]">
-                                    <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.sku }}</div></td>
-                                    <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.alternate_sku1 }}</div></td>
-                                    <td>
-                                        <div class="text-truncate text-primary tooltipTarget" style="width: 100px;cursor:pointer;text-decoration: underline" title="双击展开全部" @dblclick="nowrapText($event)">@{{ oracleDOCOrderDetail.descr_c  }}</div>
-                                        <div class="text-nowrap tooltipTarget"  style="display: none;cursor:pointer" @dblclick="truncateText($event)" title="双击收起全部">@{{ oracleDOCOrderDetail.descr_c  }}</div>
-{{--                                        <div :title="oracleDOCOrderDetail.descr_c" class="tooltipTarget" style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.descr_c }}</div>--}}
-                                    </td>
-                                    <td><div style="min-width: 100px">@{{ oracleDOCOrderDetail.qtyordered }}</div></td>
-                                    <td><div style="min-width: 150px">@{{ oracleDOCOrderDetail.lotnum }}</div></td>
-                                    <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.orderdetailcodename }}</div></td>
-                                    <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.checktime }}</div></td>
-                                </tr>
-                                <tr v-if="isBtn[order.orderno]">
-                                    <td colspan="7">
-                                        <b style="cursor:pointer;color: #4aa0e6;" @click="isBtn[order.orderno]=false;">点击收起明细</b>
-                                    </td>
-                                </tr>
-                            </table>
-                            <b @click="unfold(order.orderno)" style="cursor:pointer;text-decoration: underline;color: #4aa0e6;" v-if="commodities[order.orderno]&&commodities[order.orderno].length>1 && !isBtn[order.orderno]">共有 @{{ commodities[order.orderno].length }}  件商品,点击展开</b>
+                        <td class="text-center" style="min-width: 900px">
+                            <div :class="commodities[order.orderno]&&commodities[order.orderno].length==1 ? '' : 'up'" :id="'order-'+i">
+                                <div v-for="oracleDOCOrderDetail in commodities[order.orderno]" class="row">
+                                    <div class="col-2">@{{ oracleDOCOrderDetail.sku }}</div>
+                                    <div class="col-2">@{{ oracleDOCOrderDetail.alternate_sku1 }}</div>
+                                    <div class="col-2" @dblclick.stop="replaceText($event)">
+                                        <div class="w-100 text-overflow-replace-100 text-primary">@{{ oracleDOCOrderDetail.descr_c  }}</div>
+                                    </div>
+                                    <div class="col-1">@{{ oracleDOCOrderDetail.qtyordered }}</div>
+                                    <div class="col-2">@{{ oracleDOCOrderDetail.lotnum }}</div>
+                                    <div class="col-1 m-0 p-0">@{{ oracleDOCOrderDetail.orderdetailcodename }}</div>
+                                    <div class="col-2">@{{ oracleDOCOrderDetail.checktime }}</div>
+                                </div>
+                            </div>
+                            <div class="row text-center cursor-pointer" v-if="commodities[order.orderno]&&commodities[order.orderno].length>1">
+                                <b @click="unfold(i)" class="col-12 cursor-pointer" v-if="!upList[i]">共有 @{{ commodities[order.orderno].length }}  件商品,点击展开</b>
+                                <b class="col-12" @click="unfold(i)" v-else>点击收起明细</b>
+                            </div>
                         </td>
                         <td>@{{ order.notes }}</td>
                         <td>@{{ order.erpcancelflag }}</td>
@@ -234,7 +220,6 @@
                 </div>
                 <textarea  id="clipboardDiv" style="opacity:0"></textarea>
             </div>
-
         </div>
     </div>
 @endsection
@@ -242,7 +227,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         let vue=new Vue({
             el:"#list",
@@ -251,7 +236,6 @@
                 paginate:Number('{{$request['paginate'] ?? 50}}'),
                 maxPage:1,
                 sum:0,
-                checkData:[],
                 owners:[
                         @foreach($customers as $customer)
                     { name:'{{$customer->customerid}}',value:'{{$customer->descr_c}}' },
@@ -259,7 +243,6 @@
                 ],
                 orders:{!! $orders !!},
                 commodities:{!! $commodities !!},
-                isBtn:{},
                 content:'',
                 codes:[
                         @foreach($codes as $code)
@@ -282,8 +265,10 @@
                     logisticInfo:'',
                     merchantInfo:'',
                 },
+                upList:{},
             },
             mounted:function () {
+                $(".up").slideUp();
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
                 $("#list").removeClass('d-none');
                 if (this.orders.length>0){
@@ -340,8 +325,6 @@
                 });
                 this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'orderno',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'orderno',value: '编号'},
                     {name:'ordercodename',value: '订单状态'},
@@ -356,19 +339,21 @@
                     {name:'c_province',value: '省'},
                     {name:'c_city',value: '市'},
                     {name:'c_district',value: '区'},
-                    {name:'c_address1',value: '收货人地址', style:"min-width:320px;"},
+                    {name:'c_address1',value: '收货人地址'},
                     {name:'waveno',value: '波次编号'},
                     {name:'warehouseid',value: '仓库'},
                     {name:'edisendflag2',value: '快递获取标记'},
                     {name:'edisendtime2',value: '快递获取时间'},
-                    {name:'sku',value: '产品代码', neglect: true, style:"min-width: 150px"},
-                    {name:'alternate_sku1',value: '产品条码', neglect: true, style:"min-width: 150px"},
-                    {name:'descr_c',value: '产品名称', neglect: true, style:"min-width: 180px"},
-                    {name:'qtyordered',value: '订单数量', neglect: true},
-                    {name:'lotnum',value: '批次号', style:"min-width: 150px"},
-                    {name:'orderdetailcodename',value: '明细状态', neglect: true, style:"min-width: 150px"},
-                    {name:'checktime',value: '复核时间', neglect: true},
-                    {name:'notes',value: '备注', style:"min-width: 260px"},
+                    {name:"commodity", type:"multi",title:"商品信息",rows:[
+                            {value:"产品代码",col:"2"},
+                            {value:"产品条码",col:"2"},
+                            {value:"产品名称",col:"2"},
+                            {value:"订单数量",col:"1"},
+                            {value:"批次号",col:"2"},
+                            {value:"明细状态",col:"1"},
+                            {value:"复核时间",col:"2"}
+                        ]},
+                    {name:'notes',value: '备注'},
                     {name:'erpcancelflag',value: '接口取消标记'},
                     {name:'picking_print_flag',value: '拣货单打印标记'},
                     {name:'edisendflag',value: '接口回传标记'},
@@ -376,36 +361,19 @@
                     {name:'update',value: '订单冻结', neglect: true},
                     {name:'remove',value: '取消分配', neglect: true},
                 ];
-                let _this=this;
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.orders,
-                        restorationColumn: 'addtime',
-                        fixedTop:($('#form_div').height())+($('#btn').height())+1,
-                        offset:0.5,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
+                new Header({
+                    el: "table",
+                    name:"order",
+                    column: column,
+                    data: this.orders,
+                    restorationColumn: 'addtime',
+                    fixedTop:($('#form_div').height())+($('#btn').height())+1,
+                }).init();
             },
             watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.orders.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                },
                 result_explain:function(){
-                    this.setLogisticInfo()
-                    this.setMerchantInfo()
+                    this.setLogisticInfo();
+                    this.setMerchantInfo();
                 }
             },
             methods:{
@@ -444,28 +412,14 @@
                     }
                     window.location.href=url;
                 },
-                //全选事件
-                checkAll(e){
-                    if (e.target.checked){
-                        this.orders.forEach((el,i)=>{
-                            if (this.checkData.indexOf(el.orderno) == '-1'){
-                                this.checkData.push(el.orderno);
-                            }
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
-                },
-                unfold(orderno){
-                    this.$set(this.isBtn,orderno,true);
-                    setTimeout(function () {
-                        $(".tooltipTarget").tooltip({'trigger':'hover'});
-                    },1);
+                unfold(index){
+                    this.$set(this.upList,index,this.upList[index] ? !this.upList[index] : true);
+                    $("#order-"+index).slideToggle();
                 },
                 orderExport(checkAllSign){
                     let url = '{{url('order/index/export')}}';
                     let token='{{ csrf_token() }}';
-                    excelExport(checkAllSign,this.checkData,url,this.sum,token,{is_merge : this.is_merge});
+                    excelExport(checkAllSign,checkData,url,this.sum,token,{is_merge : this.is_merge});
                 },
                 modal(){
                     $("#myModal").modal('show');
@@ -473,15 +427,15 @@
                 //批量冻结
                 freezeAll:function(){
                     let _this=this;
-                    if(_this.checkData.length===0){
+                    if(checkData.length===0){
                         tempTip.show('没有勾选记录');
                         return
                     }
                     if(!confirm("确定要标记所有勾选内容为'冻结'吗")){return;}
-                    axios.post('{{url('order/freezeAll')}}',{checkData:_this.checkData}).then(function(response){
+                    axios.post('{{url('order/freezeAll')}}',{checkData:checkData}).then(function(response){
                         if(response.data.success){
                             _this.orders.forEach(function(order){
-                                _this.checkData.forEach(function (checkedId) {
+                                checkData.forEach(function (checkedId) {
                                     if(order.orderno===checkedId){
                                         order.releasestatus='H';
                                         order.waveno='*';
@@ -502,15 +456,15 @@
                 //批量取消分配
                 deAllocationAll(){
                     let _this=this;
-                    if(_this.checkData.length===0){
+                    if(checkData.length===0){
                         tempTip.show('没有勾选记录');
                         return
                     }
                     if(!confirm("确定要所有勾选内容'取消分配'吗")){return;}
-                    axios.post('{{url('order/deAllocationAll')}}',{checkData:_this.checkData}).then(function(response){
+                    axios.post('{{url('order/deAllocationAll')}}',{checkData:checkData}).then(function(response){
                         if(response.data.success){
                             _this.orders.forEach(function(order){
-                                _this.checkData.forEach(function (checkedId) {
+                                checkData.forEach(function (checkedId) {
                                     if(order.orderno===checkedId){
                                         order.sostatus='00';
                                         order.waveno='*';
@@ -532,14 +486,14 @@
                 },
                 batchComments(){
                     let _this=this;
-                    if (this.checkData.length<1 || !this.content) {
+                    if (checkData.length<1 || !this.content) {
                         $("#myModal").modal('hide');
                         tempTip.setDuration(3000);
-                        if (this.checkData.length<1) tempTip.showSuccess('没有勾选任何记录');
+                        if (checkData.length<1) tempTip.showSuccess('没有勾选任何记录');
                         else tempTip.showSuccess('没有输入任何内容');
                         return;
                     }
-                    axios.post('{{url('order/create/batchComments')}}',{checkData:this.checkData,content:this.content})
+                    axios.post('{{url('order/create/batchComments')}}',{checkData:checkData,content:this.content})
                         .then(function (response) {
                             let sign=[];
                             _this.orders.every(function (order) {
@@ -588,7 +542,8 @@
                         tempTip.show('网络异常:'+err);
                     });
                 },
-                thaw(orderno, is_batch = false, order = null){
+                thaw(orderno = null, is_batch = false, order = null){
+                    if (!orderno)orderno = checkData;
                     if(!confirm('确定要解冻“'+orderno+'”吗?'))return;
                     let _this=this;
                     axios.post('{{url('order/thaw')}}',{orderno:orderno})
@@ -644,7 +599,7 @@
                     order.is_unfold=false;
                 },
                 orderIssueTag(){
-                    if( this.checkData.length === 0){
+                    if( checkData.length === 0){
                         tempTip.setDuration(2000);
                         tempTip.show('没有勾选记录');
                         return;
@@ -661,19 +616,18 @@
                     let _this = this;
                     tempTip.setDuration(99999);
                     tempTip.waitingTip('处理中,请稍候');
-                    let data = {orderNos:this.checkData,typeId: this.typeId,result_explain:this.result_explain};
+                    let data = {orderNos:checkData,typeId: this.typeId,result_explain:this.result_explain};
                     axios.post("{{url('apiLocal/order/issue/orderIssueTag')}}",data).then(function(res){
                         tempTip.setDuration(5000);
                         tempTip.cancelWaitingTip();
                         if(res.data.success){
                             tempTip.setDuration(3000);
                             tempTip.showSuccess('已标记为问题件');
-                            _this.checkData.forEach(function(orderNo){
+                            checkData.forEach(function(orderNo){
                                 _this.orderIssueNos.push(orderNo)
                             });
-                            _this.checkData = []
+                            checkData = []
                         }else{
-                            console.log(res.data);
                             if(res.data.exitsOrderNos){
                                 _this.message.checkOrderIssueMessage = res.data.fail_info+res.data.exitsOrderNos;
                                 $("#checkModal").modal('show');
@@ -690,7 +644,7 @@
                 },
                 //重置快递获取标记
                 resetLogisticsGetMark(){
-                    if (this.checkData.length < 1){
+                    if (checkData.length < 1){
                         tempTip.setDuration(3000);
                         tempTip.showSuccess('未选择任何单号');
                         return
@@ -698,10 +652,10 @@
                     if (!confirm('确定要重置这些单的快递获取标记吗?'))return;
                     let url = '{{url('order/resetLogisticsGetMark')}}';
                     let _this = this;
-                    axios.post(url,{orderno : this.checkData})
+                    axios.post(url,{orderno : checkData})
                         .then(function (response) {
                             if (response.data.success){
-                                _this.checkData.forEach(orderno => {
+                                checkData.forEach(orderno => {
                                     _this.orders.some(order => {
                                         if (order.orderno === orderno && order.edisendflag2 === 'W'){
                                             order.edisendflag2 = "N";
@@ -729,18 +683,17 @@
                     $(e.target).removeClass('is-invalid');
                 },
                 isRejectedBillExist(){
-                    let _this=this;
-                    if(_this.checkData.length===0){
+                    if(checkData.length===0){
                         tempTip.show('没有勾选记录');
                         return
                     }
-                    tempTip.confirm("是否要生成“"+this.checkData+"”的退货单?",()=> {
+                    tempTip.confirm("是否要生成“"+checkData+"”的退货单?",()=> {
                         let _this = this;
                         let arr = [];
                         window.tempTip.setDuration(9999);
                         window.tempTip.waitingTip("生成中,请稍等......")
                         this.orders.forEach(order=> {
-                            if (this.checkData.includes(order.orderno))arr.push(order.soreference1);
+                            if (checkData.includes(order.orderno))arr.push(order.soreference1);
                         });
                         axios.post('{{url('order/isRejectedBillExist')}}',{data:arr})
                             .then(function (response) {
@@ -763,7 +716,7 @@
                 },
                 createRejectedBill() {
                     let url = '{{url('order/createRejectedBill')}}';
-                    axios.post(url,{data:this.checkData})
+                    axios.post(url,{data:checkData})
                         .then(res=>{
                             if (res.data.success){
                                 tempTip.cancelWaitingTip();
@@ -782,7 +735,7 @@
                         });
                 },
                 isExistByOrderNos(){
-                    let orderNos = this.checkData;
+                    let orderNos = checkData;
                     let data = {orderNos:orderNos};
                     let _this = this;
                     axios.post("{{url('apiLocal/order/issue/isExistByOrderNo')}}",data).then(function(res){
@@ -798,18 +751,11 @@
                         tempTip.show('网络异常:'+error)
                     })
                 },
-                truncateText(e){
-                    $table = $(e.target).parents('.table').first();
-                    $table.find('.text-nowrap').hide();
-                    $table.find('.text-truncate').show();
-                },
-                nowrapText(e) {
-                    $table = $(e.target).parents('.table').first();
-                    $table.find('.text-truncate').hide();
-                    $table.find('.text-nowrap').show();
+                replaceText(e){
+                    e.target.firstChild.className = "w-100 text-overflow-warp-100";
                 },
                 getTagOrder(orderNos){
-                    this.tagOrders = []
+                    this.tagOrders = [];
                     if(orderNos.length ===  0 ){this.tagOrders =[];return ;}
                     if(this.orders.length === 0 ){this.tagOrders =[];return ;}
                     for (let i = 0; i < this.orders.length; i++) {
@@ -846,7 +792,7 @@
                 },
                 copyLogisticNumber(){
                     let text="";
-                    this.checkData.forEach((code,i)=>{
+                    checkData.forEach((code,i)=>{
                         if(this.picktotraceidMap[code] && this.picktotraceidMap[code].length>1){
                             this.picktotraceidMap[code].forEach((number,j)=>{
                                 text += number+"\r\n";

+ 6 - 8
resources/views/order/index/index.blade.php

@@ -8,8 +8,7 @@
     <div class="card">
         <div class="card-body">
             <button class="btn  btn-outline-info mb-1" data-toggle="modal" data-target="#importModal">导入</button>
-            <table class="table table-striped table-hover" id="headerParent">
-                <tr id="header"></tr>
+            <table class="table table-striped table-hover td-min-width-80" id="table">
                 <tr v-for="(model,i) in models"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                     <td>@{{ i+1 }}</td>
                     <td>@{{ model.orderNumber }}</td>
@@ -31,7 +30,7 @@
 @endsection
 
 @section('lastScript')
-<script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+<script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
 <script>
     new Vue({
         el:"#container",
@@ -71,13 +70,12 @@
                 {name:'createdAt',value: '导入日期'},
                 {name:'userName',value: '操作人'},
             ];
-            let header = new Header({
-                el: "#header",
+            new Header({
+                el: "table",
+                name: "orderIndex",
                 column: column,
                 data: this.models,
-                restorationColumn: 'id',
-            });
-            header.init();
+            }).init();
         },
         methods:{
             selectFile(){

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

@@ -881,7 +881,7 @@
                         data: this.logistics
                     },
                     {name: 'logistic_number_return', type: 'input', tip: '退回单号:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '退回单号'},
-                    {name: 'send_client_code', type: 'input', tip: '二次订单号:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '二次订单号'},
+                    // {name: 'send_client_code', type: 'input', tip: '二次订单号:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '二次订单号'},
                     {name: ['shop_name','shop_name_limit_time'], type: 'input_select', tip: ['商铺:前或后加 百分号为单个模糊搜索,默认添加后%,否则为多条件精确搜索','查询范围越短,搜索速度越快'], placeholder: ['店铺',''],
                         data:log_content_range,
                         rules:[{son:{shop_name_limit_time:{default:'15',required_without_all_if:['created_at_start','created_at_end']}}}]},

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

@@ -10,7 +10,6 @@
                 <span class="dropdown">
                     <button type="button"
                             class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
-                            :class="[checkData.length>0?'btn-dark text-light':'']"
                             data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">导出Excel
                     </button>
                     <div class="dropdown-menu">
@@ -19,24 +18,9 @@
                     </div>
                 </span>
             </div>
-            <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ">
-                <tr class="text-nowrap" id="header"></tr>
-                <tr class="text-center">
-                    <th>
-                        <input type="checkbox" id="all" @click="checkAll($event)">
-                    </th>
-                    <th>序号</th>
-                    <th>问题件ID</th>
-                    <th>创建时间</th>
-                    <th>完结时间</th>
-                    <th>创建人</th>
-                    <th>结束人</th>
-                    <th>客户</th>
-                    <th>快递单号</th>
-                    <th>处理时效</th>
-                </tr>
+            <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 td-min-width-80" id="table">
                 <tr v-for="(workLoad,index) in workLoads" class="text-center">
-                    <td><input type="checkbox" v-model="checkData" :value="workLoad.id"></td>
+                    <td><input type="checkbox" :value="workLoad.id"></td>
                     <td>@{{ index+1 }}</td>
                     <td>@{{ workLoad.id }}</td>
                     <td>@{{ workLoad.created_at }}</td>
@@ -76,7 +60,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
         let workLoadVue = new Vue({
             el: "#workLoad_div",
@@ -84,7 +68,6 @@
                 workLoads: {!! $workLoads->append(['createUser','endUser','processingTime',])->toJson()??[] !!},
                 users:{!! $users->toJson() !!},
                 owners:{!! $owners->toJson() !!},
-                checkData: [],
                 query: {
                     create_user_id: '{{$options['create_user_id']}}',
                     end_user_id: '{{$options['end_user_id']}}',
@@ -105,7 +88,6 @@
                 form:'',
             },
             mounted: function () {
-
                 $('#workLoad_div').removeClass('d-none');
                 let users = [];
                 let owners = [];
@@ -132,34 +114,30 @@
                     condition:data,
                 });
                 this.form.init();
-            },
-            watch: {
-                checkData: {
-                    handler() {
-                        if (this.checkData.length === this.workLoads.length) {
-                            document.querySelector('#all').checked = true;
-                        } else {
-                            document.querySelector('#all').checked = false;
-                        }
-                    },
-                    deep: true
-                }
+                let column = [
+                    {name:'index',value: '序号', neglect: true},
+                    {name:'id',value: '问题件ID', neglect: true},
+                    {name:'created_at',value: '创建时间', neglect: true},
+                    {name:'created_at',value: '完结时间', neglect: true},
+                    {name:'createUser',value: '创建人', neglect: true},
+                    {name:'endUser',value: '结束人', neglect: true},
+                    {name:'name',value: '客户', neglect: true},
+                    {name:'number',value: '快递单号', neglect: true},
+                    {name:'processingTime',value: '处理时效', neglect: true},
+                ];
+                new Header({
+                    el: "table",
+                    name: "workload",
+                    column: column,
+                    data: this.waybills,
+                    fixedTop:($('#form_div').height())+2,
+                }).init();
             },
             methods: {
-                checkAll(e) {
-                    if (e.target.checked) {
-                        this.workLoads.forEach((el, i) => {
-                            if (this.checkData.indexOf(el.id) == '-1')
-                                this.checkData.push(el.id);
-                        });
-                    } else {
-                        this.checkData = [];
-                    }
-                },
                 exportSelected() {
                     let url = '{{url('order/issue/workLoad/export')}}';
                     let token = '{{ csrf_token() }}';
-                    excelExport(false, this.checkData, url, this.page.total, token);
+                    excelExport(false, checkData, url, this.page.total, token);
                 },
                 exportAll() {
                     let url = '{{url('order/issue/workLoad/export')}}';

+ 0 - 1
resources/views/order/tracking/index.blade.php

@@ -267,7 +267,6 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
     <style>
         .btn-border{
             border:1px solid rgba(108, 117, 125,0.3);

+ 0 - 2
resources/views/package/logistic/index.blade.php

@@ -56,9 +56,7 @@
 @endsection
 
 @section('lastScript')
-    <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
     <script>
         let vue = new Vue({
             el: "#list",

+ 12 - 50
resources/views/package/weigh/index.blade.php

@@ -12,7 +12,7 @@
         <div class="container-fluid">
             <div id="form_div"></div>
             <span class="dropdown">
-                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget mt-1 mb-1" :class="[checkData.length>0?'btn-dark text-light':'']"
+                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget mt-1 mb-1"
                         data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
                     导出Excel
                 </button>
@@ -22,15 +22,10 @@
                 </div>
             </span>
             <div>
-                <label for="all" class="d-none" id="cloneCheckAll">
-                    <input id="all" type="checkbox" @click="checkAll($event)">全选
-                </label>
-                <table class="table table-sm text-nowrap table-bordered d-none" id="headerRoll"></table>
-                <table class="table table-striped table-sm text-nowrap table-hover" id="headerParent">
-                    <tr id="header"></tr>
+                <table class="table table-bordered table-striped table-sm text-nowrap table-hover td-min-width-80" id="table">
                     <tr v-for="(package,i) in packages" @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td>
-                            <input class="checkItem" type="checkbox" :value="package.id" v-model="checkData">
+                            <input class="checkItem" type="checkbox" :value="package.id">
                         </td>
                         <td>@{{ i+1  }}</td>
                         <td>@{{package.ownerName}}</td>
@@ -60,7 +55,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script>
             @if(isset($request))
         let request={!! json_encode($request) !!};
@@ -91,7 +86,6 @@
                     {name:'{{$owner->id}}',value:'{{$owner->name}}'},
                     @endforeach
                 ],
-                checkData:[],
                 form:'',
                 sum:{!! $packages->total() !!},
                 selectTr:0
@@ -119,8 +113,6 @@
                 });
                 _this.form.init();
                 let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'ownerName',value: '货主'},
                     {name: 'logisticNumber', value: '快递单号'},
@@ -138,49 +130,19 @@
                     {name:'recipient',value: '收件人'},
                     {name:'recipientMobile',value: '收件人电话'},
                 ];
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.packages,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form_div').height())+2,
-                        offset:0.5,
-                        vue : vue,
-                    });
-                    header.init();
-                },0);
-            },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.packages.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
+                new Header({
+                    el: "table",
+                    name: "weight",
+                    column: column,
+                    data: this.packages,
+                    fixedTop:($('#form_div').height())+2,
+                }).init();
             },
             methods:{
-                checkAll(e){
-                    if (e.target.checked){
-                        this.packages.forEach((el,i)=>{
-                            if (this.checkData.indexOf(el.id) == '-1'){
-                                this.checkData.push(el.id);
-                            }
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
-                },
                 packageExport(checkAllSign){
                     let url = '{{url('package/export')}}';
                     let token='{{ csrf_token() }}';
-                    excelExport(checkAllSign,this.checkData,url,this.sum,token);
+                    excelExport(checkAllSign,checkData,url,this.sum,token);
                 },
             },
             filters:{

+ 11 - 49
resources/views/package/weightExcepted/index.blade.php

@@ -27,7 +27,7 @@
                                 <td >
                                     <label style="margin-left: 5px"> 操作选定记录:</label>
                                     <span class="dropdown">
-                                        <button class="btn btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark':'btn-outline-dark']"
+                                        <button class="btn btn-sm form-control-sm dropdown-toggle tooltipTarget"
                                                 data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
                                             导出Excel
                                         </button>
@@ -43,16 +43,11 @@
                     </form>
                 </div>
             <div class="card-body">
-                <label for="all" class="d-none" id="cloneCheckAll">
-                    <input id="all" type="checkbox" @click="checkAll($event)">全选
-                </label>
-                <table class="d-none table table-bordered text-nowrap" id="headerRoll"></table>
-                <table class="table table-striped table-sm text-nowrap" id="headerParent">
-                    <tr id="header"></tr>
+                <table class="table table-striped table-sm text-nowrap td-min-width-80" id="table">
                     <tr v-for="(weightExcepted,i) in weightExcepteds" :style="weightExcepted.status=='上传异常'||weightExcepted.status=='下发异常'?'':color"
                         @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td>
-                            <input class="checkItem" type="checkbox" :value="weightExcepted.id" v-model="checkData">
+                            <input class="checkItem" type="checkbox" :value="weightExcepted.id">
                         </td>
                         <td>@{{ i+1 }}</td>
                         <td>@{{weightExcepted.logisticNumber}}</td>
@@ -87,7 +82,7 @@
 @endsection
 
 @section('lastScript')
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
     <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
     <script>
         let vue = new Vue({
@@ -109,7 +104,6 @@
                     @endforeach
                 ],
                 filterData:{paginate:50},
-                checkData:[],
                 color:'color: red',
                 sum:{!! $weightExcepteds->total() !!},
                 selectTr:0
@@ -119,8 +113,6 @@
                $(".tooltipTarget").tooltip({'trigger':'hover'});
                $('#list').removeClass('d-none');
                let column = [
-                   {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                       dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                    {name:'index',value: '序号', neglect: true},
                    {name:'logisticNumber',value: '快递单号'},
                    {name:'carrierName',value: '物流公司'},
@@ -141,31 +133,12 @@
                    {name:'paperBoxName',value: '纸箱'},
                    {name:'status',value: '异常类型'},@endif
                ];
-               let _this = this;
-               setTimeout(function () {
-                   let header = new Header({
-                       el: "#header",
-                       column: column,
-                       data: _this.weightExcepteds,
-                       restorationColumn: 'id',
-                       vue : vue,
-                   });
-                   header.init();
-               },0);
-            },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.weightExcepteds.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
+               new Header({
+                   el: "table",
+                   name: "weightExcepted",
+                   column: column,
+                   data: this.weightExcepteds,
+               }).init();
             },
             methods:{
                 initInputs:function(){
@@ -187,21 +160,10 @@
                     var form = document.getElementById("optionSubmit");
                     form.submit();
                 },
-                checkAll(e){
-                    if (e.target.checked){
-                        this.weightExcepteds.forEach((el,i)=>{
-                            if (this.checkData.indexOf(el.id) == '-1'){
-                                this.checkData.push(el.id);
-                            }
-                        });
-                    }else {
-                        this.checkData = [];
-                    }
-                },
                 weightExport(checkAllSign){
                     let url = '{{url('package/weightExcepted/export/'.$view)}}';
                     let token='{{ csrf_token() }}';
-                    excelExport(checkAllSign,this.checkData,url,this.sum,token);
+                    excelExport(checkAllSign,checkData,url,this.sum,token);
                 }
             }
         });

+ 41 - 0
resources/views/personnel/discharge/facilitator/QRcode.blade.php

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="icon" href="{{asset('icon/faviconc.ico')}}" type="image/x-icon"/>
+    <!-- CSRF Token -->
+    <meta name="csrf-token" content="{{ csrf_token() }}">
+    <title>显示二维码 BsWAS</title>
+    <!-- Styles -->
+    <link href="{{ mix('css/app.css') }}" rel="stylesheet">
+</head>
+<body>
+<div class="container-fluid " id="page">
+    <div class="card ">
+        <div class="card-body">
+            <div class="align-content-center m-3">
+                <h3 class="text-center text-dark">卸货队@{{ facilitator.name }}二维码</h3><br>
+            </div>
+            <div class="row">
+                <div class="col text-center" style="float:left;">
+                    <img id="img" class="img-thumbnail" style="margin-top: 20px" :src="qrCodeUrl" width="35%" alt=""/>
+                    <p class="m-2 h1 text-center">@{{ facilitator.name }}</p>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="{{ mix('js/app.js') }}"></script>
+<script>
+    new Vue({
+        el: "#page",
+        data: {
+            qrCodeUrl: '{!! $qrCodeUrl !!}',
+            facilitator:{!! $facilitator !!},
+        },
+    });
+</script>
+</body>
+</html>

+ 91 - 0
resources/views/personnel/discharge/facilitator/_table.blade.php

@@ -0,0 +1,91 @@
+<table class="table table-hover card-body p-0 m-0">
+{{--<table class="table table-sm table-striped table-bordered table-hover card-body p-0 m-0">--}}
+    <thead class="thead-light">
+    <tr class="text-center">
+        <th>
+            <label>
+                <input type="checkbox" id="selectAll" @click="selectAll">
+            </label>
+        </th>
+        <th>序号</th>
+        <th>时间段</th>
+        <th>装卸队</th>
+        <th>订单数量</th>
+        <th>总金额</th>
+        <th>月账单详情</th>
+        @auth
+            <th>操作</th>
+        @endauth
+    </tr>
+    </thead>
+    <tbody>
+    <template v-if="facilitatorStatements.length>0">
+        <template  v-for="(facilitatorStatement,index) in facilitatorStatements">
+        <tr class="text-center"
+            @click="selectTr===index+1?selectTr=0:selectTr=index+1" :class="selectTr===index+1?'focusing' : ''">
+            <td>
+                <label >
+                    <input type="checkbox" v-model="checkData" :value="'months:'+facilitatorStatement['months']+';id:'+facilitatorStatement['id']">
+                </label>
+            </td>
+            <td class="align-text-bottom">@{{index+1}}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.months }}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.facilitators_name }}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.sum }}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.total_cost }}</td>
+            <td>
+                <button class="align-self-center btn btn-outline-info m-0" @click="gainStatement(facilitatorStatement,index,$event)">点击展开</button>
+            </td>
+            @auth
+            <td class="align-text-bottom">
+                <a :href="getQRCodeUrl(facilitatorStatement)" target="_blank">
+                    <button class="align-self-center btn btn-outline-primary m-0" @click="seekQrcode(facilitatorStatement)">查看</button>
+                </a>
+            </td>
+            @endauth
+        </tr>
+        <tr v-if="facilitatorStatement.showSubject" class="p-0 up" >
+            <td></td>
+            <td colspan="7" class="p-0 m-0">
+                <div class="p-0 " :id="'Statement' + index">
+                    <table class="table table-bordered m-0">
+                        <thead class="thead-light">
+                        <tr>
+                            <th>日期</th>
+                            <th>装卸队</th>
+                            <th>数量</th>
+                            <th>单位</th>
+                            <th>单价</th>
+                            <th>总金额合计</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(item,index) in facilitatorStatement.subjection">
+                            <td>@{{ item.created_at }}</td>
+                            <td>@{{ item.facilitator ? item.facilitator.name :'' }}</td>
+                            <td>@{{ item.expenditure_amount }}</td>
+                            <td>@{{ item.expenditure_unit }}</td>
+                            <td>@{{ item.expenditure_unit_price }}</td>
+                            <td>@{{ item.expenditure_total_cost }}</td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </td>
+        </tr>
+        </template>
+
+    </template>
+    <template v-else>
+        <tr>
+            <td colspan="8">
+                <div class='alert alert-info text-lg-center'>
+                    装卸队对账单数据为空
+                </div>
+            </td>
+        </tr>
+    </template>
+    </tbody>
+</table>
+<hr>
+{{ $facilitatorStatements->withQueryString()->links() }}

+ 80 - 0
resources/views/personnel/discharge/facilitator/external/_table.blade.php

@@ -0,0 +1,80 @@
+<table class="table table-hover card-body p-0 m-0">
+    <thead class="thead-light">
+    <tr class="text-center">
+        <th>
+            <label>
+                <input type="checkbox" id="selectAll" @click="selectAll">
+            </label>
+        </th>
+        <th>序号</th>
+        <th>时间段</th>
+        <th>装卸队</th>
+        <th>订单数量</th>
+        <th>总金额</th>
+        <th>月账单详情</th>
+    </tr>
+    </thead>
+    <tbody>
+    <template v-if="facilitatorStatements.length>0">
+        <template  v-for="(facilitatorStatement,index) in facilitatorStatements">
+        <tr class="text-center"
+            @click="selectTr===index+1?selectTr=0:selectTr=index+1" :class="selectTr===index+1?'focusing' : ''">
+            <td>
+                <label >
+                    <input type="checkbox" v-model="checkData" :value="'months:'+facilitatorStatement['months']+';id:'+facilitatorStatement['id']">
+                </label>
+            </td>
+            <td class="align-text-bottom">@{{index+1}}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.months }}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.facilitators_name }}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.sum }}</td>
+            <td class="align-text-bottom">@{{ facilitatorStatement.total_cost }}</td>
+            <td>
+                <button class="align-self-center btn btn-outline-info m-0" @click="gainStatement(facilitatorStatement,index,$event)">点击展开</button>
+            </td>
+        </tr>
+        <tr v-if="facilitatorStatement.showSubject" class="p-0 up" >
+            <td></td>
+            <td colspan="7" class="p-0 m-0">
+                <div class="p-0 " :id="'Statement' + index">
+                    <table class="table table-bordered m-0">
+                        <thead class="thead-light">
+                        <tr>
+                            <th>日期</th>
+                            <th>装卸队</th>
+                            <th>数量</th>
+                            <th>单位</th>
+                            <th>单价</th>
+                            <th>总金额合计</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(item,index) in facilitatorStatement.subjection">
+                            <td>@{{ item.created_at }}</td>
+                            <td>@{{ item.facilitator ? item.facilitator.name :'' }}</td>
+                            <td>@{{ item.expenditure_amount }}</td>
+                            <td>@{{ item.expenditure_unit }}</td>
+                            <td>@{{ item.expenditure_unit_price }}</td>
+                            <td>@{{ item.expenditure_total_cost }}</td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </td>
+        </tr>
+        </template>
+
+    </template>
+    <template v-else>
+        <tr>
+            <td colspan="8">
+                <div class='alert alert-info text-lg-center'>
+                    装卸队对账单数据暂无
+                </div>
+            </td>
+        </tr>
+    </template>
+    </tbody>
+</table>
+<hr>
+{{ $facilitatorStatements->withQueryString()->links() }}

+ 110 - 0
resources/views/personnel/discharge/facilitator/external/index.blade.php

@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="icon" href="{{asset('icon/faviconc.ico')}}" type="image/x-icon"/>
+    <!-- CSRF Token -->
+    <meta name="csrf-token" content="{{ csrf_token() }}">
+    <title>对账单 BsWAS</title>
+    <!-- Styles -->
+    <link href="{{ mix('css/app.css') }}" rel="stylesheet">
+</head>
+<body>
+<div class="container-fluid " id="page">
+    <div id="form_div"></div>
+    <div class="form-inline mt-1" id="btn">
+            <span class="dropdown">
+                <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
+                        :class="[checkData.length>0?'btn-dark text-light':'']"
+                        data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">导出Excel
+                </button>
+                <div class="dropdown-menu">
+                    <a class="dropdown-item" @click="Export(false)" href="javascript:">导出勾选内容</a>
+                    <a class="dropdown-item" @click="Export(true)" href="javascript:">导出所有页</a>
+                </div>
+            </span>
+        @include('personnel.discharge.facilitator.external._table')
+    </div>
+</div>
+
+<script src="{{ mix('js/app.js') }}"></script>
+<script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
+<script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
+<script>
+    new Vue({
+        el: "#page",
+        data: {
+            facilitatorStatements: {!! $facilitatorStatements->toJson() !!}['data'],
+            units: {0: 'm3', 1: '吨', 2: '托', 3: '件'},
+            facilitator:'{!! $id !!}',
+            checkData: [],
+            selectTr: 0,
+        },
+        created() {
+            let _this = this;
+            this.facilitatorStatements.forEach(function (facilitatorStatement, index, array) {
+                array[index]['expenditure_unit'] = _this.units[facilitatorStatement['expenditure_unit']];
+                array[index]['subjection'] = [];
+                array[index]['showSubject'] = false;
+            });
+        },
+        mounted() {
+            $('#list').removeClass('d-none');
+            $(".tooltipTarget").tooltip({'trigger': 'hover'});
+            let data = [[
+                {name: 'created_at_start', type: 'dateTime', tip: '创建开始日期'},
+                {name: 'created_at_end', type: 'dateTime', tip: '创建结束日期'},
+            ]];
+            this.form = new query({
+                el: '#form_div',
+                condition: data,
+            });
+            this.form.init();
+        },
+        methods: {
+            selectAll(e) {
+                if (!e.target.checked) this.checkData = [];
+                else {
+                    this.facilitatorStatements.forEach((item, i) => {
+                        let data = 'months:'+item['months']+';id:'+item['id'];
+                        if (this.checkData.indexOf(data) === -1) this.checkData.push(data);
+                    });
+                }
+            },
+            gainStatement(facilitatorStatement, index, $e) {
+                if (facilitatorStatement.showSubject) {
+                    facilitatorStatement.showSubject = false;
+                    $($e.target).html('点击展开');
+                    return;
+                }
+                $($e.target).html('加载中...');
+                let url = '{{url('apiLocal/facilitator/gainStatement')}}'
+                let data = {
+                    'created_range': facilitatorStatement['months'],
+                    'facilitator_id': facilitatorStatement['id'],
+                };
+                window.axios.post(url, data).then(res => {
+                    if (res.data.success) {
+                        this.$set(this.facilitatorStatements[index], 'subjection', res.data.data);
+                        facilitatorStatement['showSubject'] = true;
+                        $("#Statement" + index).slideToggle();
+                        $($e.target).html('点击收起');
+                        this.$forceUpdate();
+                    }
+                }).catch(err => {
+                    $($e.target).html('点击展开');
+                    window.tempTip.show(err);
+                });
+            },
+            Export(isExportAll) {
+                let url = '{{url('personnel/discharge/facilitator/external/')}}'+'/'+this.facilitator+'/export';
+                let token = '{{ csrf_token() }}';
+                excelExport(isExportAll, this.checkData, url, this.sum, token);
+            },
+        }
+    });
+</script>
+</body>
+</html>
+

+ 45 - 16
resources/views/transport/discharge/facilitator/index.blade.php → resources/views/personnel/discharge/facilitator/index.blade.php

@@ -1,12 +1,12 @@
 @extends('layouts.app')
 
-@section('title','卸货服务商')
+@section('title','装卸队')
 
 @section('content')
     <div id="nav2">
-        @component('transport.menu')@endcomponent
-        @component('transport.discharge.menu')@endcomponent
-        @component('transport.discharge.facilitator.menu')@endcomponent
+        @component('personnel.menu')@endcomponent
+        @component('personnel.discharge.menu')@endcomponent
+        @component('personnel.discharge.facilitator.menu')@endcomponent
     </div>
     <div id="list" class="d-none container-fluid">
         <div id="form_div"  style="min-width: 2250px"></div>
@@ -21,7 +21,7 @@
                     <a class="dropdown-item" @click="Export(true)" href="javascript:">导出所有页</a>
                 </div>
             </span>
-            @include('transport.discharge.facilitator._table')
+            @include('personnel.discharge.facilitator._table')
         </div>
     </div>
 @endsection
@@ -56,11 +56,13 @@
                 let _this = this;
                 this.facilitatorStatements.forEach(function(facilitatorStatement,index,array){
                     array[index]['expenditure_unit'] = _this.units[facilitatorStatement['expenditure_unit']];
+                    array[index]['subjection'] = [];
+                    array[index]['showSubject'] = false;
                 });
-                this.facilitators.forEach(function(provider,index,array){
+                this.facilitators.forEach(function(provider,index,array) {
                     array[index] = {
-                        name:provider.id,
-                        value:provider.name,
+                        name: provider.id,
+                        value: provider.name,
                     }
                 });
             },
@@ -70,8 +72,8 @@
                 $(".tooltipTarget").tooltip({'trigger': 'hover'});
                 let data = [[
                     {
-                        name: 'facilitator_id', type: 'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的服务商'],
-                        placeholder: ['服务商', '服务商'],
+                        name: 'facilitator_id', type: 'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的装卸队'],
+                        placeholder: ['装卸队', '装卸队'],
                         data: _this.facilitators
                     },
                     {name: 'created_at_start', type: 'dateTime', tip: '创建开始日期'},
@@ -80,22 +82,49 @@
                 this.form = new query({
                     el: '#form_div',
                     condition: data,
-                    appendDom : "btn",
-                    paginations:[ 50, 100, 200, 500,1000,20],
-                })
+                });
                 this.form.init();
             },
             methods:{
-                checkAll(e) {
+                selectAll(e) {
                     if (!e.target.checked) this.checkData = [];
                     else {
                         this.facilitatorStatements.forEach((item, i) => {
-                            if (this.checkData.indexOf(item['id']) === -1) this.checkData.push(item['id']);
+                            let data = 'months:'+item['months']+';id:'+item['id'];
+                            if (this.checkData.indexOf(data) === -1) this.checkData.push(data);
                         });
                     }
                 },
+                gainStatement(facilitatorStatement,index,$e){
+                    if(facilitatorStatement.showSubject){
+                        facilitatorStatement.showSubject=false;
+                        $($e.target).html('点击展开');
+                        return;
+                    }
+                    $($e.target).html('加载中...');
+                    let url = '{{url('apiLocal/facilitator/gainStatement')}}'
+                    let data = {
+                        'created_range':facilitatorStatement['months'],
+                        'facilitator_id':facilitatorStatement['id'],
+                    };
+                    window.axios.post(url,data).then(res=>{
+                        if(res.data.success){
+                            this.$set(this.facilitatorStatements[index],'subjection',res.data.data);
+                            facilitatorStatement['showSubject'] = true;selectAll
+                            $("#Statement"+index).slideToggle();
+                            $($e.target).html('点击收起');
+                            this.$forceUpdate();
+                        }
+                    }).catch(err=>{
+                        $($e.target).html('点击展开');
+                        window.tempTip.show(err);
+                    });
+                },
+                getQRCodeUrl(facilitatorStatement){
+                    return '{{url('/personnel/discharge/facilitator/qrCode')}}'+'/?facilitator_id='+facilitatorStatement['id'];
+                },
                 Export(isExportAll) {
-                    let url = '{{url('transport/discharge/facilitator/export')}}';
+                    let url = '{{url('personnel/discharge/facilitator/export')}}';
                     let token = '{{ csrf_token() }}';
                     excelExport(isExportAll, this.checkData, url, this.sum, token);
                 },

+ 3 - 3
resources/views/transport/discharge/facilitator/menu.blade.php → resources/views/personnel/discharge/facilitator/menu.blade.php

@@ -2,12 +2,12 @@
 
     <div class="card">
         <ul class="nav nav-pills">
-            @can('服务商-查询')
+            @can('卸货队-查询')
             <li class="nav-item">
-                <a target="transport/discharge/provider/index" class="nav-link" href="{{url('transport/discharge/facilitator/index')}}" :class="{active:isActive('index',4)}">对账单</a>
+                <a target="personnel/discharge/provider/index" class="nav-link" href="{{url('personnel/discharge/facilitator/index')}}" :class="{active:isActive('index',4)}">对账单</a>
             </li>
             @endcan
-            @can('服务商')
+            @can('装卸队')
             <li class="nav-item">
                 <a target="maintenance/facilitator" class="nav-link text-dark" href="{{url('maintenance/facilitator')}}" :class="{active:isActive('facilitator',2)}">基础设置</a>
             </li>

+ 6 - 6
resources/views/transport/discharge/menu.blade.php → resources/views/personnel/discharge/menu.blade.php

@@ -1,19 +1,19 @@
 <div class="container-fluid nav3" >
     <div class="card">
         <ul class="nav nav-pills">
-            @can('运输管理-卸货')
+            @can('人事管理-卸货')
             <li class="nav-item">
-                <a target="transport/discharge/task" class="nav-link" href="{{url('transport/discharge/task/index')}}" :class="{active:isActive('task',3)}">卸货任务</a>
+                <a target="transport/discharge/task" class="nav-link" href="{{url('personnel/discharge/task/index')}}" :class="{active:isActive('task',3)}">卸货任务</a>
             </li>
             @endcan
-            @can('运输管理-卸货-结算报表-查询')
+            @can('人事管理-卸货-结算报表-查询')
             <li class="nav-item">
-                <a target="transport/discharge/statement" class="nav-link" href="{{url('transport/discharge/statement/index')}}" :class="{active:isActive('statement',3)}">计算报表</a>
+                <a target="transport/discharge/statement" class="nav-link" href="{{url('personnel/discharge/statement/index')}}" :class="{active:isActive('statement',3)}">结算报表</a>
             </li>
             @endcan
-            @can('服务商-对账单-查询')
+            @can('装卸队-对账单-查询')
             <li class="nav-item">
-                <a target="transport/discharge/provider" class="nav-link" href="{{url('transport/discharge/facilitator/index')}}" :class="{active:isActive('facilitator',3)}">服务商</a>
+                <a target="transport/discharge/provider" class="nav-link" href="{{url('personnel/discharge/facilitator/index')}}" :class="{active:isActive('facilitator',3)}">卸货队账单</a>
             </li>
             @endcan
         </ul>

+ 2 - 1
resources/views/transport/discharge/statement/_table.blade.php → resources/views/personnel/discharge/statement/_table.blade.php

@@ -16,7 +16,7 @@
         <th class="td-cool">单位</th>
         <th class="td-cool">收入单价</th>
         <th class="td-cool">收入合计</th>
-        <th>服务商</th>
+        <th>装卸队</th>
         <th>数量</th>
         <th>单位</th>
         <th>支出单价</th>
@@ -56,4 +56,5 @@
         </tr>
     </template>
 </table>
+{{ $dischargeStatements->withQueryString()->links() }}
 <hr>

+ 6 - 8
resources/views/transport/discharge/statement/index.blade.php → resources/views/personnel/discharge/statement/index.blade.php

@@ -4,8 +4,8 @@
 
 @section('content')
     <div id="nav2">
-        @component('transport.menu')@endcomponent
-        @component('transport.discharge.menu')@endcomponent
+        @component('personnel.menu')@endcomponent
+        @component('personnel.discharge.menu')@endcomponent
     </div>
     <div id="list" class="d-none container-fluid">
         <div id="form_div" style="min-width: 2250px"></div>
@@ -21,7 +21,7 @@
                     <a class="dropdown-item" @click="StatementsExport(true)" href="javascript:">导出所有页</a>
                 </div>
             </span>
-            @include('transport.discharge.statement._table')
+            @include('personnel.discharge.statement._table')
         </div>
     </div>
 @endsection
@@ -75,8 +75,8 @@
                     {name: 'status', type: 'select', tip: '状态', data: status, placeholder: '状态'},
                 ], [
                     {
-                        name: 'facilitator_id', type: 'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的服务商'],
-                        placeholder: ['服务商', '定位或多选服务商'],
+                        name: 'facilitator_id', type: 'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的装卸队'],
+                        placeholder: ['装卸队', '定位或多选装卸队'],
                         data: _this.facilitators
                     },
                     {name: 'income_remark', type: 'input', tip: '备注', data: _this.status, placeholder: '支出备注'},
@@ -85,8 +85,6 @@
                 this.form = new query({
                     el: '#form_div',
                     condition: data,
-                    appendDom: "btn",
-                    paginations: [50, 100, 200, 500, 1000, 20],
                 })
                 this.form.init();
             },
@@ -100,7 +98,7 @@
                     }
                 },
                 StatementsExport(isExportAll) {
-                    let url = '{{url('transport/discharge/statement/export')}}';
+                    let url = '{{url('personnel/discharge/statement/export')}}';
                     let token = '{{ csrf_token() }}';
                     excelExport(isExportAll, this.checkData, url, this.sum, token);
                 }

+ 2 - 2
resources/views/transport/discharge/statement/menu.blade.php → resources/views/personnel/discharge/statement/menu.blade.php

@@ -1,9 +1,9 @@
 <div class="container-fluid">
     <div class="card">
         <ul class="nav nav-pills">
-            @can('服务商-对账单-查询')
+            @can('装卸队-对账单-查询')
             <li class="nav-item">
-                <a target="transport/discharge/statement/index" class="nav-link" href="{{url('transport/discharge/statement/index')}}" :class="{active:isActive('recycle',2)}">查询</a>
+                <a target="personnel/discharge/statement/index" class="nav-link" href="{{url('personnel/discharge/statement/index')}}" :class="{active:isActive('recycle',2)}">查询</a>
             </li>
             @endcan
         </ul>

+ 65 - 29
resources/views/transport/discharge/task/_createTask.blade.php → resources/views/personnel/discharge/task/_createTask.blade.php

@@ -6,7 +6,8 @@
                     <span v-show="isUpdate">卸货任务修改</span>
                     <span v-show="!isUpdate">卸货任务添加</span>
                 </h5>
-                <button type="button" class="close" data-dismiss="modal" @click="addTask={},isUpdate=false,taskError={}">
+                <button type="button" class="close" data-dismiss="modal"
+                        @click="addTask={},isUpdate=false,taskError={}">
                     <span>&times;</span>
                 </button>
             </div>
@@ -14,87 +15,119 @@
             <div class="modal-body">
                 <form class="form">
                     <div class="form-group row">
-                        <label for="addTask-owner-id" class="col-sm-3 col-form-label text-right">货主</label>
+                        <label for="addTask-owner-id" class="col-sm-3 col-form-label text-right text-primary">货主 *</label>
                         <div class="col-sm-5">
-                            <select id="addTask-owner-id" class="form-control" v-model="addTask.owner_id" :class="taskError.owner_id? 'is-invalid' :''">
-                                <option v-for="(owner,index) in ownerFilter" :value="owner.name" :key="owner+index">@{{ owner.value }}</option>
+                            <select id="addTask-owner-id" class="form-control"
+                                    v-model="addTask.owner_id" :class="taskError.owner_id? 'is-invalid' :''" @focus="taskError.owner_id = null">
+                                <option v-for="(owner,index) in ownerFilter" :value="owner.name" :key="owner+index">@{{
+                                    owner.value }}
+                                </option>
                             </select>
-                            <div class="invalid-feedback" >
+                            <div class="invalid-feedback">
                                 @{{ taskError['owner_id'] ? taskError['owner_id'][0] : '' }}
                             </div>
                         </div>
                         <div class="col-3 ">
-                            <input class="form-control " placeholder="输入货主进行刷选" @change="filterOwner($event)">
+                            <input class="form-control" id="owner-name-filter" placeholder="输入货主进行刷选" @input="filterOwner($event)">
                         </div>
                     </div>
 
                     <div class="form-group row">
-                        <label for="addTask-created-at" class="col-sm-3 col-form-label text-right">预约日期</label>
+                        <label for="addTask-created-at" class="col-sm-3 col-form-label text-right text-primary">预约日期 *</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="date" id="addTask-created-at" class="form-control col-9" name="size" v-model="addTask.income_at" >
+                            <input type="datetime-local" id="addTask-created-at" class="form-control col-9"
+                                   v-model="addTask.income_at" @focus="taskError.income_at= null">
                         </div>
                     </div>
 
                     <div class="form-group row">
-                        <label for="addTask-type" class="col-sm-3 col-form-label text-right" >作业名称</label>
+                        <label for="addTask-type" class="col-sm-3 col-form-label text-right text-primary text-primary">作业名称 *</label>
                         <div class="col-sm-9 form-inline">
-                            <select id="addTask-type" class="form-control col-4" v-model="addTask.type" :class="taskError.type? 'is-invalid' :''">
+                            <select id="addTask-type" class="form-control col-4" v-model="addTask.type"
+                                    :class="taskError.type? 'is-invalid' :''"
+                                    @focus="taskError.type= null">
                                 <option v-for="(type,index) in taskTypes" :value="type.name" :key="type+index">@{{
                                     type.value }}
                                 </option>
                             </select>
-                            <div class="invalid-feedback" >
+                            <div class="invalid-feedback">
                                 @{{ taskError['type'] ? taskError['type'][0] : '' }}
                             </div>
                         </div>
                     </div>
 
                     <div class="form-group row">
-                        <label for="addTask-numbers" class="col-sm-3 col-form-label text-right">入库单</label>
-                        <div class="col-sm-9 form-inline" >
-                            <input type="text" id="addTask-numbers" class="form-control col-9" name="size" v-model="addTask.numbers" :class="taskError.numbers? 'is-invalid' :''">
-                            <div class="invalid-feedback" >
+                        <label for="addTask-type" class="col-sm-3 col-form-label text-right text-primary">仓库 *</label>
+                        <div class="col-sm-9 form-inline">
+                            <select id="addTask-type" class="form-control col-4" v-model="addTask.warehouse_id"
+                                    :class="taskError.warehouse_id? 'is-invalid' :''"
+                                    @focus="taskError.warehouse_id = null">
+                                <option v-for="(type,index) in warehouses" :value="type.id" :key="type+index">@{{ type.name }}
+                                </option>
+                            </select>
+                            <div class="invalid-feedback">
+                                @{{ taskError['warehouse_id'] ? taskError['warehouse_id'][0] : '' }}
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group row">
+                        <label for="addTask-numbers" class="col-sm-3 col-form-label text-right text-primary">入库单 *</label>
+                        <div class="col-sm-9 form-inline">
+                            <input type="text" id="addTask-numbers" class="form-control col-9"
+                                   v-model="addTask.numbers" :class="taskError.numbers? 'is-invalid' :''"
+                                   @focus="taskError.numbers = null">
+                            <div class="invalid-feedback">
                                 @{{ taskError['numbers'] ? taskError['numbers'][0] : '' }}
                             </div>
                         </div>
                     </div>
 
                     <div class="form-group row">
-                        <label for="addTask-amount" class="col-sm-3 col-form-label text-right">数量</label>
+                        <label for="addTask-amount" class="col-sm-3 col-form-label text-right text-primary">数量 *</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="number" id="addTask-amount" class="form-control col-9" name="size" v-model="addTask.income_amount" :class="taskError.income_amount? 'is-invalid' :''">
-                            <div class="invalid-feedback" >
+                            <input type="number" id="addTask-amount" class="form-control col-9"
+                                   v-model="addTask.income_amount" :class="taskError.income_amount? 'is-invalid' :''"
+                                   @focus="taskError.income_amount = null">
+                            <div class="invalid-feedback">
                                 @{{ taskError['income_amount'] ? taskError['income_amount'][0] : '' }}
                             </div>
                         </div>
                     </div>
 
                     <div class="form-group row">
-                        <label for="addTask-amount" class="col-sm-3 col-form-label text-right">单位</label>
+                        <label for="addTask-amount" class="col-sm-3 col-form-label text-right text-primary">单位 *</label>
                         <div class="col-sm-9 form-inline">
-                            <select id="addTask-type" class="form-control col-4" v-model="addTask.income_unit" :class="taskError.income_unit? 'is-invalid' :''">
-                                <option v-for="(unit,index) in units" :value="unit.name" :key="unit+index">@{{ unit.value }}</option>
+                            <select id="addTask-type" class="form-control col-4" v-model="addTask.income_unit"
+                                    :class="taskError.income_unit? 'is-invalid' :''"
+                                    @focus="taskError.income_unit = null">
+                                <option v-for="(unit,index) in units" :value="unit.name" :key="unit+index">@{{
+                                    unit.value }}
+                                </option>
                             </select>
-                            <div class="invalid-feedback" >
+                            <div class="invalid-feedback">
                                 @{{ taskError['income_unit'] ? taskError['income_unit'][0] : '' }}
                             </div>
                         </div>
                     </div>
 
                     <div class="form-group row">
-                        <label for="addTask-income-unit-price" class="col-sm-3 col-form-label text-right">单价</label>
+                        <label for="addTask-income-unit-price" class="col-sm-3 col-form-label text-right text-primary">单价 *</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="number" id="addTask-income-unit-price" class="form-control col-9" v-model="addTask.income_unit_price" :class="taskError.income_unit_price? 'is-invalid' :''">
-                            <div class="invalid-feedback" >
+                            <input type="number" id="addTask-income-unit-price" class="form-control col-9"
+                                   v-model="addTask.income_unit_price" :class="taskError.income_unit_price? 'is-invalid' :''"
+                                   @focus="taskError.income_unit_price = null">
+                            <div class="invalid-feedback">
                                 @{{ taskError['income_unit_price'] ? taskError['income_unit_price'][0] : '' }}
                             </div>
                         </div>
                     </div>
 
                     <div class="form-group row" v-show="isUpdate">
-                        <label for="addTask-income-total-cost" class="col-sm-3 col-form-label text-right">总价</label>
+                        <label for="addTask-income-total-cost" class="col-sm-3 col-form-label text-right text-primary">总价 *</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="number" id="addTask-income-total-cost" class="form-control col-9" v-model="addTask.income_total_cost">
+                            <input type="number" id="addTask-income-total-cost" class="form-control col-9"
+                                   v-model="addTask.income_total_cost">
                         </div>
                     </div>
 
@@ -109,8 +142,11 @@
             </div>
 
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal" @click="addTask={},isUpdate=false,taskError={}">关闭</button>
-                <button type="button" class="btn btn-primary" v-show="isUpdate" @click="updateCurrentTask(addTask,selectIndex)">提交
+                <button type="button" class="btn btn-secondary" data-dismiss="modal"
+                        @click="addTask={},isUpdate=false,taskError={}">关闭
+                </button>
+                <button type="button" class="btn btn-primary" v-show="isUpdate"
+                        @click="updateCurrentTask(addTask,selectIndex)">提交
                 </button>
                 <button type="button" class="btn btn-primary" v-show="!isUpdate" @click="createTask">创建</button>
             </div>

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