Ver Fonte

Merge branch 'master' into zzd

# Conflicts:
#	resources/views/order/index/delivering.blade.php
zzd há 5 anos atrás
pai
commit
b8f14ab714
100 ficheiros alterados com 4554 adições e 1286 exclusões
  1. 3 0
      .gitignore
  2. 55 0
      LogExpireDelete.php
  3. 52 0
      app/Console/Commands/LogExpireDelete.php
  4. 4 4
      app/Console/Kernel.php
  5. 15 0
      app/CustomField.php
  6. 37 0
      app/Events/TeamAuditEvent.php
  7. 42 0
      app/Exports/DefaultExport.php
  8. 30 15
      app/Exports/RejectedExport.php
  9. 4 2
      app/Http/Controllers/Auth/LoginController.php
  10. 1 1
      app/Http/Controllers/CommodityController.php
  11. 90 0
      app/Http/Controllers/CustomFieldController.php
  12. 5 1
      app/Http/Controllers/HomeController.php
  13. 118 0
      app/Http/Controllers/LaborCompanyController.php
  14. 145 0
      app/Http/Controllers/LaborReportController.php
  15. 1 0
      app/Http/Controllers/MeasureMonitorController.php
  16. 18 3
      app/Http/Controllers/OwnerController.php
  17. 39 9
      app/Http/Controllers/PersonnelController.php
  18. 107 0
      app/Http/Controllers/QRCodeController.php
  19. 59 2
      app/Http/Controllers/RejectedController.php
  20. 104 9
      app/Http/Controllers/TestController.php
  21. 122 57
      app/Http/Controllers/UserDutyCheckController.php
  22. 11 8
      app/Http/Controllers/UserLaborController.php
  23. 17 4
      app/Http/Controllers/UserWorkgroupController.php
  24. 58 20
      app/Http/Controllers/WarehouseController.php
  25. 1 1
      app/Http/Controllers/api/thirdPart/flux/WaybillController.php
  26. 14 0
      app/LaborCompany.php
  27. 111 0
      app/LaborReport.php
  28. 2 0
      app/Owner.php
  29. 5 0
      app/Providers/AppServiceProvider.php
  30. 10 5
      app/Providers/AuthServiceProvider.php
  31. 143 0
      app/RejectedAnalyzeOwner.php
  32. 1 1
      app/RejectedBill.php
  33. 3 3
      app/UserDetail.php
  34. 9 1
      app/UserDutyCheck.php
  35. 4 1
      app/UserLabor.php
  36. 5 1
      app/UserWorkgroup.php
  37. 4 0
      app/Warehouse.php
  38. 10 12
      bootstrap/cache/services.php
  39. 282 139
      composer.lock
  40. 0 1
      config/app.php
  41. 1 1
      config/hr.php
  42. 2 0
      config/logging.php
  43. 1 1
      config/users.php
  44. 12 0
      database/factories/CustomFieldFactory.php
  45. 1 1
      database/migrations/2019_11_22_094253_create_cities_table.php
  46. 1 1
      database/migrations/2020_03_09_171432_create_warehouses_table.php
  47. 1 1
      database/migrations/2020_03_25_164322_create_user_duty_checks_table.php
  48. 44 0
      database/migrations/2020_05_22_114410_create_labor_reports_table.php
  49. 33 0
      database/migrations/2020_05_22_172739_create_labor_companies_table.php
  50. 35 0
      database/migrations/2020_05_22_173230_change_user_labors_table.php
  51. 49 0
      database/migrations/2020_05_25_091228_add_labor_company_authority.php
  52. 33 0
      database/migrations/2020_05_25_152252_change_user_workgroup.php
  53. 32 0
      database/migrations/2020_06_02_130804_change_user_duty_check.php
  54. 37 0
      database/migrations/2020_06_08_132835_change_user_detail.php
  55. 35 0
      database/migrations/2020_06_11_112028_change_rejected_bills_table.php
  56. 34 0
      database/migrations/2020_06_12_135349_change_rejected_bills_add_custom_fields.php
  57. 43 0
      database/migrations/2020_06_12_135840_create_custom_fields_table.php
  58. 32 0
      database/migrations/2020_06_17_162321_change_onwer_add_deleted_at.php
  59. 16 0
      database/seeds/CustomFieldSeeder.php
  60. 3 0
      laravel-echo-server.lock
  61. 610 426
      package-lock.json
  62. 14 13
      package.json
  63. BIN
      public/images/QRCodeIMG/1.png
  64. BIN
      public/images/QRCodeIMG/10.png
  65. BIN
      public/images/QRCodeIMG/2.png
  66. BIN
      public/images/QRCodeIMG/3.png
  67. BIN
      public/images/QRCodeIMG/4.png
  68. BIN
      public/images/QRCodeIMG/5.png
  69. 342 216
      public/js/app.js
  70. 3 0
      resources/js/singles/rejectedIndex.js
  71. 396 0
      resources/js/singles/searchAnalyze.js
  72. 1 0
      resources/lang/cn/validation.php
  73. 1 1
      resources/views/inventory/statement/changeInventory.blade.php
  74. 1 1
      resources/views/layouts/app.blade.php
  75. 15 15
      resources/views/layouts/menu.blade.php
  76. 38 0
      resources/views/maintenance/laborCompany/create.blade.php
  77. 44 0
      resources/views/maintenance/laborCompany/edit.blade.php
  78. 83 0
      resources/views/maintenance/laborCompany/index.blade.php
  79. 16 0
      resources/views/maintenance/laborCompany/menu.blade.php
  80. 8 0
      resources/views/maintenance/menu.blade.php
  81. 6 6
      resources/views/maintenance/owner/index.blade.php
  82. 10 7
      resources/views/maintenance/owner/menu.blade.php
  83. 74 0
      resources/views/maintenance/owner/recycle.blade.php
  84. 29 19
      resources/views/maintenance/userLabor/edit.blade.php
  85. 1 1
      resources/views/maintenance/userLabor/show.blade.php
  86. 29 1
      resources/views/maintenance/userWorkgroup/create.blade.php
  87. 25 2
      resources/views/maintenance/userWorkgroup/edit.blade.php
  88. 3 1
      resources/views/maintenance/userWorkgroup/index.blade.php
  89. 50 0
      resources/views/maintenance/warehouse/create.blade.php
  90. 56 0
      resources/views/maintenance/warehouse/edit.blade.php
  91. 85 0
      resources/views/maintenance/warehouse/index.blade.php
  92. 16 0
      resources/views/maintenance/warehouse/menu.blade.php
  93. 199 148
      resources/views/order/index/delivering.blade.php
  94. 66 34
      resources/views/personnel/checking-in/QRcode.blade.php
  95. 2 2
      resources/views/personnel/checking-in/clock.blade.php
  96. 90 51
      resources/views/personnel/checking-in/clockAudit.blade.php
  97. 33 7
      resources/views/personnel/checking-in/createUserDetail.blade.php
  98. 9 9
      resources/views/personnel/checking-in/getQRcode.blade.php
  99. 3 3
      resources/views/personnel/checking-in/menuChecking-in.blade.php
  100. 10 18
      resources/views/personnel/checking-in/missionAudit.blade.php

+ 3 - 0
.gitignore

@@ -4,6 +4,8 @@
 /public/js
 /public/css
 /public/images
+/public/images/QRCodeIMG/*
+/resources/images/QRCodeIMG/*
 /public/mix-manifest.json
 /storage/*.key
 /vendor
@@ -19,3 +21,4 @@ yarn-error.log
 /vendor/
 /.idea/
 /.env.example
+/.gitignore

+ 55 - 0
LogExpireDelete.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Carbon\Carbon;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Date;
+use Illuminate\Support\Facades\DB;
+
+class LogExpireDelete extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'LogExpireDelete';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'LogExpireDelete';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $this->deleteLog();
+    }
+
+    public function deleteLog(){
+        //前一天
+//        $date=Carbon::now()->subDays(150)->format('Y-m-d');
+//        DB::table('logs')->where('created_at','like',$date.'%')->delete();
+        DB::table('logs')->insert([
+            ['operation' => 'App', 'type' => 'test','created_at'=>new Date()],
+        ]);
+
+    }
+}

+ 52 - 0
app/Console/Commands/LogExpireDelete.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Carbon\Carbon;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Date;
+use Illuminate\Support\Facades\DB;
+
+class LogExpireDelete extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'LogExpireDelete';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'LogExpireDelete';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $this->deleteLog();
+    }
+
+    public function deleteLog(){
+        //前150天
+        $expire_duration=config('logging.expire_duration');
+        $date=Carbon::now()->subDays($expire_duration)->format('Y-m-d');
+        DB::table('logs')->where('created_at','like',$date.'%')->delete();
+    }
+}

+ 4 - 4
app/Console/Kernel.php

@@ -2,8 +2,10 @@
 
 namespace App\Console;
 
+use Carbon\Carbon;
 use Illuminate\Console\Scheduling\Schedule;
 use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+use Illuminate\Support\Facades\DB;
 
 class Kernel extends ConsoleKernel
 {
@@ -13,7 +15,7 @@ class Kernel extends ConsoleKernel
      * @var array
      */
     protected $commands = [
-        //
+        \App\Console\Commands\LogExpireDelete::class,
     ];
 
     /**
@@ -24,8 +26,7 @@ class Kernel extends ConsoleKernel
      */
     protected function schedule(Schedule $schedule)
     {
-        // $schedule->command('inspire')
-        //          ->hourly();
+        $schedule->command('LogExpireDelete')->dailyAt('00:01');
     }
 
     /**
@@ -36,7 +37,6 @@ class Kernel extends ConsoleKernel
     protected function commands()
     {
         $this->load(__DIR__.'/Commands');
-
         require base_path('routes/console.php');
     }
 }

+ 15 - 0
app/CustomField.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class CustomField extends Model
+{
+    protected $fillable=['table',
+        'field',
+        'present_name',
+        'authority_name',
+        'condition_field',
+        'condition_value'];
+}

+ 37 - 0
app/Events/TeamAuditEvent.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Events;
+
+use App\UserDutyCheck;
+use Illuminate\Broadcasting\Channel;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+use Illuminate\Queue\SerializesModels;
+
+
+class TeamAuditEvent implements ShouldBroadcast
+{
+    use  SerializesModels;
+
+    public $userDutyCheck;
+
+    /**
+     * Create a new event instance.
+     *
+     * @return void
+     */
+    public function __construct(UserDutyCheck $userDutyCheck)
+    {
+        $this->userDutyCheck=$userDutyCheck;
+    }
+
+    /**
+     * Get the channels the event should broadcast on.
+     *
+     * @return \Illuminate\Broadcasting\Channel|array
+     */
+    public function broadcastOn()
+    {
+        return new Channel('userDutyCheck');
+    }
+
+}

+ 42 - 0
app/Exports/DefaultExport.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Exports;
+
+use Maatwebsite\Excel\Concerns\FromCollection;
+
+class DefaultExport implements FromCollection
+{
+    private $head;
+    private $body;
+
+    public function __construct($head, $body)
+    {
+        $this->head = $head;
+        $this->body = $body;
+    }
+
+    /**
+     * @return \Illuminate\Support\Collection
+     */
+    public function collection()
+    {
+        $head = $this->head;
+        $body = $this->body;
+
+        // 表头设置
+        foreach ($head[0] as $key=>$value) {
+            $head_arr[] = $key;
+        }
+        // 表数据
+        foreach ($body as $key => &$value) {
+            $js = [];
+            for ($i = 0; $i < count($head_arr); $i++) {
+                $js = array_merge($js,[ $head_arr[$i] => $value[ $head_arr[$i] ] ]);
+
+            }
+            array_push($head, $js);
+            unset($val);
+        }
+        return collect($head);
+    }
+}

+ 30 - 15
app/Exports/RejectedExport.php

@@ -6,6 +6,7 @@ use App\RejectedBill;
 use App\RejectedBillItem;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Gate;
 use Maatwebsite\Excel\Concerns\FromCollection;
 use Maatwebsite\Excel\Concerns\ShouldAutoSize;
 use Maatwebsite\Excel\Concerns\WithColumnFormatting;
@@ -43,41 +44,55 @@ class RejectedExport extends \PhpOffice\PhpSpreadsheet\Cell\StringValueBinder im
                 $query->where('is_finished',false);
             }
         });
-        $rejectedItems->get();
+        $rejectedItems=$rejectedItems->get();
         $rejecteds = new Collection();
-        $this->prependFields($rejecteds);
-        $rejectedItems->each(function(RejectedBillItem $item)use($rejecteds){
-            $this->injectRecord($rejecteds,$item->rejectedBill,$item);
+        if($rejectedItems->isEmpty())return $rejecteds;
+        $id_owner = $rejectedItems->first()->rejectedBill['id_owner'];
+        $this->prependFields($rejecteds,$id_owner);
+        $rejectedItems->each(function(RejectedBillItem $item)use($rejecteds,$id_owner){
+            $this->injectRecord($rejecteds,$item->rejectedBill,$item,$id_owner);
         });
         return $rejecteds;
     }
     private function getByRejectedBills(){
         $rejecteds = new Collection();
-        $this->prependFields($rejecteds);
-        $this->rejectedBills->each(function(RejectedBill $rejectedBill)use($rejecteds){
-            $rejectedBill->items()->each(function (RejectedBillItem $item)use($rejecteds,$rejectedBill){
-                $this->injectRecord($rejecteds,$rejectedBill,$item);
+        $rejectedBills=$this->rejectedBills->get();
+        if($rejectedBills->isEmpty())return $rejecteds;
+        $id_owner = $rejectedBills->first()['id_owner'];
+        $this->prependFields($rejecteds,$id_owner);
+        $rejectedBills->each(function(RejectedBill $rejectedBill)use($rejecteds,$id_owner){
+            $rejectedBill->items()->each(function (RejectedBillItem $item)use($rejecteds,$rejectedBill,$id_owner){
+                $this->injectRecord($rejecteds,$rejectedBill,$item,$id_owner);
             });
         });
         return $rejecteds;
     }
-    private function prependFields($collection){
-        $collection->prepend(['日期','审核号','客户名称','订单号','姓名',
+    private function prependFields($collection,$id_owner){
+        $fieldNames=['日期','审核号','客户名称','订单号','姓名',
             '手机','原单单号','退回单号','退回公司','到付费用',
-            '是否入库','商品条码','商品名称','数量','是否正品',
+            '是否入库','商品条码','商品名称',];
+        if($id_owner==66){
+            $fieldNames=array_merge($fieldNames,['寄件方省','重量',]);
+        }
+        $fieldNames=array_merge($fieldNames,['数量','是否正品',
             '批次号','生产日期','效期','备注','退单备注','录入人']);
+        $collection->prepend($fieldNames);
         return $collection;
     }
-    private function injectRecord($collection,$bill,$item){
-        $collection->push([
-            $item['created_at'],
+    private function injectRecord($collection,$bill,$item,$id_owner){
+        $fieldValues=[$item['created_at'],
             $bill['checked_numbers'],$bill['owner_name'],
             $bill['order_number'],$bill['sender'],
             $bill['mobile_sender'],$bill['logistic_number'],
             $bill['logistic_number_return'],$bill['logistic_name'],
             $bill['fee_collected'],$bill['is_loaded_str'],
-            $item['barcode_goods'],$item['name_goods'],$item['amount'],$item['quality_label'],
+            $item['barcode_goods'],$item['name_goods'],];
+        if($id_owner==66){
+            $fieldValues=array_merge($fieldValues,[$bill['common_01'],$bill['common_02']]);
+        }
+        $fieldValues=array_merge($fieldValues,[$item['amount'],$item['quality_label'],
             $item['batch_number'],$item['made_at'],$item['validity_at'],$item['remark'],$bill['remark'],$bill['operator_name']]);
+        $collection->push($fieldValues);
         return $collection;
     }
 

+ 4 - 2
app/Http/Controllers/Auth/LoginController.php

@@ -68,12 +68,14 @@ class LoginController extends Controller
         }
 
         if ($this->attemptLogin($request)) {
-            $this->log(__METHOD__,__FUNCTION__,'',Auth::user()['id']);
+            if(env('DB_USERNAME')!='developer')
+                $this->log(__METHOD__,__FUNCTION__,'',Auth::user()['id']);
             return $this->sendLoginResponse($request);
         }
 
         $this->incrementLoginAttempts($request);
-        $this->log(__METHOD__,__FUNCTION__,'',Auth::user()['id']);
+        if(env('DB_USERNAME')!='developer')
+            $this->log(__METHOD__,__FUNCTION__,'',Auth::user()['id']);
         return $this->sendFailedLoginResponse($request);
     }
 }

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

@@ -59,7 +59,7 @@ class CommodityController extends Controller
     {
         return Validator::make($data, [
             'name' => ['required', 'string', 'max:50'],
-            'barcode' => ['required', 'string', 'max:50', 'unique:commodities'],
+//            'barcode' => ['required', 'string', 'max:50', 'unique:commodities'],
         ]);
     }
     protected function validatorUpdate(array $data)

+ 90 - 0
app/Http/Controllers/CustomFieldController.php

@@ -0,0 +1,90 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\CustomField;
+use Illuminate\Http\Request;
+
+class CustomFieldController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+    public function indexAtRejectedBill()
+    {
+        $customFields=CustomField::where('table','rejected_bills')->get();
+        return view('rejected.customField.index',compact('customFields'));
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\CustomField  $customField
+     * @return \Illuminate\Http\Response
+     */
+    public function show(CustomField $customField)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\CustomField  $customField
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(CustomField $customField)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\CustomField  $customField
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, CustomField $customField)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\CustomField  $customField
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(CustomField $customField)
+    {
+        //
+    }
+}

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

@@ -28,6 +28,10 @@ class HomeController extends Controller
             if(!Gate::allows('运输管理-查询')){ return view('home');}
             return redirect(url('waybill'));
         }
-        return redirect(url('rejected'));
+        return redirect(url('rejected/index/general'));
+    }
+    public function home()
+    {
+        return view('home');
     }
 }

+ 118 - 0
app/Http/Controllers/LaborCompanyController.php

@@ -0,0 +1,118 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\LaborCompany;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Validator;
+
+class LaborCompanyController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return Response
+     */
+    public function index()
+    {
+        if(!Gate::allows('劳务所-查询')){ return redirect(url('/'));  }
+        $laborCompanys=LaborCompany::orderBy('id','desc')->paginate(35);
+        return view('maintenance.laborCompany.index',['laborCompanys'=>$laborCompanys]);
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return Response
+     */
+    public function create()
+    {
+        if(!Gate::allows('劳务所-录入')){ return redirect(url('/'));  }
+        return view('maintenance.laborCompany.create');
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function store(Request $request)
+    {
+        if(!Gate::allows('劳务所-录入')){ return redirect(url('/'));  }
+        $this->validatorCreate($request->all())->validate();
+        $laborCompany=new LaborCompany($request->all());
+        $laborCompany->save();
+
+        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return redirect('maintenance/laborCompany/create')->with('successTip',"成功录入劳务所“{$request->input('name')}”");
+    }
+    protected function validatorCreate(array $data)
+    {
+        return Validator::make($data, [
+            'name' => ['required', 'string', 'max:50', 'unique:labor_companies'],
+        ]);
+    }
+    protected function validatorUpdate(array $data)
+    {
+        return Validator::make($data, [
+            'name' => ['required', 'string', 'max:50'],
+        ]);
+    }
+    /**
+     * Display the specified resource.
+     *
+     * @param  $laborCompany
+     * @return
+     */
+    public function show(LaborCompany $laborCompany)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  $laborCompany
+     * @return
+     */
+    public function edit(LaborCompany $laborCompany)
+    {
+        if(!Gate::allows('劳务所-编辑')){ return redirect(url('/'));  }
+        return view('maintenance.laborCompany.edit',['laborCompany'=>$laborCompany]);
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param Request $request
+     * @param  $laborCompany
+     * @return
+     */
+    public function update(Request $request, LaborCompany $laborCompany)
+    {
+        if(!Gate::allows('劳务所-编辑')){ return redirect(url('/'));  }
+        $this->validatorUpdate($request->all())->validate();
+        $laborCompany->fill($request->all());
+        $laborCompany->update();
+        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return redirect('maintenance/laborCompany/')->with('successTip',"成功修改劳务所“{$laborCompany['name']}”!");
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  $laborCompany
+     * @return array
+     * @throws
+     */
+    public function destroy(LaborCompany $laborCompany)
+    {
+        if(!Gate::allows('物流公司-删除')){ return redirect(url('/'));  }
+        $this->log(__METHOD__,__FUNCTION__,$laborCompany->toJson(),Auth::user()['id']);
+        $re=$laborCompany->delete();
+        return ['success'=>$re];
+    }
+}

+ 145 - 0
app/Http/Controllers/LaborReportController.php

@@ -0,0 +1,145 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Exports\Export;
+use App\LaborReport;
+use App\UserDutyCheck;
+use App\UserWorkgroup;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+use Maatwebsite\Excel\Facades\Excel;
+
+class LaborReportController extends Controller
+{
+    //超15天精确查询抽离 cloumn前提:数据库字段名必须与request内字段名一致
+    public function preciseQuery(string $column,Request $request,$laborReports){
+        $today=Carbon::now()->subDays(15);
+        $laborReportsTem=clone $laborReports;
+        $laborReportsTem=$laborReportsTem->where($column,'like','%'.$request->input($column).'%')->where('created_at','>',$today->format('Y-m-d'));
+        if($laborReportsTem->count()==0
+            ||$laborReportsTem->first()[$column]==$request->input($column)){
+            $laborReports=$laborReports->where($column,$request->input($column));
+        }else{
+            $laborReports=$laborReportsTem;
+        }
+        return $laborReports;
+    }
+
+    public function conditionQuery(Request $request,$laborReports){
+        if ($request->input('enter_number')){
+            $laborReports=$this->preciseQuery('enter_number',$request,$laborReports);
+        }
+        if ($request->input('user_workgroup_id')){
+            $laborReports=$this->preciseQuery('user_workgroup_id',$request,$laborReports);
+        }
+        if ($request->input('created_at_start')){
+            $created_at_start=$request->input('created_at_start')." 00:00:00";
+            $laborReports=$laborReports->where('created_at','>=',$created_at_start);
+        }
+        if ($request->input('created_at_end')){
+            $created_at_end=$request->input('created_at_end')." 23:59:59";
+            $laborReports=$laborReports->where('created_at','<=',$created_at_end);
+        }
+        if ($request->input('mobile_phone')){
+            $laborReports=$laborReports->where('mobile_phone',$request->input('mobile_phone'));
+        }
+        if ($request->input('identity_number')){
+            $laborReports=$this->preciseQuery('identity_number',$request,$laborReports);
+        }
+        return $laborReports;
+    }
+    /**
+     * Display a listing of the resource.
+     *@param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     * 临时工报表
+     */
+    public function index(Request $request)
+    {
+        if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
+        if ($request->input()){
+            $laborReports=LaborReport::orderBy('id','DESC');
+            $laborReports=$this->conditionQuery($request,$laborReports);
+            $laborReports=$laborReports->paginate($request->input('paginate')?$request->input('paginate'):50);
+            $userWorkGroups=UserWorkgroup::select('id','name')->get();
+            return view('personnel.laborReport.index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,'request'=>$request->input()]);
+        }
+        $laborReports=LaborReport::with(['userWorkgroup','user'])->orderBy('id','DESC')->paginate(50);
+        foreach ($laborReports as $laborReport){
+            $date=Carbon::parse($laborReport->check_in_at)->format('Y-m-d');
+            $userDutyCheckStart=UserDutyCheck::where('user_id',$laborReport->user_id)->where('workgroup_id',$laborReport->user_workgroup_id)->where('checked_at','>=',$date." 11:00".":00")
+                ->where('checked_at','<=',$date." 14:00:00")->where('type','登出')->first();
+            $userDutyCheckEnd=UserDutyCheck::where('user_id',$laborReport->user_id)->where('workgroup_id',$laborReport->user_workgroup_id)->where('checked_at','>=',$date." 11:00".":00")
+                ->where('checked_at','<=',$date." 14:00:00")->where('type','登入')->first();
+            if ($userDutyCheckStart['checked_at']==null){
+                $laborReport->beginLunch=null;
+            }else{
+                $laborReport->beginLunch=date('H:i',strtotime($userDutyCheckStart['checked_at']));
+            }
+            if ($userDutyCheckEnd['checked_at']==null){
+                $laborReport->endLunch=null;
+            }else{
+                $laborReport->endLunch=date('H:i',strtotime($userDutyCheckEnd['checked_at']));
+            }
+        }
+        $userWorkGroups=UserWorkgroup::select('id','name')->get();
+        return view('personnel/laborReport/index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,]);
+
+    }
+
+    public function export($id,Request $request){
+        if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
+        ini_set('max_execution_time',3500);
+        ini_set('memory_limit','3526M');
+        if ($id==-1){
+            $id=[];
+            $laborReports=LaborReport::select('id');
+            $laborReports=$this->conditionQuery($request,$laborReports);
+            $laborReports=$laborReports->get();
+            foreach ($laborReports as $laborReports){
+                array_push($id,$laborReports->id);
+            }
+        }else $id = explode( ',',$id);
+        if (!$id)return ;
+        $row=[[
+            'id'=>'ID',
+            'created_at'=>'创建时间',
+            'enter_number'=>'进厂编号',
+            'user_workgroup_name'=>'小组',
+            'name'=>'临时工',
+            'mobile_phone'=>'电话',
+            'identity_number'=>'身份证号',
+            'labor_company'=>'劳务所',
+            'check_in_at'=>'打卡时间',
+            'verify_at'=>'审核时间',
+            'group_user_id'=>'审核人',
+            'check_out_at'=>'退场时间',
+            'online_duration'=>'在线时长',
+            'working_duration'=>'本次工作时长',
+        ]];
+        $list=[];
+        for ($i=0; $i<count($id);$i++){
+            $laborReport=LaborReport::with(['userWorkgroup','user'])->find($id[$i]);
+            $w=[
+                'id'=>isset($laborReport->id)?$laborReport->id:'',
+                'created_at'=>isset($laborReport->created_at)?$laborReport->created_at:'',
+                'enter_number'=>isset($laborReport->enter_number)?$laborReport->enter_number:'',
+                'user_workgroup_name'=>isset($laborReport->userWorkgroup->name)?$laborReport->userWorkgroup->name:'',
+                'name'=>isset($laborReport->name)?$laborReport->name:'',
+                'mobile_phone'=>isset($laborReport->mobile_phone)?$laborReport->mobile_phone:'',
+                'identity_number'=>isset($laborReport->identity_number)?$laborReport->identity_number:'',
+                'labor_company'=>isset($laborReport->labor_company)?$laborReport->labor_company:'',
+                'check_in_at'=>isset($laborReport->check_in_at)?$laborReport->check_in_at:'',
+                'verify_at'=>isset($laborReport->verify_at)?$laborReport->verify_at:'',
+                'group_user_id'=>isset($laborReport->user->name)?$laborReport->user->name:'',
+                'check_out_at'=>isset($laborReport->check_out_at)?$laborReport->check_out_at:'',
+                'online_duration'=>isset($laborReport->online_duration)?$laborReport->online_duration:'',
+                'working_duration'=>isset($laborReport->working_duration)?$laborReport->working_duration:'',
+            ];
+            $list[$i]=$w;
+        }
+        return Excel::download(new Export($row,$list),date('YmdHis', time()).'-临时工报表记录单.xlsx');
+    }
+}

+ 1 - 0
app/Http/Controllers/MeasureMonitorController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\Events\TeamAuditEvent;
 use App\Events\WeighedEvent;
 use App\MeasuringMachine;
 use App\Package;

+ 18 - 3
app/Http/Controllers/OwnerController.php

@@ -124,10 +124,25 @@ class OwnerController extends Controller
     public function destroy(Owner $owner)
     {
         if(!Gate::allows('货主-删除')){ return redirect(url('/'));  }
-        $authority=Authority::where('name',"_{$owner['id']}")->first();
-        if($authority)$authority->delete();
-        $this->log(__METHOD__,__FUNCTION__,$owner->toJson(),Auth::user()['id']);
+//        $authority=Authority::where('name',"_{$owner['id']}")->first();
+//        if($authority)$authority->delete();
         $re=$owner->delete();
+        $this->log(__METHOD__,__FUNCTION__,$owner->toJson(),Auth::user()['id']);
         return ['success'=>$re];
     }
+    public function recycle()
+    {
+        if(!Gate::allows('货主-删除')){ return redirect(url('/'));  }
+        $owners=Owner::orderBy('id','desc')->withTrashed()->whereNotNull('deleted_at')->paginate(25);
+        return view('maintenance.owner.recycle',['owners'=>$owners]);
+    }
+    public function restoreSelected(Request $request)
+    {
+        if(!Gate::allows('货主-删除')){ return ['success'=>'false','fail_info'=>"没有权限"];  }
+        $id=$request->input('id');
+        $owner=Owner::withTrashed()->where('id',$id)->first();
+        $owner->restore();
+        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return ['success'=>'true','owner'=>$owner];
+    }
 }

+ 39 - 9
app/Http/Controllers/PersonnelController.php

@@ -2,16 +2,23 @@
 
 namespace App\Http\Controllers;
 
+use App\Events\TeamAuditEvent;
+use App\LaborCompany;
+use App\LaborReport;
 use App\ProcessDailyParticipant;
 use App\User;
 use App\UserDetail;
 use App\UserDutyCheck;
+use App\UserLabor;
+use App\UserWorkgroup;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Validator;
+use Ramsey\Uuid\Uuid;
 
 class PersonnelController extends Controller
 {
@@ -73,8 +80,7 @@ class PersonnelController extends Controller
         if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
         $id=$request->input('id');
         $userDutyCheck=UserDutyCheck::find($id);
-        $user=User::find($userDutyCheck->user_id);
-        $workgroup=$user->userWorkgroups()->first();
+        $workgroup=UserWorkgroup::find($userDutyCheck['workgroup_id']);
         if ($workgroup){
             if(!Gate::allows($workgroup->name)){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
         }
@@ -82,17 +88,28 @@ class PersonnelController extends Controller
         $userDutyCheck->type=$type;
         $userDutyCheck->group_user_id=Auth::user()['id'];
         $userDutyCheck->update();
+        $checkInDate=Carbon::parse($userDutyCheck->checked_at)->format('Y-m-d');
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('user_workgroup_id',$workgroup->id)->where('created_at','like',$checkInDate."%")->first();
+        $this->updateLaborReportVerify($laborReport,$userDutyCheck);
         $this->log(__METHOD__,"打卡组长审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        event(new TeamAuditEvent($userDutyCheck));
         return ["success"=>true,"data"=>$userDutyCheck->group_user_id];
     }
+    //修改临时工报表审核时间
+    public function updateLaborReportVerify($laborReport,$userDutyCheck){
+        $date=date('Y-m-d H:i:s');
+        $laborReport['verify_at']=$date;
+        $laborReport['group_user_id']=$userDutyCheck->group_user_id;
+        $laborReport->update();
+        $this->log(__METHOD__,"打卡组长审核更新临时工报表的审核时间".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        return;
+    }
 
     //去往任务审核
     public function missionAudit(Request $request){
         if(!Gate::allows('人事管理-任务审核')){ return redirect(url('/'));  }
         $processDailyParticipants=ProcessDailyParticipant::with(['processDaily','user_detail'=>function($builder){
-           return $builder->with(['user'=>function($builder){
-               return $builder->with(['userWorkgroups']);
-           }]);
+            return $builder->with(['user'=>function($builder){return $builder->with(['userWorkgroups']);},'user_labor'=>function($builder){return $builder->with(['laborCompany']);}]);
         }])->orderBy('id','DESC');
         $start_date=$request->input('start_date');
         $end_date=$request->input('end_date');
@@ -141,9 +158,10 @@ class PersonnelController extends Controller
             $query->whereIn("id",$userWorkgroupIds);
         })->get();
         $user_ids=array_column($users->toArray(),'id');
-        $date=date('Y-m-d');
-        $userDutyChecks=UserDutyCheck::with('userDetail.user.userWorkgroups')->whereIn("user_id",$user_ids)
-            ->where('checked_at','like',$date."%")->get();
+        $dateNow=Carbon::now()->addDays(1)->format('Y-m-d');
+        $beforeYesterdayDate=Carbon::now()->addDays(-2)->format('Y-m-d');
+        $userDutyChecks=UserDutyCheck::with(['userWorkgroup','userLabor.laborCompany','userDetail'])->whereIn("user_id",$user_ids)
+            ->whereBetween('checked_at',[$beforeYesterdayDate,$dateNow])->where('type','登入')->get();
         return view('personnel/checking-in/clockAudit',['userDutyChecks'=>$userDutyChecks,'workgroupSign'=>$result['workgroupSign']]);
     }
 
@@ -155,17 +173,29 @@ class PersonnelController extends Controller
         $user_id=$request->input('user_id');
         $checked_at=$request->input('checked_at');
         $type=$request->input('type');
+        $userWorkgroupID=DB::table('user_workgroup_user')->where('user_id',$user_id)->value('user_workgroup_id');
         $userDutyCheck=new UserDutyCheck([
             'user_id'=>$user_id,
             'checked_at'=>$checked_at,
             'type'=>$type,
             'source'=>'补入',
+            'workgroup_id'=>$userWorkgroupID
         ]);
+        $checkInDate=Carbon::parse($checked_at)->format('Y-m-d');
+        $laborReport=LaborReport::where('user_workgroup_id',$userWorkgroupID)->where('check_in_at','like',$checkInDate."%")->where('user_id',$user_id)->first();
+        if (!$laborReport&&$userDutyCheck->type=='登入'){
+            LaborReport::createLaborReportData($user_id,$userWorkgroupID,$userDutyCheck);
+            $this->log(__METHOD__,"提交临时工报表记录__".__FUNCTION__,json_encode([$user_id,$userWorkgroupID,$userDutyCheck]));
+        }
+        if ($laborReport&&$userDutyCheck->type){
+            LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
+            $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+        }
         $userDutyCheck->save();
+
         $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
         return ['success'=>true,'data'=>$userDutyCheck];
     }
-
     //搜索临时工下打卡信息
     public function checkUserLabors(Request $request){
         if(!Gate::allows('人事管理-录入补卡')){ return redirect(url('/'));  }

+ 107 - 0
app/Http/Controllers/QRCodeController.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\UserDetail;
+use App\UserToken;
+use App\UserWorkgroup;
+use App\Warehouse;
+use Endroid\QrCode\QrCode;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
+use Ramsey\Uuid\Uuid;
+
+class QRCodeController extends Controller
+{
+    public function goGetQRCode(){
+        $warehouses=Warehouse::get();
+        return view("personnel/checking-in/getQRcode",compact('warehouses'));
+    }
+    //二维码刷新时间
+    public function qrCode_refresh_time($userWorkgroups,$beforeTime){
+        $qrCode_refresh=config('hr.qrCode_refresh');
+        if (!Cache::has('last_refresh_date') || Cache::get('last_refresh_date')<date('Y-m-d H:i:s')){
+            $last_refresh_date=date('Y-m-d H:i:s',strtotime('+'.$qrCode_refresh.'second'));
+            Cache::put('last_refresh_date',$last_refresh_date);
+            return $this->flushQRCode($userWorkgroups);
+        }
+        if ($beforeTime==Cache::get('last_refresh_date')){
+            $time=strtotime($beforeTime);
+            //刷新 更新cache
+            $last_refresh_date=date('Y-m-d H:i:s', strtotime('+'.$qrCode_refresh.'second', $time));
+            Cache::put('last_refresh_date',$last_refresh_date);
+            return $this->flushQRCode($userWorkgroups);
+        }
+        //每次刷新都标记一个cache 新建  每次刷新前判断这个标记时间
+        //直接去本地获取二维码
+        return $this->getQRCode($userWorkgroups);
+    }
+    //刷新二维码
+    public function flushQRCode($userWorkgroups){
+        foreach ($userWorkgroups as $userWorkgroup){
+            $time=strtotime(Cache::get('last_refresh_date'));
+            $qrCode_refresh=config('hr.qrCode_refresh');
+            if ($qrCode_refresh){
+                $date=date('Y-m-d H:i:s', strtotime('+30second',$time));
+                $url=url("personnel/checking-in/userDutyCheck/clock?key=").$date;
+                $url=$url."&&userWorkgroupID=".$userWorkgroup->id;
+            }else{
+                $url=url("personnel/checking-in/userDutyCheck/clock");
+                $url=$url."?userWorkgroupID=".$userWorkgroup->id;
+            }
+            $qrCode=new QrCode($url);
+            if ($userWorkgroup->id){
+                $fileURL=base_path('public/images/QRCodeIMG/'.$userWorkgroup->id.'.png');
+                $qrCode->writeFile($fileURL);
+                $userWorkgroup->url=url('images/QRCodeIMG/'.$userWorkgroup->id.'.png').'?da='.Uuid::uuid1();
+            }
+        }
+        return $userWorkgroups;
+    }
+    //获取二维码
+    public function getQRCode($userWorkgroups){
+        foreach ($userWorkgroups as $userWorkgroup){
+            $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
+            if ($qrCode_refresh_everyday){
+                $date=md5(date('Y-m-d'));
+                $url=url("personnel/checking-in/userDutyCheck/clock?key=").$date;
+                $url=$url."&&userWorkgroupID=".$userWorkgroup->id;
+            }else{
+                $url=url("personnel/checking-in/userDutyCheck/clock");
+                $url=$url."?userWorkgroupID=".$userWorkgroup->id;
+            }
+            $qrCode=new QrCode($url);
+            if ($userWorkgroup->id){
+                $fileURL=base_path('public/images/QRCodeIMG/'.$userWorkgroup->id.'.png');
+                if (file_exists($fileURL)){
+                    $userWorkgroup->url=url('images/QRCodeIMG/'.$userWorkgroup->id.'.png');
+                    continue;
+                }
+                $qrCode->writeFile($fileURL);
+                $userWorkgroup->url=url('images/QRCodeIMG/'.$userWorkgroup->id.'.png');
+            }
+        }
+        return $userWorkgroups;
+
+
+    }
+    //进入刷新二维码页面
+    public function refreshQRCode(Request $request){
+        $beforeTime=$request->input('beforeTime');
+        $warehouseId=$request->input('warehouseId');
+        $userWorkgroups=UserWorkgroup::where('warehouse_id',$warehouseId)->get();
+        $userWorkgroups=$this->qrCode_refresh_time($userWorkgroups,$beforeTime);
+        if (!$userWorkgroups)return view('exception.404',['error'=>'未找到工作组!']);
+        return ['userWorkgroups'=>$userWorkgroups,'last_refresh_date'=>Cache::get('last_refresh_date'),];
+    }
+    //第一次进入二维码显示页面
+    public function QRCode(Request $request){
+        $warehouseId=$request->input('warehouseId');
+        $userWorkgroups=UserWorkgroup::where('warehouse_id',$warehouseId)->get();
+        $beforeTime=date('Y-m-d H:i:s');
+        $userWorkgroups=$this->qrCode_refresh_time($userWorkgroups,$beforeTime);
+        Cache::forget('last_refresh_date');
+        if (!$userWorkgroups)return view('exception.404',['error'=>'未找到工作组!']);
+        return view('personnel/checking-in/QRcode',['warehouseId'=>$warehouseId,'userWorkgroups'=>$userWorkgroups,'last_refresh_date'=>Cache::get('last_refresh_date'),]);
+    }
+}

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

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers;
 
+use App\Exports\DefaultExport;
+use App\Exports\Export;
 use App\Exports\RejectedExport;
 use App\Imports\CommodityImport;
 use App\Imports\RejectedImport;
@@ -9,6 +11,7 @@ use App\Logistic;
 use App\Owner;
 use App\QualityLabel;
 use App\Rejected;
+use App\RejectedAnalyzeOwner;
 use App\RejectedBill;
 use App\RejectedBillItem;
 use Carbon\Carbon;
@@ -35,7 +38,7 @@ class RejectedController extends Controller
      */
     public function index(Request $request)
     {
-        if(!Gate::allows('退货管理-查询')){ return redirect(url('/'));  }
+        if(!Gate::allows('退货管理-查询')){ return redirect(url('/homeTemp'));  }
         $user=Auth::user();
         $paginate = $request->input('paginate')??50;
         $paginateParams = $this->packFilterParams($request);
@@ -46,7 +49,7 @@ class RejectedController extends Controller
         $rejectedBills=$rejectedQuery->paginate($paginate, ['*'], 'page', $page);
         $owners = Owner::filterAuthorities()->get();
         $qualityLabels = QualityLabel::all();
-        return view('rejected.index',compact('rejectedBills','owners',
+        return view('rejected.search.general',compact('rejectedBills','owners',
             'paginateParams','qualityLabels'));
     }
     public function recycle(Request $request)
@@ -438,4 +441,58 @@ class RejectedController extends Controller
             return '<h1 class="text-danger">失败</h1>'.$e->getMessage();
         }
     }
+
+
+     //generalSearch 一般查询 zengjun
+    public function indexGeneral(Request $request)
+    {
+      return $this->index( $request);
+    }
+
+    //analyzeSearch 统计查询 zengjun
+    public function indexAnalyze(Request $request)
+    {
+        if(!Gate::allows('退货管理-查询')){ return redirect(url('/'));  }
+        $paginateParams = $this->getAnalyzeSearchParams($request);
+        $rejectedBills =  RejectedAnalyzeOwner::findBy($paginateParams);
+        $owners = Owner::filterAuthorities()->get();
+        $qualityLabels = QualityLabel::all();
+        return view('rejected.search.analyze',compact('rejectedBills','owners',
+            'paginateParams','qualityLabels'));
+    }
+
+    // 统计查询参数获取 zengjun
+    private function getAnalyzeSearchParams(Request $request)
+    {
+        $searchParams = [
+            'owner_id' => $request->input('owner_id'),
+            'ids'=> $request->input('ids'),
+            'created_at_start' => $request->input('created_at_start'),
+            'created_at_end' => $request->input('created_at_end')
+        ];
+        return $searchParams;
+    }
+
+    //  导出部分    zengjun
+    public function exportExcelOnParams(Request $request){
+        ini_set('max_execution_time',2500);
+        ini_set('memory_limit','1526M');
+        $row = RejectedAnalyzeOwner::getExcelFromHead();
+        $searchParams = $this->getAnalyzeSearchParams($request);
+        $data = RejectedAnalyzeOwner::getFindBy($searchParams);
+//        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return Excel::download(new DefaultExport($row,$data),date('YmdHis', time()).'-退货统计记录单.xlsx');
+    }
+
+    // 导出全部     zengjun
+    public function exportAllExcelOnParams(Request $request){
+        ini_set('max_execution_time',2500);
+        ini_set('memory_limit','1526M');
+        $searchParams = $this->getAnalyzeSearchParams($request);
+        $row = RejectedAnalyzeOwner::getExcelFromHead();
+        $data = RejectedAnalyzeOwner::getFindBy($searchParams);
+//        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return Excel::download(new DefaultExport($row,$data),date('YmdHis', time()).'-退货统计记录单.xlsx');
+    }
+
 }

+ 104 - 9
app/Http/Controllers/TestController.php

@@ -5,14 +5,11 @@ namespace App\Http\Controllers;
 
 use App\Authority;
 use App\Batch;
-use App\City;
 use App\Events\CancelOrder;
 use App\Events\WmsReceiveNewEvent;
 use App\Http\Controllers\Api\thirdPart\flux\WaybillController;
 use App\Logistic;
-use App\OracleActTransactionLog;
 use App\Order;
-use App\Owner;
 use App\Package;
 use App\Rejected;
 use App\RejectedBill;
@@ -21,15 +18,11 @@ use App\Unit;
 use App\UploadFile;
 use App\User;
 use App\UserToken;
-use App\UserWorkgroup;
 use App\Waybill;
 use App\OraccleBasCustomer;
 use App\WMSReflectReceive;
-use App\WMSWaybillOrder;
 use Carbon\Carbon;
-use Endroid\QrCode\QrCode;
 use Endroid\QrCode\Response\QrCodeResponse;
-use Illuminate\Database\Query\JoinClause;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
 use function PHPSTORM_META\map;
@@ -187,8 +180,110 @@ class TestController extends Controller
         });
     }
     public function test1(){
-        $rejected=new Rejected();
-        $rejected->fill(["a"=>"b"]);
+        $waybills=Waybill::select('id','wms_bill_number')->get();
+        foreach ($waybills as $waybill){
+            $orders=WMSWaybillOrder::where('OrderNo',$waybill->wms_bill_number)->get();
+            if (count($orders)>0){
+                $warehouseWeight=0;
+                $sign=false;
+                foreach ($orders as $order){
+                    $warehouseWeight+=$order->Cubic;
+                    if ($order->Cubic==0)$sign=true;
+                }
+                if ($sign)unset($warehouseWeight);
+            }
+            $waybill=Waybill::find($waybill->id);
+            if (isset($warehouseWeight)){
+                if ($waybill){
+                    $waybill->warehouse_weight=$warehouseWeight;
+                }
+            }else{
+                $waybill->warehouse_weight=null;
+                $waybill->warehouse_weight_unit_id=null;
+            }
+            $result+=$temp[$arr[$i]];
+            if ($sign)$sign=false;
+        }
+        if($result<1 || $result>3999)$result=0;
+        return $result;
+    }
+    public function test3()
+    {
+        $strs=["auibh","aopk","bikon"];
+        if (!$strs[0])return "";
+        $len=strlen($strs[0]);
+        for ($i=1;$i<count($strs);$i++){
+            if ($len<1)break;
+            for ($j=0;$j<$len;$j++){
+                if ($strs[$i][$j]!=$strs[0][$j]){
+                    if ($j==0)return "";
+                    break;
+                }
+                $sum=$j+1;
+            }
+            $len=isset($sum)?$sum:0;
+        }
+        return substr($strs[0],0,$len);
+    }
+    public function test4(){
+        $s="{([{()()[]{}}])[{()()[}]{}}](){[]}";
+        $map = [
+            ")" => "(",
+            "}" => "{",
+            "]" => "[",
+        ];
+
+        $len = strlen($s);
+        $stack = [];
+        if ($len%2!=0)dd(false);
+        //s中出现map的key则弹出,没有出现则入栈
+        for ($i =0; $i<$len; $i++) {
+            var_dump("data:".$s[$i]);
+            if (isset($map[$s[$i]])){
+                //s中出现map的key:如果能找到对应的map的值 (,{,[ 则说明有配对,则弹出
+                if (isset($stack)  && $stack[0] == $map[$s[$i]]) {
+                    array_shift($stack);
+                } else { //仅找到后面的一部分,说明是不匹配的
+                    dd(false);
+                }
+                var_dump("value1:".$map[$s[$i]]);
+                var_dump($stack);
+            } else {
+                array_unshift($stack, $s[$i]);
+                var_dump("value2:".$s[$i]);
+                var_dump($stack);
+            }
+        }
+
+        if (count($stack) > 0) {
+            dd(false);
+        }
+        dd(true);
+        //利用栈的先进后出 一个正确的括号组对应都为1对1或N对N
+        // 先进后出“([{”入栈,")]}"出栈,轮询到出栈元素去映射栈顶,符合出栈,不符合直接返回
+        //依次轮询 如果映射正确那么最后栈为空栈 否则返回false
+
+        /*
+        $r=[];
+        $sTemp=["("=>1,"["=>2,"{"=>3,")"=>-1,"]"=>-2,"}"=>-3];
+        for ($i=0;$i<strlen($s);$i++){
+            if ($i!=strlen($s)-1){
+                if (($sTemp[$s[$i]]+$sTemp[$s[$i+1]])==0){
+                    $i++;
+                    var_dump($s[$i],$i);
+                    continue;
+                }
+            }
+            array_push($r,$sTemp[$s[$i]]);
+        }
+        $sum=count($r);
+        if ($sum==0)return "a";
+        if ($sum%2!=0)return "b";
+        $svg=$sum/2;
+        for ($i=0;$i<$svg;$i++){
+            if ($r[$i]>0&&$r[$i]+$r[$sum-1-$i]!=0)return "b";
+        }
+        return "a";*/
     }
     function test(){
         $waybill=Waybill::with('uploadFile')->find(55);

+ 122 - 57
app/Http/Controllers/UserDutyCheckController.php

@@ -2,83 +2,66 @@
 
 namespace App\Http\Controllers;
 
+use App\LaborCompany;
+use App\LaborReport;
 use App\User;
 use App\UserDetail;
 use App\UserDutyCheck;
 use App\UserLabor;
 use App\UserToken;
 use App\UserWorkgroup;
+use App\Warehouse;
 use Carbon\Carbon;
 use Endroid\QrCode\QrCode;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Date;
 use Illuminate\Support\Facades\Validator;
 use Ramsey\Uuid\Uuid;
 
 class UserDutyCheckController extends Controller
 {
-    public function goGetQRCode(){
-        $userWorkgroups=UserWorkgroup::get();
-        return view("personnel/checking-in/getQRcode",compact('userWorkgroups'));
-    }
-
-    //获取二维码
-    public function getQRCode(Request $request){
-        $userWorkgroup_id=$request->input('userWorkgroup_id');
-        $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
-        if ($qrCode_refresh_everyday){
-            $date=md5(date('Y-m-d'));
-            $url=url("personnel/checking-in/userDutyCheck/clock?key=").$date;
-            if ($userWorkgroup_id)$url=$url."&&userWorkgroupID=".$userWorkgroup_id;
-        }else{
-            $url=url("personnel/checking-in/userDutyCheck/clock");
-            if ($userWorkgroup_id)$url=$url."?userWorkgroupID=".$userWorkgroup_id;
-        }
-        $qrCode=new QrCode($url);
-        if ($userWorkgroup_id){
-            $fileURL=base_path('public/images/QRCodeIMG/'.$userWorkgroup_id.'.png');
-            if (file_exists($fileURL)){
-                return url('images/QRCodeIMG/'.$userWorkgroup_id.'.png');
-            }
-            $qrCode->writeFile($fileURL);
-            return url('images/QRCodeIMG/'.$userWorkgroup_id.'.png');
-        }
-        return (new Response())->header('Content-Type',$qrCode->getContentType())->setContent($qrCode->writeString());
-    }
-    //进入二维码显示页面
-    public function QRCode(Request $request){
-        $userWorkgroupId=$request->input('userWorkgroupId');
-        $userWorkgroup=UserWorkgroup::find($userWorkgroupId);
-        if (!$userWorkgroup)return view('exception.404',['error'=>'未找到工作组!']);
-        return view('personnel/checking-in/QRcode',compact('userWorkgroup'));
-    }
     //校验二维码进入打卡页面
     public function clock(Request $request){
         $userWorkgroupID=$request->input('userWorkgroupID');
         $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
+        $qrCode_refresh=config('hr.qrCode_refresh');
         if ($qrCode_refresh_everyday){
             $key=$request->input('key');
-            if (!$key) return "二维码失效!";
+            if (!$key) return view('exception.404',['error'=>'二维码失效!']);
             $date=md5(date('Y-m-d'));
-            if ($key!=$date) return "二维码失效!";
+            if ($key!=$date) return view('exception.404',['error'=>'二维码失效!']);
+        }
+        if ($qrCode_refresh){
+            $key=$request->input('key');
+            if (!$key) return view('exception.404',['error'=>'二维码失效!']);
+            $date=date('Y-m-d H:i:s');
+            if ($key<$date) return view('exception.404',['error'=>'二维码失效!']);
         }
         $userLaborToken=$request->cookie('userLaborToken');
         if ($userLaborToken && Cache::has('tokenStr_'.$userLaborToken)) {
             $user_id=Cache::get('tokenStr_'.$userLaborToken);
             $userDetail=UserDetail::find($user_id);
             if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$userDetail->mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
-            if ($userWorkgroupID){
-                $user=UserToken::getUser($userLaborToken);
-                $user->userWorkgroups()->sync([$userWorkgroupID]);
+            $userDutyCheck=$this->dutyCheck($userDetail->user_id,$userWorkgroupID);
+            //正常情况
+            $laborReport=LaborReport::where('user_workgroup_id',$userWorkgroupID)->where('created_at','like',Carbon::now()->format('Y-m-d')."%")->where('user_id',$userDetail->user_id)->first();
+            if(!isset($laborReport)&&$userDutyCheck->type=='登入'){
+                LaborReport::createLaborReportData($userDetail->user_id,$userWorkgroupID,$userDutyCheck);
+                $this->log(__METHOD__,"提交临时工报表记录__".__FUNCTION__,json_encode($laborReport));
+            }else if ($laborReport&&$userDutyCheck->type=='登出'){
+                LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
+                $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode($laborReport));
             }
-            $userDutyCheck=$this->dutyCheck($userDetail->user_id);
             if ($userDutyCheck&&$userDutyCheck->error)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
             if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
             $userWorkgroups=$userDetail->user->userWorkgroups();
             if($userWorkgroups->count()>0)
                 $group_name=$userDetail->user->userWorkgroups->first()['name'];
-            return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at]);
+            $laravelEchoPrefix = config('database.redis.options.prefix');
+            return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix]);
         }
         return view("personnel/checking-in/clock",compact('userWorkgroupID'));
     }
@@ -92,76 +75,146 @@ class UserDutyCheckController extends Controller
         if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
         $user=User::find($userDetail->user_id);
         if (Cache::has('tokenUser_'.$user->id))return "<h1 style='color: red;text-align:center'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
-        if ($userWorkgroupID)$user->userWorkgroups()->sync([$userWorkgroupID]);
-        $userDutyCheck=$this->dutyCheck($userDetail->user_id);
+        //if ($userWorkgroupID)$user->userWorkgroups()->sync([$userWorkgroupID]);
+        $userDutyCheckOld=UserDutyCheck::where('user_id',$userDetail->user_id)->orderBy('checked_at','DESC')->limit(10)->first();
+        $date=date('Y-m-d H:i:s');
+        $lastDate=Carbon::parse($userDutyCheckOld['checked_at']);
+        $thisDate=Carbon::parse($date);
+        $diffDate=$thisDate->diffInMinutes($lastDate);
+        $dateNow=Carbon::now()->format('Y-m-d');
+        //七天未登录从新选择劳务所
+        if ($diffDate>7*1440){
+            return redirect('personnel/checking-in/userDutyCheck/updateUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
+        }
+        $userDutyCheck=$this->dutyCheck($userDetail->user_id,$userWorkgroupID);
+        //正常情况
+        $laborReport=LaborReport::where('user_workgroup_id',$userWorkgroupID)->where('created_at','like',$dateNow."%")->where('user_id',$userDetail->user_id)->first();
+        if(!$laborReport&&$userDutyCheck->type=='登入'){
+            LaborReport::createLaborReportData($userDetail->user_id,$userWorkgroupID,$userDutyCheck);
+            $this->log(__METHOD__,"提交临时工报表记录__".__FUNCTION__,json_encode([$userDetail->user_id,$userWorkgroupID,$userDutyCheck]));
+        }else if ($laborReport&&$userDutyCheck->type=='登出'){
+            LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
+            $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+        }
         if ($userDutyCheck&&$userDutyCheck->error)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
         if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$user->token(config('users.token_check_in_expire_minutes'));
         $group_name=$userDetail->user->userWorkgroups->first()['name'];
-        return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at])
+        $laravelEchoPrefix = config('database.redis.options.prefix');
+        return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix])
             ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
     }
     //去往登记资料页面
     public function createUserDetail($mobile_phone){
         $userWorkgroupID=session("userWorkgroupID");
-        return view('personnel/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone,'userWorkgroupID'=>$userWorkgroupID]);
+        $laborCompanies=LaborCompany::select('id','name')->get();
+        return view('personnel/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone,'userWorkgroupID'=>$userWorkgroupID,'laborCompanies'=>$laborCompanies]);
+    }
+    //七天未打卡去往选择劳务所页面
+    public function updateUserDetail($mobile_phone){
+        $userWorkgroupID=session("userWorkgroupID");
+        $laborCompanies=LaborCompany::select('id','name')->get();
+        return view('personnel/checking-in/updateUserDetail',['mobile_phone'=>$mobile_phone,'userWorkgroupID'=>$userWorkgroupID,'laborCompanies'=>$laborCompanies]);
+    }
+    //提交修改资料
+    public  function storeUpdateUserDetail(Request $request){
+        $this->validator($request)->validate();
+        $mobile_phone=$request->input('mobile_phone');
+        $userWorkgroupID=$request->input('userWorkgroupID');
+        $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
+        if (!$userDetail)return view('exception.404',['error'=>'临时工信息不存在!']);
+        $labor_company_id=$request->input('labor_company_id');
+        $userLabor=UserLabor::where('user_id',$userDetail->user_id)->first();
+        $userLabor->update([
+            'labor_company_id'=>$labor_company_id,
+        ]);
+        $this->log(__METHOD__,"更改临时工劳务所信息".__FUNCTION__,json_encode($userLabor),Auth::user()['id']);
+        $userDutyCheck=$this->dutyCheck($userDetail->user_id,$userWorkgroupID);
+        //添加临时工报表数据
+        LaborReport::createLaborReportData($userDetail->user_id,$userWorkgroupID,$userDutyCheck);
+        $this->log(__METHOD__,"提交临时工报表记录__".__FUNCTION__,json_encode([$userDetail->user_id,$userWorkgroupID,$userDutyCheck]));
+        if ($userDutyCheck&&$userDutyCheck->error)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+        if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+        $user=User::find($userDetail->user_id);
+        $userLaborToken=$user->token(config('users.token_check_in_expire_minutes'));
+        $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all()));
+        $group_name=$userDetail->user->userWorkgroups->first()['name'];
+        $laravelEchoPrefix = config('database.redis.options.prefix');
+        return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix])
+            ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
     }
-
     //提交登记资料
     public  function storeUserDetail(Request $request){
         $this->validator($request)->validate();
         $mobile_phone=$request->input('mobile_phone');
         $full_name=$request->input('full_name');
+        $identity_number=$request->input('identity_number');
         $userWorkgroupID=$request->input('userWorkgroupID');
         $user=new User([
             'name'=>$mobile_phone,
             'password'=>Uuid::uuid1(),
         ]);
         $user->save();
-        if ($userWorkgroupID)$user->userWorkgroups()->sync([$userWorkgroupID]);
         $userDetail=new UserDetail([
             'user_id'=>$user->id,
             'full_name'=>$full_name,
+            'identity_number'=>$identity_number,
             'gender'=>$request->input('gender'),
             'mobile_phone'=>$mobile_phone,
             'type'=>'临时工',
         ]);
         $userDetail->save();
+        $labor_company_id=$request->input('labor_company_id');
         $userLabor=new UserLabor([
             'user_id'=>$user->id,
-            'company'=>$request->input('company'),
+            'labor_company_id'=>$labor_company_id,
         ]);
         $userLabor->save();
-        $userDutyCheck=$this->dutyCheck($user->id);
+        $userDutyCheck=$this->dutyCheck($user->id,$userWorkgroupID);
+        LaborReport::createLaborReportData($user->id,$userWorkgroupID,$userDutyCheck);
+        $this->log(__METHOD__,"提交临时工报表记录__".__FUNCTION__,json_encode([$user->id,$userWorkgroupID,$userDutyCheck]));
         if ($userDutyCheck&&$userDutyCheck->error)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
         if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$user->token(config('users.token_check_in_expire_minutes'));
         $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all()));
         $group_name=$userDetail->user->userWorkgroups->first()['name'];
-        return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at])
+        $laravelEchoPrefix = config('database.redis.options.prefix');
+        return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix])
             ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
     }
 
     //根据用户提交打卡记录
-    public function dutyCheck($user_id){
+    public function dutyCheck($user_id,$userWorkgroupID){
         $userDutyCheckOld=UserDutyCheck::where('user_id',$user_id)->orderBy('checked_at','DESC')->limit(10)->first();
+        if ($userWorkgroupID!=$userDutyCheckOld['workgroup_id']){
+            $user=User::find($user_id);
+            $user->userWorkgroups()->sync([$userWorkgroupID]);
+        }
         $date=date('Y-m-d H:i:s');
+        $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode([$user_id,$userWorkgroupID,$date]));
         $userDutyCheck=new UserDutyCheck([
             'user_id'=>$user_id,
             'checked_at'=>$date,
             'source'=>'正常',
+            'verify_user_id'=>'',
+            'workgroup_id'=>$userWorkgroupID,
         ]);
         if (!$userDutyCheckOld){
             $userDutyCheck->type="登入";
             $userDutyCheck->save();
-            $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode($userDutyCheck));
             return $userDutyCheck;
         }
         $lastDate=Carbon::parse($userDutyCheckOld->checked_at);
         $thisDate=Carbon::parse($date);
         $diffDate=$thisDate->diffInMinutes($lastDate);
+        if ($userDutyCheckOld->type=="登出"&&$diffDate<7*1440){
+            $userDutyCheck->type="登入";
+            $userDutyCheck->verify_user_id=0;
+            $userDutyCheck->save();
+            return $userDutyCheck;
+        }
         if($diffDate<=5){
-            $userDutyCheck->error=true;
+            $userDutyCheck->error=true;//重复打卡
             return $userDutyCheck;
         }
         if ($userDutyCheckOld->type=="登入"){
@@ -186,16 +239,28 @@ class UserDutyCheckController extends Controller
             }
         }
         $userDutyCheck->save();
-        $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode($userDutyCheck));
         return $userDutyCheck;
     }
-
     public function validator(Request $request){
         $validator=Validator::make($request->input(),[
             'full_name'=>['filled'],
+            'userWorkgroupID'=>['filled'],
             'gender'=>['filled'],
             'mobile_phone'=>['required','integer','digits:11'],
-        ],[],[]);
+            'identity_number' => ['filled','identity_cards','unique:user_details,identity_number'],
+        ],[
+            'unique'=>':attribute 已经存在,不能重复!',
+            'filled' => ':attribute 不能为空',
+            'required'=>':attribute 为必填项',
+            'integer'=>':attribute 数字类型',
+            'digits'=>':attribute 必须是11位',
+        ],[
+            'full_name'=>'姓名',
+            'userWorkgroupID'=>'工作组ID',
+            'gender'=>'性别',
+            'mobile_phone'=>'手机号',
+            'identity_number' => '身份证号',
+        ]);
         return $validator;
     }
 }

+ 11 - 8
app/Http/Controllers/UserLaborController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\LaborCompany;
 use App\ProcessDailyParticipant;
 use App\User;
 use App\UserDetail;
@@ -65,7 +66,7 @@ class UserLaborController extends Controller
     public function show($id)
     {
         if(!Gate::allows('临时工-查询')){ return redirect(url('/'));  }
-        $userLabor=UserLabor::with('userDetail')->find($id);
+        $userLabor=UserLabor::with(['userDetail','laborCompany'])->find($id);
         return view('maintenance.userLabor.show',['userLabor'=>$userLabor]);
     }
     //获取劳务记录
@@ -95,8 +96,9 @@ class UserLaborController extends Controller
     public function edit($id)
     {
         if(!Gate::allows('临时工-编辑')){ return redirect(url('/'));  }
-        $userLabor=UserLabor::with('userDetail')->find($id);
-        return view('maintenance.userLabor.edit',['userLabor'=>$userLabor]);
+        $userLabor=UserLabor::with(['userDetail','laborCompany'])->find($id);
+        $laborCompanies=LaborCompany::select('id','name')->get();
+        return view('maintenance.userLabor.edit',['userLabor'=>$userLabor,'laborCompanies'=>$laborCompanies,]);
     }
 
     /**
@@ -115,7 +117,7 @@ class UserLaborController extends Controller
             'gender'=>['required',Rule::in(['男', '女']),],
             'identity_number'=>'nullable',
             'default_hour_price'=>'nullable|min:0|max:999999|numeric',
-            'company'=>'nullable',
+            'name'=>'nullable',
         ],[
             'required'=>':attribute 不应为空',
             'min'=>':attribute 不得为0或为负',
@@ -128,7 +130,7 @@ class UserLaborController extends Controller
             'gender'=>'性别',
             'identity_number'=>'身份证号',
             'default_hour_price'=>'默认计时工资',
-            'company'=>'劳务所',
+            'name'=>'劳务所',
         ])->validate();
         $userDetail=UserDetail::find($id);
         $userDetail->full_name=$request->input('full_name');
@@ -138,11 +140,12 @@ class UserLaborController extends Controller
         $userDetail->update();
         $this->log(__METHOD__,"修改用户详情".__FUNCTION__,json_encode($userDetail),Auth::user()['id']);
         $default_hour_price=$request->input('default_hour_price');
-        $company=$request->input('company');
+        $laborCompanyName=$request->input('name');
+        $labor_company_id=LaborCompany::where('name','=',$laborCompanyName)->value('id');
         $userLabor=UserLabor::find($id);
-        if ($userLabor->default_hour_price!=$default_hour_price || $userLabor->company!=$company){
+        if ($userLabor->default_hour_price!=$default_hour_price || $userLabor->labor_company_id!=$labor_company_id){
             $userLabor->default_hour_price=$default_hour_price;
-            $userLabor->company=$company;
+            $userLabor->labor_company_id=$labor_company_id;
             $userLabor->update();
             $this->log(__METHOD__,"修改临时工".__FUNCTION__,json_encode($userLabor),Auth::user()['id']);
         }

+ 17 - 4
app/Http/Controllers/UserWorkgroupController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Authority;
 use App\UserWorkgroup;
+use App\Warehouse;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
@@ -14,14 +15,15 @@ class UserWorkgroupController extends Controller
     public function index()
     {
         if(!Gate::allows('工作组-查询')){ return redirect(url('/'));  }
-        $UserWorkgroups=UserWorkgroup::orderBy('id',"DESC")->paginate(50);
+        $UserWorkgroups=UserWorkgroup::with('wareHouse')->orderBy('id',"DESC")->paginate(50);
         return view('maintenance.userWorkgroup.index',['userWorkgroups'=>$UserWorkgroups]);
     }
 
     public function create()
     {
         if(!Gate::allows('工作组-录入')){ return redirect(url('/'));  }
-        return view('maintenance.userWorkgroup.create');
+        $warehouses=Warehouse::select('id','name')->get();
+        return view('maintenance.userWorkgroup.create',['warehouses'=>$warehouses]);
     }
 
 
@@ -31,6 +33,9 @@ class UserWorkgroupController extends Controller
         $id=false;
         $this->validatorUserWorkgroup($request,$id)->validate();
         $UserWorkgroup=new UserWorkgroup($request->input());
+        $warehouse=$request->input('warehouse');
+        $warehouseId=Warehouse::where('name',$warehouse)->value('id');
+        $UserWorkgroup['warehouse_id']=$warehouseId;
         $UserWorkgroup->save();
         $this->storeAuthority($UserWorkgroup['name'],$UserWorkgroup->id);
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
@@ -50,7 +55,9 @@ class UserWorkgroupController extends Controller
     {
         if(!Gate::allows('工作组-编辑')){ return redirect(url('/'));  }
         $userWorkgroup=UserWorkgroup::find($id);
-        return view('maintenance.userWorkgroup.edit',['userWorkgroup'=>$userWorkgroup]);
+        if (!$userWorkgroup)return view('exception.404',['error'=>'工作组不存在!']);
+        $warehouses=Warehouse::select('id','name')->get();
+        return view('maintenance.userWorkgroup.edit',['userWorkgroup'=>$userWorkgroup,'warehouses'=>$warehouses]);
     }
 
     public function update(Request $request, $id)
@@ -59,6 +66,7 @@ class UserWorkgroupController extends Controller
         $this->validatorUserWorkgroup($request,$id)->validate();
         $data=$request->input();
         $userWorkgroup=UserWorkgroup::find($id);
+        $userWorkgroup['warehouse_id']= $data['warehouse_id'];
         if ($data['name']!=$userWorkgroup->name){
             $authority=Authority::where("name",$userWorkgroup->name)->first();
             if ($authority){
@@ -70,7 +78,10 @@ class UserWorkgroupController extends Controller
                 $this->storeAuthority($data['name'],$id);
             }
             $userWorkgroup->fill($data);
-            $userWorkgroup->save();
+            $userWorkgroup->update();
+            $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        }else{
+            $userWorkgroup->update();
             $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         }
         return redirect('maintenance/userWorkgroup')->with('successTip','工作组“'.$request->input('name').'”修改成功');
@@ -89,12 +100,14 @@ class UserWorkgroupController extends Controller
         if ($id){$name=$id;}
         $validator=Validator::make($request->input(),[
             'name'=>['required','max:10',isset($name)?"unique:user_workgroups,name,$name":'unique:user_workgroups,name'],
+            'warehouse_id'=>['required'],
         ],[
             'required'=>':attribute 为必填项',
             'max'=>':attribute 过长',
             'unique'=>':attribute 已存在',
         ],[
             'name'=>'工作组名称',
+            'warehouse_id'=>'仓库名称',
         ]);
         return $validator;
     }

+ 58 - 20
app/Http/Controllers/WarehouseController.php

@@ -2,47 +2,75 @@
 
 namespace App\Http\Controllers;
 
+
 use App\Warehouse;
+use Exception;
 use Illuminate\Http\Request;
+use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Validator;
 
 class WarehouseController extends Controller
 {
     /**
      * Display a listing of the resource.
      *
-     * @return \Illuminate\Http\Response
+     * @return Response
      */
     public function index()
     {
-        //
+        if(!Gate::allows('仓库-查询')){ return redirect(url('/'));  }
+        $warehouses=Warehouse::orderBy('id','desc')->paginate(35);
+        return view('maintenance.warehouse.index',['warehouses'=>$warehouses]);
     }
 
     /**
      * Show the form for creating a new resource.
      *
-     * @return \Illuminate\Http\Response
+     * @return Response
      */
     public function create()
     {
-        //
+        if(!Gate::allows('仓库-录入')){ return redirect(url('/'));  }
+        return view('maintenance.warehouse.create');
     }
 
     /**
      * Store a newly created resource in storage.
      *
-     * @param  \Illuminate\Http\Request  $request
-     * @return \Illuminate\Http\Response
+     * @param Request $request
+     * @return Response
      */
     public function store(Request $request)
     {
-        //
-    }
+        if(!Gate::allows('仓库-录入')){ return redirect(url('/'));  }
+        $this->validatorCreate($request->all())->validate();
+        $warehouse=new Warehouse($request->all());
+        $warehouse->save();
 
+        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return redirect('maintenance/warehouse/create')->with('successTip',"成功录入仓库“{$request->input('name')}”");
+    }
+    protected function validatorCreate(array $data)
+    {
+        return Validator::make($data, [
+            'name' => ['required', 'string', 'max:50', 'unique:warehouses'],
+            'code' => ['nullable', 'string', 'max:50', 'unique:warehouses,code'],
+        ]);
+    }
+    protected function validatorUpdate(array $data)
+    {
+        return Validator::make($data, [
+            'name' => ['required', 'string', 'max:50'],
+            'code' => ['nullable', 'string', 'max:50'],
+        ]);
+    }
     /**
      * Display the specified resource.
      *
-     * @param  \App\Warehouse  $warehouse
-     * @return \Illuminate\Http\Response
+     * @param Warehouse $warehouse
+     * @return Response
      */
     public function show(Warehouse $warehouse)
     {
@@ -52,34 +80,44 @@ class WarehouseController extends Controller
     /**
      * Show the form for editing the specified resource.
      *
-     * @param  \App\Warehouse  $warehouse
-     * @return \Illuminate\Http\Response
+     * @param Warehouse $warehouse
+     * @return Response
      */
     public function edit(Warehouse $warehouse)
     {
-        //
+        if(!Gate::allows('仓库-编辑')){ return redirect(url('/'));  }
+        return view('maintenance.warehouse.edit',['warehouse'=>$warehouse]);
     }
 
     /**
      * Update the specified resource in storage.
      *
-     * @param  \Illuminate\Http\Request  $request
-     * @param  \App\Warehouse  $warehouse
-     * @return \Illuminate\Http\Response
+     * @param Request $request
+     * @param Warehouse $warehouse
+     * @return Response
      */
     public function update(Request $request, Warehouse $warehouse)
     {
-        //
+        if(!Gate::allows('仓库-编辑')){ return redirect(url('/'));  }
+        $this->validatorUpdate($request->all())->validate();
+        $warehouse->fill($request->all());
+        $warehouse->update();
+        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return redirect('maintenance/warehouse/')->with('successTip',"成功修改仓库“{$warehouse['name']}”!");
     }
 
     /**
      * Remove the specified resource from storage.
      *
-     * @param  \App\Warehouse  $warehouse
-     * @return \Illuminate\Http\Response
+     * @param Warehouse $warehouse
+     * @return array|Response
+     * @throws Exception
      */
     public function destroy(Warehouse $warehouse)
     {
-        //
+        if(!Gate::allows('仓库-删除')){ return redirect(url('/'));  }
+        $this->log(__METHOD__,__FUNCTION__,$warehouse->toJson(),Auth::user()['id']);
+        $re=$warehouse->delete();
+        return ['success'=>$re];
     }
 }

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

@@ -154,7 +154,7 @@ class WaybillController extends Controller
         try{
             $response = Zttp::post($url, $sendingJson);
         }catch (\Exception $exception){
-            Controller::logS(__METHOD__,'Exception_'.__FUNCTION__,'CURL请求异常:'.$exception->getMessage(),null);
+            $this->log(__METHOD__,'Exception_'.__FUNCTION__,'CURL请求异常:'.$exception->getMessage(),null);
             return false;
         }
         $responseJson = $response->json();

+ 14 - 0
app/LaborCompany.php

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

+ 111 - 0
app/LaborReport.php

@@ -0,0 +1,111 @@
+<?php
+
+namespace App;
+
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Model;
+use App\Traits\ModelTimeFormat;
+use Illuminate\Support\Facades\Auth;
+use Ramsey\Uuid\Uuid;
+
+class LaborReport extends Model
+{
+    use ModelTimeFormat;
+
+    protected $fillable=[
+        'id','enter_number','user_workgroup_id','user_id','name','mobile_phone','identity_number','labor_company','check_in_at','verify_at','check_out_at','online_duration','working_duration'
+    ];
+
+    public function userWorkgroup(){
+        return $this->belongsTo('App\UserWorkgroup','user_workgroup_id','id');
+    }
+    public function user(){
+        return $this->belongsTo('App\User','group_user_id','id');
+    }
+
+    //添加临时工报表数据
+    static function createLaborReportData($user_id,$userWorkgroupID,$userDutyCheck){
+        $userDetail=UserDetail::find($user_id);
+        $name=$userDetail['full_name'];
+        $mobile_phone=$userDetail['mobile_phone'];
+        $identity_number=$userDetail['identity_number'];
+        $labor_company_id=UserLabor::where('user_id',$user_id)->value('labor_company_id');
+        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
+        if ($userDutyCheck->type=='登入'){
+            $check_in_at=$userDutyCheck['checked_at'];
+        }
+        $laborReport=new LaborReport([
+            'enter_number'=>Uuid::uuid1(),
+            'user_workgroup_id'=>$userWorkgroupID,
+            'user_id'=>$user_id,
+            'name'=>$name,
+            'mobile_phone'=>$mobile_phone,
+            'identity_number'=>$identity_number,
+            'labor_company'=>$labor_company,
+            'check_in_at'=>$check_in_at,
+        ]);
+        $laborReport->save();
+        $number_id=$laborReport->id;
+        $enter_number=$userWorkgroupID.date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
+        $laborReport->enter_number=$enter_number;
+        $laborReport->update();
+        return;
+    }
+    //修改临时工报表数据
+    static function updateLaborReportData($laborReport,$userDutyCheck){
+            //正常打卡情况
+            if($userDutyCheck->type=='登出'){
+                $laborReport->check_out_at=$userDutyCheck->checked_at;
+                $checkInDate=Carbon::parse($laborReport['check_in_at']);
+                $checkOutDate=Carbon::parse($userDutyCheck->checked_at);
+                $hour=($checkOutDate->diffInSeconds($checkInDate))/3600; //在线时长
+                $laborReport['online_duration']=$hour;
+                $laborReport['working_duration']= $laborReport['online_duration'];
+                $laborReport->update();
+            }
+        $date=Carbon::parse($laborReport['check_in_at'])->format('Y-m-d');
+        $userDutyCheckOld=UserDutyCheck::where('user_id',$userDutyCheck->user_id)->orderBy('checked_at','DESC')->limit(10)->first();
+        //补卡情况
+        if ($userDutyCheck->type=='登入'&&$userDutyCheckOld->checked_at>$userDutyCheck->checked_at&&$userDutyCheck->checked_at<$date." 11:00".":00"){
+            $laborReport['check_in_at']=$userDutyCheck['checked_at'];
+            $checkInDate=Carbon::parse($laborReport['check_in_at']);
+            if ($laborReport->check_out_at){
+                $checkOutDate=Carbon::parse($laborReport->check_out_at);
+                $hour=($checkOutDate->diffInSeconds($checkInDate))/3600; //在线时长
+                $laborReport['online_duration']=$hour;
+            }
+            $laborReport->update();
+        }
+        if ($userDutyCheck->type=='登入'&&$userDutyCheckOld->checked_at<$userDutyCheck->checked_at){
+            $userDutyCheck->save();
+            $laborReport['working_duration']=$laborReport['online_duration'];
+            $laborReport->update();
+        }
+        if ($userDutyCheck->type=='登出'&&$userDutyCheckOld->checked_at<$userDutyCheck->checked_at){
+            $laborReport->check_out_at=$userDutyCheck->checked_at;
+            $checkInDate=Carbon::parse($laborReport['check_in_at']);
+            $checkOutDate=Carbon::parse($userDutyCheck->checked_at);
+            $hour=($checkOutDate->diffInSeconds($checkInDate))/3600; //在线时长
+            $laborReport['online_duration']=$hour;
+            $laborReport['working_duration']=$hour;
+            $laborReport->update();
+        }
+
+        if ($laborReport&&$laborReport->check_out_at){
+            $userDutyCheckStart=UserDutyCheck::where('user_id',$laborReport->user_id)->where('workgroup_id',$laborReport->user_workgroup_id)->where('checked_at','>=',$date." 11:00".":00")
+                ->where('checked_at','<=',$date." 14:00:00")->where('type','登出')->first();
+            $userDutyCheckEnd=UserDutyCheck::where('user_id',$laborReport->user_id)->where('workgroup_id',$laborReport->user_workgroup_id)->where('checked_at','>=',$date." 11:00".":00")
+                ->where('checked_at','<=',$date." 14:00:00")->where('type','登入')->first();
+            $beginTime=Carbon::parse($userDutyCheckStart['checked_at']);
+            $endTime=Carbon::parse($userDutyCheckEnd['checked_at']);
+            $lunchHour=($endTime->diffInSeconds($beginTime))/3600;
+            if($userDutyCheck->type=='登入'&&$userDutyCheck->checked_at<=$date." 14:00:00"){
+                $laborReport['working_duration']=$laborReport['online_duration'];
+            }else{
+                $laborReport['working_duration']=$laborReport['online_duration']-$lunchHour;
+            }
+            $laborReport->update();
+        }
+        return;
+    }
+}

+ 2 - 0
app/Owner.php

@@ -3,6 +3,7 @@
 namespace App;
 
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Support\Facades\Auth;
 
 /**
@@ -12,6 +13,7 @@ use Illuminate\Support\Facades\Auth;
 class Owner extends Model
 {
     use ModelTimeFormat;
+    use SoftDeletes;
     public $fillable = ['name','code','checking_count'];
     public static function filterAuthorities(){
         $user=Auth::user();

+ 5 - 0
app/Providers/AppServiceProvider.php

@@ -7,6 +7,7 @@ use Illuminate\Queue\Events\JobFailed;
 use Illuminate\Support\Facades\Queue;
 use Illuminate\Support\Facades\Schema;
 use Illuminate\Support\ServiceProvider;
+use Validator;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -33,5 +34,9 @@ class AppServiceProvider extends ServiceProvider
             (new Controller())->log(__METHOD__,'EventError_',"$event -> connectionName:{$event->connectionName},$event-> job:{$event->job},
                 $event-> exception:{$event->exception}");
         });
+        //扩展身份证验证规则
+        Validator::extend('identity_cards', function($attribute, $value, $parameters) {
+            return preg_match('/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/', $value);
+        });
     }
 }

+ 10 - 5
app/Providers/AuthServiceProvider.php

@@ -30,9 +30,13 @@ class AuthServiceProvider extends ServiceProvider
     {
         $this->registerPolicies();
 
+        $isSuperAdmin = null;
         if(!Schema::hasTable('users')){return;}
-        Gate::before(function ($user) {
-            if ($user->isSuperAdmin()) {
+        Gate::before(function ($user)use(&$isSuperAdmin) {
+            if($isSuperAdmin===null){
+                $isSuperAdmin=$user->isSuperAdmin();
+            }
+            if ($isSuperAdmin) {
                 Cache::put('isSuperAdmin', true);
             }else{
                 Cache::put('isSuperAdmin', false);
@@ -42,9 +46,10 @@ class AuthServiceProvider extends ServiceProvider
         $authorities = Authority::with('roles')->get();
         foreach($authorities as $authority) {
             Gate::define($authority->name, function($user) use ($authority) {
-                if(Cache::get('isSuperAdmin')
-                    && $authority['permission']=='允许'){
-                    return true;
+                if(Cache::get('isSuperAdmin')){
+                    if($authority['permission']=='允许'){
+                        return true;
+                    }
                 }
                 return $user->hasRole($authority->roles);
             });

+ 143 - 0
app/RejectedAnalyzeOwner.php

@@ -0,0 +1,143 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Facades\DB;
+
+class RejectedAnalyzeOwner extends Model
+{
+
+    /**
+     * @var string[]
+     * id_owner:货主id
+     * owner_name:货主姓名
+     * bounce_amount:退件数
+     * check_amount:审核数
+     * in_storage_count:入库数
+     * created_at:创建时间
+     *
+     */
+    protected $appends = ['id_owner', 'owner_name', 'bounce_amount', 'check_amount', 'in_storage_count'];
+
+    // 按条件查询    zengjun
+    public static function findBy($array = null)
+    {
+        $sql = RejectedAnalyzeOwner::getQuerySQL($array);
+
+        $resultSet = DB::select($sql);
+        $collection = array();
+        foreach ($resultSet as $result) {
+            $rao = new RejectedAnalyzeOwner();
+            $rao->id_owner = $result->id_owner;
+            $rao->owner_name = $result->name;
+            $rao->bounce_amount = $result->bounce_amount;
+            $rao->check_amount = $result->check_amount;
+            $rao->in_storage_count = $result->in_storage_count;
+            $collection[] = $rao;
+        }
+        return $collection;
+    }
+
+    // 按条件查询    zengjun
+    public static function getFindBy($array){
+        $sql = RejectedAnalyzeOwner::getQuerySQL($array);
+        $resultSet = DB::select($sql);
+        $list = [];
+        foreach ($resultSet as $result) {
+            $rao =[
+                    'id_owner' => $result->id_owner,
+                    'owner_name'=>  $result->name,
+                    'bounce_amount'=>$result->bounce_amount,
+                    'check_amount'=>$result->check_amount,
+                    'uncheck_amount'=>$result->bounce_amount-$result->check_amount,
+                    'in_storage_count'=>$result->in_storage_count,
+                    'not_in_storage_count'=>$result->bounce_amount-$result->in_storage_count,
+            ];
+            $list[] = $rao;
+        }
+        return $list;
+    }
+
+    public static function getExcelFromHead($array = null){
+        $arr = [[
+            'id_owner'=>'货主编号',
+            'owner_name'=>'货主名',
+            'bounce_amount'=>'退件单数',
+            'check_amount'=>'审核单数',
+            'uncheck_amount'=>'未审核单数',
+            'in_storage_count'=>'入库单数',
+            'not_in_storage_count'=>'未入库单数',
+        ]];
+        return $arr;
+    }
+
+    // 拼接条件 没有ids     zengjun
+    public static function getCondition($array)
+    {
+        $condition = '';
+        if (!is_null($array)) {
+            foreach ($array as $key => $value) {
+                if (!is_null($value)) {
+                    if ($key == 'owner_id' and $value!= '' and $value!='null' and $value!= '""') {
+                        $condition .= ' and id_owner = ';
+                        $condition .= $value;
+                    }
+                    if($key == 'ids'){
+                        $sql=RejectedAnalyzeOwner::getSqlToIDs($value);
+                        $condition.=$sql;
+                    }
+                    if ($key == 'created_at_start' and !is_null($value) and $value!= "null" and $value!= '""') {
+                        $value =  str_replace('"','',$value);
+                        $condition .= ' and created_at > "';$condition .= $value;$condition .= '"';
+                    }
+                    if ($key == 'created_at_end' and !is_null($value) and $value!= "null" and $value!= '""') {
+                        $value =  str_replace('"','',$value);
+                        $condition .= ' and created_at < "';$condition .= $value;$condition .= '"';
+                    }
+                }
+            }
+        }
+        $condition .= ' group by id_owner';
+        return $condition;
+    }
+
+    public static function getSqlToIDs($ids):string
+    {
+        $sql = '';
+        if(!is_null($ids) && $ids !='' ) {
+            $ids = str_replace('[','(',$ids);
+            $ids = str_replace(']',')',$ids);
+            $ids = str_replace('"','',$ids);
+            $sql = $sql.' and id_owner in '.$ids;
+        }
+        return $sql;
+    }
+
+    // 返回sql    zengjun
+    public static  function getQuerySQL($array= null){
+        $condition = RejectedAnalyzeOwner::getCondition($array);// 条件
+        $sql = 'select distinct rao.id_owner,owners.name,sum(bounce_amount) bounce_amount,sum(check_amount) check_amount,sum(in_storage_count) in_storage_count from';
+        $sql .= '(';
+        // 退件单数
+        $sql .= ' select  distinct id_owner,count(1) bounce_amount,0 check_amount,0 in_storage_count from rejected_bills  where 1=1 ';
+        $sql .= $condition;
+        $sql .= ' UNION ';
+        // 审核单数
+        $sql .= ' select  distinct id_owner,0 bounce_amount,count(1) check_amount,0 in_storage_count from rejected_bills where is_checked = 1 ';
+        $sql .= $condition;
+        $sql .= ' UNION ';
+        // 入库单数
+        $sql .= ' select  distinct id_owner,0 bounce_amount,0 check_amount,count(1) in_storage_count from rejected_bills  where is_loaded = 1 ';
+        $sql .= $condition;
+        $sql .= ') rao ';
+
+        $sql .= ' left join owners on owners.id = rao.id_owner ';
+        $sql .= ' group by rao.id_owner ';
+        return  $sql;
+    }
+
+
+}

+ 1 - 1
app/RejectedBill.php

@@ -22,7 +22,7 @@ class RejectedBill extends Model
     protected $fillable=['id_owner','order_number','sender','mobile_sender',
         'logistic_number','logistic_number_return','id_logistic_return',
         'is_loaded','fee_collected','remark','id_operator','is_checked'
-        ,'is_finished','checked_numbers','remark'];
+        ,'is_finished','checked_numbers','remark','common_01','common_02'];
 
     protected $appends = ['owner_name','logistic_name','created_at_short'
         ,'is_loaded_str','goods_amount','is_loaded_null','operator_name'];

+ 3 - 3
app/UserDetail.php

@@ -27,11 +27,11 @@ class UserDetail extends Model
     public function userDutyChecks(){
         return $this->hasMany('App\UserDutyCheck','user_id','user_id');
     }
-
-
     public function getUserLaborCompanyAttribute()
     {
-        return $this['user_labor'] ?$this['user_labor']['company'] : null;
+        $laborCompanyId=$this['user_labor']['labor_company_id']??0;
+        $laborCompany=LaborCompany::find($laborCompanyId);
+        return $this['user_labor_company']=$laborCompany['name'];
     }
 
 

+ 9 - 1
app/UserDutyCheck.php

@@ -7,15 +7,23 @@ use App\Traits\ModelTimeFormat;
 
 class UserDutyCheck extends Model
 {
+
     use ModelTimeFormat;
     public $timestamps=false;
 
     protected $fillable=[
-        'user_id','checked_at','confirmed_by','type','source'
+        'user_id','checked_at','confirmed_by','type','source','workgroup_id'
     ];
 
     public function userDetail(){
         return $this->belongsTo('App\UserDetail','user_id','user_id');
     }
 
+    public function userLabor(){
+        return $this->belongsTo('App\UserLabor','user_id','user_id');
+    }
+    public function userWorkgroup(){
+        return $this->belongsTo('App\UserWorkgroup','workgroup_id','id');
+    }
+
 }

+ 4 - 1
app/UserLabor.php

@@ -13,11 +13,14 @@ class UserLabor extends Model
     public $timestamps=false;
 
     protected $fillable=[
-        'user_id','default_hour_price','company'
+        'user_id','default_hour_price','labor_company_id'
     ];
 
     public function userDetail(){
         return $this->belongsTo('App\UserDetail','user_id','user_id');
     }
+    public  function laborCompany(){
+        return $this->belongsTo('App\LaborCompany');
+    }
 
 }

+ 5 - 1
app/UserWorkgroup.php

@@ -7,9 +7,13 @@ use Illuminate\Database\Eloquent\Model;
 class UserWorkgroup extends Model
 {
     protected $table="user_workgroups";
-    protected $fillable=['name'];
+    protected $fillable=['name','warehouse_id'];
 
     public function users(){
         return $this->belongsToMany('App\User','user_workgroup_user','user_workgroup_id','user_id');
     }
+    public  function wareHouse(){
+        return $this->belongsTo('App\Warehouse','warehouse_id','id');
+    }
+
 }

+ 4 - 0
app/Warehouse.php

@@ -9,4 +9,8 @@ class Warehouse extends Model
 {
     use ModelTimeFormat;
     protected $fillable=['name','code'];
+
+    public function userWorkgroups(){
+        return $this->hasMany('App\UserWorkgroup');
+    }
 }

+ 10 - 12
bootstrap/cache/services.php

@@ -36,12 +36,11 @@
     32 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
     33 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
     34 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    35 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    36 => 'App\\Providers\\AppServiceProvider',
-    37 => 'App\\Providers\\AuthServiceProvider',
-    38 => 'App\\Providers\\BroadcastServiceProvider',
-    39 => 'App\\Providers\\EventServiceProvider',
-    40 => 'App\\Providers\\RouteServiceProvider',
+    35 => 'App\\Providers\\AppServiceProvider',
+    36 => 'App\\Providers\\AuthServiceProvider',
+    37 => 'App\\Providers\\BroadcastServiceProvider',
+    38 => 'App\\Providers\\EventServiceProvider',
+    39 => 'App\\Providers\\RouteServiceProvider',
   ),
   'eager' => 
   array (
@@ -67,12 +66,11 @@
     19 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
     20 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
     21 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    22 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    23 => 'App\\Providers\\AppServiceProvider',
-    24 => 'App\\Providers\\AuthServiceProvider',
-    25 => 'App\\Providers\\BroadcastServiceProvider',
-    26 => 'App\\Providers\\EventServiceProvider',
-    27 => 'App\\Providers\\RouteServiceProvider',
+    22 => 'App\\Providers\\AppServiceProvider',
+    23 => 'App\\Providers\\AuthServiceProvider',
+    24 => 'App\\Providers\\BroadcastServiceProvider',
+    25 => 'App\\Providers\\EventServiceProvider',
+    26 => 'App\\Providers\\RouteServiceProvider',
   ),
   'deferred' => 
   array (

Diff do ficheiro suprimidas por serem muito extensas
+ 282 - 139
composer.lock


+ 0 - 1
config/app.php

@@ -161,7 +161,6 @@ return [
         Illuminate\Translation\TranslationServiceProvider::class,
         Illuminate\Validation\ValidationServiceProvider::class,
         Illuminate\View\ViewServiceProvider::class,
-        Yajra\Oci8\Oci8ServiceProvider::class,
 
         /*
          * Package Service Providers...

+ 1 - 1
config/hr.php

@@ -3,5 +3,5 @@
 return [
 
     'qrCode_refresh_everyday' =>false,
-
+    'qrCode_refresh'=>60,
 ];

+ 2 - 0
config/logging.php

@@ -5,6 +5,8 @@ use Monolog\Handler\SyslogUdpHandler;
 
 return [
 
+
+    'expire_duration'=>'150', //天数,日志超过时长的就在服务中删除
     /*
     |--------------------------------------------------------------------------
     | Default Log Channel

+ 1 - 1
config/users.php

@@ -3,7 +3,7 @@
 return [
 
 
-    'superAdmin' => ['ldaaww','baoshi56','zhouyaping','shiyao','zhouzhendong','胡浩','阿珺'],
+    'superAdmin' => ['ldaaww','baoshi56','zhouyaping','shiyao','zhouzhendong','胡浩','zengjun','阿珺'],
     'token_expire_minutes'=>7200,
     'token_check_in_expire_minutes'=>7200, //打卡过期时间,单位为分钟
 ];

+ 12 - 0
database/factories/CustomFieldFactory.php

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

+ 1 - 1
database/migrations/2019_11_22_094253_create_cities_table.php

@@ -329,7 +329,7 @@ class CreateCitiesTable extends Migration
             }
             if ($provinces[$i]=="上海"){
                 $province=\App\Province::where('name','=',$provinces[$i])->first();
-                for ($j=0;$j<count($Hainan);$j++){
+                for ($j=0;$j<count($ShangHai);$j++){
                     \App\City::create([
                         'province_id'=>$province->id,
                         'name'=>$ShangHai[$j],

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

@@ -15,7 +15,7 @@ class CreateWarehousesTable extends Migration
     {
         Schema::create('warehouses', function (Blueprint $table) {
             $table->bigIncrements('id');
-            $table->string('name')->index();
+            $table->string('name')->unique();
             $table->string('code')->unique();
             $table->timestamps();
         });

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

@@ -18,7 +18,7 @@ class CreateUserDutyChecksTable extends Migration
         Schema::create('user_duty_checks', function (Blueprint $table) {
             $table->bigIncrements('id');
             $table->bigInteger('user_id')->index()->comment('外键用户');
-            $table->timestamp('checked_at')->index()->comment('打卡时间');
+            $table->timestamp('checked_at')->index()->comment('打卡时间')->default(null);
             $table->bigInteger('verify_user_id')->nullable()->comment('外键用户(确认人)');
             $table->enum('type',['无','登出','登入'])->default('无')->comment('打卡类型');
             $table->enum('source',['正常','补入'])->default('正常')->comment('来源');

+ 44 - 0
database/migrations/2020_05_22_114410_create_labor_reports_table.php

@@ -0,0 +1,44 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateLaborReportsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('labor_reports', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string('enter_number')->index()->comment('进场编号');
+            $table->bigInteger('user_workgroup_id')->index()->comment('外键用户组');
+            $table->bigInteger('user_id')->index()->comment('外键用户');
+            $table->string('name')->index()->comment('临时工名称');
+            $table->string('mobile_phone')->nullable()->index()->comment('手机号');
+            $table->string('identity_number')->nullable()->index()->comment('身份证号');
+            $table->string('labor_company')->nullable()->comment('劳务所');
+            $table->timestamp('check_in_at')->nullable()->comment('打卡时间');
+            $table->timestamp('verify_at')->nullable()->comment('审核时间');
+            $table->bigInteger('group_user_id')->nullable()->index()->comment('审核人id');
+            $table->timestamp('check_out_at')->nullable()->comment('退场时间');
+            $table->decimal('online_duration')->nullable()->comment('在线时长(小时数)');
+            $table->decimal('working_duration')->nullable()->comment('工作时长(小时数)');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('labor_reports');
+    }
+}

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

@@ -0,0 +1,33 @@
+<?php
+use App\LaborCompany;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateLaborCompaniesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('labor_companies', function (Blueprint $table) {
+            $table->bigIncrements('id')->comment('劳务所id');
+            $table->string('name')->unique()->nullable()->comment('劳务所名称');
+            $table->timestamps();
+        });
+        (new LaborCompany(['name'=>'其他']))->save();
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('labor_companies');
+    }
+}

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

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeUserLaborsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+
+        Schema::dropIfExists('user_labors');
+        Schema::create('user_labors', function (Blueprint $table) {
+            $table->bigInteger('user_id')->index()->comment('外键用户');
+            $table->decimal('default_hour_price')->nullable()->comment('默认计时工资');
+            $table->bigInteger('labor_company_id')->nullable()->index()->comment('外键劳务所');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+        Schema::dropIfExists('user_labors');
+    }
+}

+ 49 - 0
database/migrations/2020_05_25_091228_add_labor_company_authority.php

@@ -0,0 +1,49 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddLaborCompanyAuthority extends Migration
+{
+
+    protected $authNames=[
+
+        '人事管理-临时工报表',
+        '劳务所',
+        '劳务所-查询',
+        '劳务所-编辑',
+        '劳务所-录入',
+        '劳务所-删除',
+        '仓库',
+        '仓库-查询',
+        '仓库-编辑',
+        '仓库-录入',
+        '仓库-删除',
+    ];
+
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        foreach ($this->authNames as $name){
+            if(!Authority::where('name',$name)->first())(new Authority(['name'=>$name,'alias_name'=>$name]))->save();
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        foreach ($this->authNames as $name){
+            Authority::where('name',$name)->delete();
+        }
+    }
+}

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

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeUserWorkgroup extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('user_workgroups', function (Blueprint $table) {
+            $table->bigInteger('warehouse_id')->comment('外键到工作组');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+        Schema::table('user_workgroups', function (Blueprint $table) {
+            $table->dropColumn('warehouse_id');
+        });
+    }
+}

+ 32 - 0
database/migrations/2020_06_02_130804_change_user_duty_check.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeUserDutyCheck extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('user_duty_checks', function (Blueprint $table) {
+            $table->bigInteger('workgroup_id')->comment('外键到工作组');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('user_duty_checks', function (Blueprint $table) {
+            $table->dropColumn('workgroup_id');
+        });
+    }
+}

+ 37 - 0
database/migrations/2020_06_08_132835_change_user_detail.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeUserDetail extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::dropIfExists('user_details');
+        Schema::create('user_details', function (Blueprint $table) {
+            $table->bigInteger('user_id')->unique()->comment('外键用户');
+            $table->string('full_name')->nullable()->comment('全名');
+            $table->enum('gender',['未知','男','女'])->nullable()->comment('性别');
+            $table->string('identity_number')->nullable()->unique()->comment('身份证号');
+            $table->string('mobile_phone')->nullable()->index()->comment('手机号');
+            $table->enum('type',['无','员工','临时工','客户'])->default('无')->comment('类型');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('user_details');
+    }
+}

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

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeRejectedBillsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     * rejected_bills表 is_loaded,is_checked 字段添加索引
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('rejected_bills',function (Blueprint $table){
+            $table->index('is_loaded');
+            $table->index('is_checked');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+        Schema::table('rejected_bills',function (Blueprint $table){
+            $table->dropIndex('is_loaded');
+            $table->dropIndex('is_checked');
+        });
+    }
+}

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

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeRejectedBillsAddCustomFields extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('rejected_bills', function (Blueprint $table) {
+            $table->string('common_01')->nullable()->comment('额外定义通用字段,见定义自段表');
+            $table->string('common_02')->nullable()->comment('额外定义通用字段,见定义自段表');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('authorities',function (Blueprint $table){
+            $table->string('common_01')->delete();
+            $table->string('common_02')->delete();
+        });
+    }
+}

+ 43 - 0
database/migrations/2020_06_12_135840_create_custom_fields_table.php

@@ -0,0 +1,43 @@
+<?php
+
+use App\Authority;
+use App\CustomField;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateCustomFieldsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('custom_fields', function (Blueprint $table) {
+            $table->id();
+            $table->string('table')->index()->comment('定义目标的表');
+            $table->string('field')->index()->comment('定义目标表的字段');
+            $table->string('present_name')->index()->comment('所呈现的字段名');
+            $table->string('authority_id')->comment('对应的权限');
+            $table->string('condition_field')->nullable()->comment('条件字段,用来作为定义该字段权限和显示名的依据');
+            $table->string('condition_value')->nullable()->comment('条件字段值,用来作为定义该字段权限和显示名的依据');
+            $table->timestamps();
+        });
+        if(!Authority::where('name','退货管理-查询-客户定义-爱奇艺')->first())(new Authority(['name'=>'退货管理-查询-客户定义-爱奇艺','alias_name'=>'退货管理-查询-客户定义-爱奇艺']))->save();
+        $authority=Authority::where('name','退货管理-查询-客户定义-爱奇艺')->first();
+        CustomField::create(['table'=>'rejected_bills','field'=>'common_01','present_name'=>'寄件方省','authority_id'=>$authority['id'],'condition_field'=>'id_owner','condition_value'=>'66']);
+        CustomField::create(['table'=>'rejected_bills','field'=>'common_02','present_name'=>'退件重量','authority_id'=>$authority['id'],'condition_field'=>'id_owner','condition_value'=>'66']);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('custom_fields');
+    }
+}

+ 32 - 0
database/migrations/2020_06_17_162321_change_onwer_add_deleted_at.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOnwerAddDeletedAt extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('owners', function (Blueprint $table) {
+            $table->timestamp('deleted_at')->nullable()->index()->comment('货主停用时间');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('owners',function (Blueprint $table){
+            $table->timestamp('deleted_at')->delete();
+        });
+    }
+}

+ 16 - 0
database/seeds/CustomFieldSeeder.php

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

+ 3 - 0
laravel-echo-server.lock

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

Diff do ficheiro suprimidas por serem muito extensas
+ 610 - 426
package-lock.json


+ 14 - 13
package.json

@@ -10,23 +10,24 @@
     "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
   },
   "devDependencies": {
-    "axios": "^0.19",
-    "bootstrap": "^4.1.0",
-    "cross-env": "^5.1",
+    "axios": "^0.19.2",
+    "bootstrap": "^4.5.0",
+    "cross-env": "^5.2.1",
     "font-awesome": "^4.7.0",
-    "jquery": "^3.2",
-    "laravel-mix": "^4.0.7",
-    "lodash": "^4.17.5",
-    "popper.js": "^1.12",
+    "jquery": "^3.5.1",
+    "laravel-mix": "^4.1.4",
+    "lodash": "^4.17.15",
+    "popper.js": "^1.16.1",
     "resolve-url-loader": "^2.3.1",
-    "sass": "^1.15.2",
-    "sass-loader": "^7.1.0",
-    "vue": "^2.5.17",
-    "vue-template-compiler": "^2.6.10"
+    "sass": "^1.26.7",
+    "sass-loader": "^7.3.1",
+    "vue": "^2.6.11",
+    "vue-template-compiler": "^2.6.11"
   },
   "dependencies": {
-    "js-cookie": "^2.2.0",
-    "laravel-echo": "^1.6.1",
+    "js-cookie": "^2.2.1",
+    "laravel-echo": "^1.8.0",
+    "laravel-echo-server": "^1.6.2",
     "pusher-js": "^5.1.1",
     "socket.io-client": "^2.3.0"
   },

BIN
public/images/QRCodeIMG/1.png


BIN
public/images/QRCodeIMG/10.png


BIN
public/images/QRCodeIMG/2.png


BIN
public/images/QRCodeIMG/3.png


BIN
public/images/QRCodeIMG/4.png


BIN
public/images/QRCodeIMG/5.png


Diff do ficheiro suprimidas por serem muito extensas
+ 342 - 216
public/js/app.js


+ 3 - 0
resources/js/singles/rejectedIndex.js

@@ -339,6 +339,8 @@ let vueList=new Vue({
                 }
                 form=$('<form action=\"'+exportExcelURL+'\" method="post" target="_blank"></form>');
                 form.append('<input type="hidden" name="ids" value=\''+JSON.stringify(_this.rejectedBills_checkBoxes)+'\'/>');
+                form.append('<input type="hidden" name="created_at_start" value=\''+JSON.stringify(_this.created_at_start)+'\'/>');
+                form.append('<input type="hidden" name="created_at_end" value=\''+JSON.stringify(_this.created_at_end)+'\'/>');
             }
             if(parseInt(val)===2){
                 if(!confirm("确定要导出当前条件下全部页的结果吗?")){return;}
@@ -347,6 +349,7 @@ let vueList=new Vue({
                 }
                 form=$('<form action=\"'+exportExcelOnFilterParamsURL+'\" method="post" target="_blank"></form>');
                 form.append('<input type="hidden" name="filterParams" value=\''+JSON.stringify(_this.filterParams)+'\'/>');
+
             }
             form.append(csrfInput);
             $('#list').append(form);

+ 396 - 0
resources/js/singles/searchAnalyze.js

@@ -0,0 +1,396 @@
+
+let vueList=new Vue({
+    el:"#list",
+    data:{
+        filterParams:{created_at:'',owner_id:'',
+            //,order_number:'',logistic_number_return:'',mobile_sender:'',barcode_goods:'',
+            //is_checked:'',
+            created_at_start:'',created_at_end:'',
+            //id_quality_label:'',
+            //is_loaded:'',
+            //checked_numbers:'',
+           // paginate:'50'
+        },
+        checkBoxAll:[],
+        rejectedBills:rejectedBills,
+        rejectedBills_checkBoxes:[],
+        owners:owners,
+        qualityLabels:qualityLabels,
+    },
+    mounted:function(){
+        $(".tooltipTarget").tooltip({'trigger':'hover'});
+        this.initInputs();
+        $('#list').removeClass('d-none');
+    },
+    methods:{
+        filterRun:function(){
+            let form=$("<form method='get'></form>");
+            this.filterParams['page']='';
+            for(let key in this.filterParams){
+                if(this.filterParams[key]){
+                    form.append($("<input type='hidden' name='"+key+"' value='"+this.filterParams[key]+"'>"));
+                }
+            }
+            $("body").append(form);
+            form.submit();
+        },
+        searchByFilters:function(e){
+            this.filterRun();
+        },
+        created_at_startChange:function(e){
+            this.filterParams.created_at_start=e.target.value;
+            this.filterRun();
+        },
+        created_at_endChange:function(e){
+            this.filterParams.created_at_end=e.target.value;
+            this.filterRun();
+        },
+        owner_idChange:function(e){
+            this.filterParams.owner_id=e.target.value;
+            this.filterRun();
+        },
+        is_checkedChange:function(e){
+            this.filterParams.is_checked=e.target.value;
+            this.filterRun();
+        },
+        id_quality_labelChange:function(e){
+            this.filterParams.id_quality_label=e.target.value;
+            this.filterRun();
+        },
+        is_loadedChange:function(e){
+            this.filterParams.is_loaded=e.target.value;
+            this.filterRun();
+        },
+        initInputs:function(){
+            let data=this;
+            let uriParts = decodeURI(location.href).split("?");
+            if(uriParts.length>1){
+                let params = uriParts[1].split('&');
+                params.forEach(function(paramPair){
+                    let pair=paramPair.split('=');
+                    let key = pair[0], val = pair[1];
+                    $('input[name="'+key+'"]').val(val);
+                    $('select[name="'+key+'"]').val(val);
+                    data.filterParams[key]=val;
+                });
+            }
+            for(let key in paginateParams){
+                let val = paginateParams[key];
+                $('input[name="'+key+'"]').val(val);
+                $('select[name="'+key+'"]').val(val);
+                data.filterParams[key]=val;
+            }
+
+        },
+        // edit:function(e){
+        //     let id = $(e.target).parents('tr').attr('data-id');
+        //     let editFullUri = editUrl+id+"/edit";
+        //     // location.href = editFullUri;
+        //     let form=$('<form action=\"'+editFullUri+'\" method="post" target="_blank"></form>');
+        //     form.append('<input type="hidden" name="filterParams" value=\''+JSON.stringify(this.filterParams)+'\'/>');
+        //     form.append(csrfInput);
+        //     $('body').append(form);
+        //     form.submit();
+        // },
+        // destroy:function(rejectedBill){
+        //     if(!confirm('确定要删除退货信息“' + rejectedBill.owner.name+':'+rejectedBill.logistic_number_return+ '”吗?')){return;}
+        //     let data=this;
+        //     let url = destroyUrl+rejectedBill.id;
+        //     axios.delete(url,{id:rejectedBill.id})
+        //         .then(function (response) {
+        //             if(response.data.success){
+        //                 for (let i = 0; i < data.rejectedBills.length; i++) {
+        //                     if (data.rejectedBills[i].id===rejectedBill.id){
+        //                         data.rejectedBills.splice(i,1);
+        //                         break;
+        //                     }
+        //                 }
+        //                 tempTip.setDuration(1000);
+        //                 tempTip.showSuccess('删除退货信息"'+rejectedBill.owner.name+':'+rejectedBill.logistic_number_return+'"成功!')
+        //             }else{
+        //                 tempTip.setDuration(1000);
+        //                 tempTip.show('删除退货信息"'+rejectedBill.owner.name+':'+rejectedBill.logistic_number_return+'"失败!')
+        //             }
+        //         })
+        //         .catch(function (err) {
+        //             tempTip.setDuration(3000);
+        //             tempTip.show('删除退货信息失败!'+'网络错误:' + err);
+        //             console.log(err);
+        //         });
+        // },
+        submitFilterOnEnter:function(e){
+            if(e.key==='Enter'){
+                this.filterRun();
+            }
+        },
+        created_at_startEntering:function(e){
+            if(e.key==='Enter'){
+                this.created_at_startChange(e)
+            }
+        },
+        created_at_endEntering:function(e){
+            if(e.key==='Enter'){
+                this.created_at_endChange(e)
+            }
+        },
+        owner_idEntering:function(e){
+            if(e.key==='Enter'){
+                e.target.value=$('#owner_id').val();
+                this.owner_idChange(e);
+                e.target.value='';
+            }
+        },
+        locateOwner:function (e) {
+            str = e.target.value.trim()
+            if (str==='')return ;
+            $("#owner_id option").attr("selected",false);
+            let selectingOption=$("#owner_id").find("option:contains("+str+")").eq(0);
+            selectingOption.attr("selected",true);
+            this.filterParams.owner_id=selectingOption.val();
+        },
+        // mobile_senderEntering:function(e){
+        //     this.filterParams.mobile_sender=e.target.value;
+        //     if(e.key==='Enter'){
+        //         this.filterRun();
+        //     }
+        // },
+        // order_numberEntering:function(e){
+        //     this.filterParams.order_number=e.target.value;
+        //     if(e.key==='Enter'){
+        //         this.filterRun();
+        //     }
+        // },
+        // barcode_goodsEntering:function(e){
+        //     this.filterParams.barcode_goods=e.target.value;
+        //     if(e.key==='Enter'){
+        //         this.filterRun();
+        //     }
+        // },
+        // checked_numbersEntering:function(e){
+        //     this.filterParams.checked_numbers=e.target.value;
+        //     if(e.key==='Enter'){
+        //         this.filterRun();
+        //     }
+        // },
+        logistic_number_returnEntering:function(e){
+            this.filterParams.logistic_number_return=e.target.value;
+            if(e.key==='Enter'){
+                this.filterRun();
+            }
+        },
+        logistic_numberEntering:function(e){
+            this.filterParams.logistic_number=e.target.value;
+            if(e.key==='Enter'){
+                this.filterRun();
+            }
+        },
+        cancelCheckConfirmAll:function(){
+            $('#checkConfirmingAll').tooltip('hide');
+            setTimeout(function () {
+                $(".tooltipTarget").tooltip({'trigger':'hover'})
+            }, 10);
+            this.checkBoxAll=false;
+            this.rejectedBills.forEach(function(rejectedBill){
+                if(rejectedBill.is_checked===-1)
+                    rejectedBill.is_checked='0';
+            })
+        },
+        // setIsLoaded_batch:function(val){
+        //     let _this=this;
+        //     if(_this.rejectedBills_checkBoxes.length===0){
+        //         tempTip.show('没有勾选记录');
+        //         $(e.target).val("");
+        //         return;
+        //     }
+        //     let is_loaded=0;
+        //     let is_loadedLabel='否';
+        //     if(parseInt(val)===1){
+        //         is_loaded=1;
+        //         is_loadedLabel='是';
+        //     }else if(parseInt(val)===2){
+        //         is_loaded=2;
+        //         is_loadedLabel='待推单';
+        //     }else if(parseInt(val)===4){
+        //         is_loaded=4;
+        //         is_loadedLabel='待确认';
+        //     }else if(val==="null"){
+        //         is_loaded='null';
+        //         is_loadedLabel='无需入库';
+        //     }
+        //     if(!confirm("确定要标记所有勾选入库情况为'"+is_loadedLabel+"'吗")){return;}
+        //     axios.post(ajaxCheckUrl,{ids:_this.rejectedBills_checkBoxes,is_loaded:is_loaded}).then(function(response){
+        //         if(response.data.success){
+        //             _this.rejectedBills_checkBoxes.forEach(function(id){
+        //                 _this.rejectedBills.forEach(function(bill){
+        //                     if(bill.id===id){
+        //                         bill.is_loaded=is_loaded;
+        //                     }
+        //                 });
+        //             });
+        //             tempTip.setDuration(1000);
+        //             tempTip.showSuccess('修改勾选记录的入库状态成功');
+        //         }else{
+        //             tempTip.setDuration(2500);
+        //             tempTip.show('修改勾选记录的入库状态失败,错误:'+response.data.fail_info);
+        //         }
+        //     }).catch(function (e) {
+        //         alert('网络连接错误:'+e);
+        //         tempTip.setDuration(2500);
+        //         tempTip.show('审核勾选内容失败,网络连接错误:'+e);
+        //         console.log(e);
+        //     });
+        //     $(e.target).val("")
+        // },
+        checkBoxAllToggle:function(e){
+            let _this=this;
+            if(_this.rejectedBills_checkBoxes.length>=this.rejectedBills.length){
+                _this.rejectedBills_checkBoxes=[];
+                _this.checkBoxAll=[];
+            }
+            else{
+                _this.rejectedBills_checkBoxes=[];
+                this.rejectedBills.forEach(function(bill){
+                    _this.rejectedBills_checkBoxes.push(bill.id);
+                    _this.checkBoxAll=[1];
+                });
+            }
+        },
+        // checkAll:function(){
+        //     let _this=this;
+        //     if(_this.rejectedBills_checkBoxes.length===0){
+        //         tempTip.show('没有勾选记录');
+        //         return
+        //     }
+        //     if(!confirm("确定要标记所有勾选内容为'已审核'吗")){return;}
+        //     axios.post(ajaxCheckAllURL,{ids:_this.rejectedBills_checkBoxes}).then(function(response){
+        //         if(response.data.success){
+        //             response.data.rejecteds.forEach(function (rejected) {
+        //                 _this.rejectedBills.forEach(function(rejectedBill){
+        //                     if(parseInt(rejectedBill.id)===parseInt(rejected.id)){
+        //                         rejectedBill.is_checked=1;
+        //                         rejectedBill.checked_numbers=rejected.checked_numbers;
+        //                     }
+        //                 });
+        //             });
+        //             tempTip.setDuration(1000);
+        //             tempTip.showSuccess('审核勾选内容成功');
+        //         }else{
+        //             tempTip.setDuration(2500);
+        //             tempTip.show('审核勾选内容失败,错误:'+response.data.fail_info);
+        //         }
+        //     }).catch(function (e) {
+        //         alert('网络连接错误:'+e);
+        //         tempTip.setDuration(2500);
+        //         tempTip.show('审核勾选内容失败,网络连接错误:'+e);
+        //         console.log(e);
+        //     })
+        // },
+        // confirmBeStored:function($e,id){
+        //     let _this=this;
+        //     axios.post(ajaxConfirmBeStoredUrl,{id:id}).then(function(response){
+        //         if(response.data.success){
+        //             _this.rejectedBills.forEach(function(rejectedBill){
+        //                 if(rejectedBill.id===id){
+        //                     rejectedBill.is_loaded=1;
+        //                 }
+        //             });
+        //             tempTip.setDuration(1000);
+        //             tempTip.showSuccess('确认入库成功');
+        //         }else{
+        //             tempTip.setDuration(2500);
+        //             tempTip.okWindow('数据异常无法确认!请在WMS确定入库状态后,勾选该条目手动修改相应入库状态!','知道了')
+        //         }
+        //     }).catch(function (e) {
+        //         alert('确认失败,网络连接错误:'+e);
+        //         tempTip.setDuration(2500);
+        //         tempTip.show('确认失败,网络连接错误:'+e);
+        //         console.log(e);
+        //     })
+        // },
+        // finishAll:function(){
+        //     let _this=this;
+        //     if(_this.rejectedBills_checkBoxes.length===0){
+        //         tempTip.show('没有勾选记录');
+        //         return
+        //     }
+        //     if(!confirm("确定要标记所有勾选内容为'已完结'吗")){return;}
+        //     axios.post(ajaxFinishAllUrl,{ids:_this.rejectedBills_checkBoxes}).then(function(response){
+        //         if(response.data.success){
+        //             _this.rejectedBills.forEach(function(rejectedBill){
+        //                 _this.rejectedBills_checkBoxes.forEach(function (checkedId) {
+        //                     if(rejectedBill.id===checkedId){
+        //                         rejectedBill.is_finished=1;
+        //                     }
+        //                 });
+        //             });
+        //             tempTip.setDuration(1000);
+        //             tempTip.showSuccess('标记勾选内容为完结成功');
+        //         }else{
+        //             tempTip.setDuration(2500);
+        //             tempTip.show('标记勾选内容为完结失败,错误:'+response.data.fail_info);
+        //         }
+        //     }).catch(function (e) {
+        //         alert('网络连接错误:'+e);
+        //         tempTip.setDuration(2500);
+        //         tempTip.show('标记勾选内容完结失败,网络连接错误:'+e);
+        //         console.log(e);
+        //     })
+        // },
+        exportExcel:function(val){
+            let _this=this;
+            let form;
+             if(parseInt(val)===1){
+                if(_this.rejectedBills_checkBoxes.length===0){
+                    tempTip.show('没有勾选记录');
+                    return;
+                }
+                form=$('<form action=\"'+exportExcelURL+'\" method="post" target="_blank"></form>');
+                form.append('<input type="hidden" name="ids" value=\''+JSON.stringify(_this.rejectedBills_checkBoxes)+'\'/>');
+            }
+            if(parseInt(val)===2){
+                if(!confirm("确定要导出当前条件下全部页的结果吗?")){return;}
+               /* if(total>100000){
+                    tempTip.okWindow('当前导出记录超过100000条,将不会导出已完结的记录','知道了')
+                }*/
+                form=$('<form action=\"'+exportExcelOnFilterParamsURL+'\" method="post" target="_blank"></form>');
+                form.append('<input type="hidden" name="owner_id" value=\''+JSON.stringify(_this.filterParams.owner_id)+'\'/>');
+            }
+            form.append('<input type="hidden" name="created_at_start" value=\''+JSON.stringify(_this.filterParams.created_at_start)+'\'/>');
+            form.append('<input type="hidden" name="created_at_end" value=\''+JSON.stringify(_this.filterParams.created_at_end)+'\'/>');
+            form.append(csrfInput);
+            $('#list').append(form);
+            form.submit();
+            tempTip.setDuration(5000);
+            tempTip.showSuccess("导出成功,如无结果则是被浏览器拦截新窗口,请尝试再次请求,或关闭浏览器对当前页面的弹出窗口拦截")
+        },
+    },
+    computed:{
+        isBeingFilterConditions:function(){
+            for(let key in this.filterParams){
+                if(this.filterParams[key]){
+                    if(key==='paginate')continue;
+                    if(key==='page')continue;
+                    return true
+                }
+            }
+            return false;
+        }
+    },
+    // filters:{
+    //     yesNo:function (val) {
+    //         if(!val||val===0||val==='0'){return '否'}
+    //         return '是'
+    //     },
+    //     yesNoIsLoaded:function (val) {
+    //         switch(val){
+    //             case 0:case '0':return '否';
+    //             case 1:case '1':return '是';
+    //             case 2:case '2':return '待推单';
+    //             case 3:case '3':return '交互异常';
+    //             case 4:case '4':return '待确认';
+    //             case null:case 'null':return '无需入库';
+    //         }
+    //         return '';
+    //     }
+    // }
+});

+ 1 - 0
resources/lang/cn/validation.php

@@ -116,6 +116,7 @@ return [
     'uploaded' => ':attribute failed to upload.',
     'url' => ':attribute format is invalid.',
     'uuid' => ':attribute must be a valid UUID.',
+    'identity_cards' => ':attribute 身份证号错误',
 
     /*
     |--------------------------------------------------------------------------

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

@@ -28,7 +28,7 @@
                     <select v-model="filterData.range" name="range" @change="submit" title="查询内容的日期范围" class="form-control form-control-sm tooltipTarget m-2">
                         <option value="1">近一天</option>
                         <option value="3">近三天</option>
-                        <option value="7">近七天</option>
+                        <option value="7" selected>近七天</option>
                         <option value="30">近三十天</option>
                     </select></div>
                 </td>

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

@@ -14,7 +14,7 @@
 </head>
 <body>
 <div id="app">
-    <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
+    <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm" style="padding: 0;height: 50px" >
         <div class="container-fluid">
             <a class="navbar-brand" href="{{ url('/') }}" title="宝时 Warehouse Assistance System" style="vertical-align: text-bottom">
                 <img src="{{asset('icon/logo100b.png')}}" alt="宝时 Warehouse Assistance System" height="30" >

+ 15 - 15
resources/views/layouts/menu.blade.php

@@ -1,8 +1,8 @@
-<div class="collapse navbar-collapse" id="navbarSupportedContent">
+<div class="collapse navbar-collapse" id="navbarSupportedContent" style="height: 50px">
     <!-- Left Side Of Navbar -->
-    <ul class="navbar-nav mr-auto nav-tabs nav font-weight-bold" id="nav1">
+    <ul class="navbar-nav mr-auto nav-tabs nav font-weight-bold" id="nav1" style="padding-top: 10px">
         @can('退货管理')
-            <li class="nav-item"><a href="{{url("rejected/")}}" class="nav-link"
+            <li class="nav-item"><a href="{{url("rejected/index/general")}}" class="nav-link"
                                     :class="{active:isActive('rejected',1)}">
                     <span class="fa fa-recycle" style="color: #721b6e"></span>
                     退货管理</a></li> @endcan
@@ -41,16 +41,16 @@
                                     :class="{active:isActive('personnel',1)}">
                     <span class="fa fa-header" style="color: #72441b"></span>
                     人事管理</a></li> @endcan
-
-        <li class="nav-item"><a href="{{url("client/base")}}" class="nav-link"
-                                :class="{active:isActive('client',1)}">
-                <span class="fa fa-address-book-o" style="color: #72441b"></span>
-                客户管理</a></li>
+        @can('客户管理')
+            <li class="nav-item"><a href="{{url("client/base")}}" class="nav-link"
+                                    :class="{active:isActive('client',1)}">
+                    <span class="fa fa-address-book-o" style="color: #72441b"></span>
+                    客户管理</a></li> @endcan
         @can('基础设置')
-        <li class="nav-item"><a href="{{url("maintenance/")}}" class="nav-link"
-                                :class="{active:isActive('maintenance',1)}">
-                <span class="fa fa-server"></span>
-                基础设置</a></li> @endcan
+            <li class="nav-item"><a href="{{url("maintenance/")}}" class="nav-link"
+                                    :class="{active:isActive('maintenance',1)}">
+                    <span class="fa fa-server"></span>
+                    基础设置</a></li> @endcan
     </ul>
 
     <!-- Right Side Of Navbar -->
@@ -62,9 +62,9 @@
             </li>
         @else
 
-{{--            <li class="nav-item">--}}
-{{--                <a class="nav-link" href="{{ route('register') }}">注册</a>--}}
-{{--            </li>--}}
+            {{--            <li class="nav-item">--}}
+            {{--                <a class="nav-link" href="{{ route('register') }}">注册</a>--}}
+            {{--            </li>--}}
             <li class="nav-item dropdown">
                 <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                     {{ Auth::user()->name }} <span class="caret"></span>

+ 38 - 0
resources/views/maintenance/laborCompany/create.blade.php

@@ -0,0 +1,38 @@
+@extends('layouts.app')
+@section('title')创建劳务所@endsection
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.laborCompany.menu')@endcomponent
+    </div>
+    <div class="container-fluid">
+        <div class="card col-md-8 offset-md-2">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <form method="POST" action="{{ url('maintenance/laborCompany') }}">
+                    @csrf
+                    <div class="form-group row">
+                        <label for="name" class="col-2 col-form-label text-right">劳务所名称</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('name') is-invalid @enderror"
+                                   name="name" autocomplete="off" value="{{ old('name') }}" required>
+                            @error('name')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-success form-control">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection

+ 44 - 0
resources/views/maintenance/laborCompany/edit.blade.php

@@ -0,0 +1,44 @@
+@extends('layouts.app')
+@section('title')编辑劳务所@endsection
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')
+        @endcomponent
+        @component('maintenance.laborCompany.menu')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
+                </li>
+        @endcomponent
+    </div>
+    <div class="container-fluid">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}!</div>
+                @endif
+                <form method="POST" action='{{url("maintenance/laborCompany/{$laborCompany->id}")}}'>
+                    @csrf
+                    @method('PUT')
+                    <div class="form-group row">
+                        <label for="name" class="col-2 col-form-label text-right">劳务所名称</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('name') is-invalid @enderror"
+                                   name="name" autocomplete="off" value="@if(old('name')){{old('name')}}@else{{$laborCompany->name}}@endif" required>
+                            @error('name')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-outline-dark form-control">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection

+ 83 - 0
resources/views/maintenance/laborCompany/index.blade.php

@@ -0,0 +1,83 @@
+@extends('layouts.app')
+@section('title')劳务所@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.laborCompany.menu')@endcomponent
+    </span>
+    <div class="container-fluid">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <table class="table table-striped table-sm" id="list">
+                    <tr>
+                        <th>ID</th>
+                        <th>劳务所名</th>
+                        <th>创建时间</th>
+                        <th>操作</th>
+                    </tr>
+                    <tr v-for="laborCompany in laborCompanys">
+                        <td class="text-muted">@{{laborCompany.id}}</td>
+                        <td>@{{laborCompany.name}}</td>
+                        <td class="text-muted">@{{laborCompany.created_at}}</td>
+                        <td>
+                            @can('劳务所-编辑')
+                            <button class="btn btn-sm btn-outline-primary" @click="edit(laborCompany.id)">改</button> @endcan
+                            @can('劳务所-删除')
+                            <button class="btn btn-sm btn-outline-dark" @click="destroy(laborCompany)">删</button> @endcan
+                        </td>
+                    </tr>
+                </table>
+                {{$laborCompanys->links()}}
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                laborCompanys:[
+                    @foreach( $laborCompanys as $laborCompany )
+                    {id:'{{$laborCompany->id}}',name:'{{$laborCompany->name}}',created_at:'{{$laborCompany->created_at}}'},
+                    @endforeach
+                ],
+            },
+            methods:{
+                edit:function(id){
+                    location.href = "{{url('maintenance/laborCompany')}}/"+id+"/edit";
+                },
+                destroy:function(laborCompany){
+                    if(!confirm('确定要删除劳务所“' + laborCompany.name + '”吗?')){return};
+                    let data=this;
+                    let url = "{{url('maintenance/laborCompany')}}/"+laborCompany.id;
+                    axios.delete(url,{id:laborCompany.id})
+                        .then(function (response) {
+                            if(response.data.success){
+                                for (let i = 0; i < data.laborCompanys.length; i++) {
+                                    if (data.laborCompanys[i].id===laborCompany.id){
+                                        data.laborCompanys.splice(i,1);
+                                        break;
+                                    }
+                                }
+                                tempTip.setDuration(1000);
+                                tempTip.showSuccess('删除劳务所"'+laborCompany.name+'"成功!')
+                            }else{
+                                tempTip.setDuration(1000);
+                                tempTip.show('删除劳务所"'+laborCompany.name+'"失败!')
+                            }
+                        })
+                        .catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('删除物流公司失败!'+'网络错误:' + err)
+                        });
+                },
+            }
+        });
+    </script>
+@endsection

+ 16 - 0
resources/views/maintenance/laborCompany/menu.blade.php

@@ -0,0 +1,16 @@
+
+<div class="container-fluid nav3">
+    <div class="card" >
+        <ul class="nav nav-pills">
+            @can('劳务所-查询')
+            <li class="nav-item">
+                <a class="nav-link" href="{{url('maintenance/laborCompany')}}" :class="{active:isActive('',3)}">查询</a>
+            </li> @endcan
+            @can('劳务所-录入')
+            <li class="nav-item">
+                <a class="nav-link" href="{{url('maintenance/laborCompany/create')}}" :class="{active:isActive('create',3)}">录入</a>
+            </li> @endcan
+            {{$slot}}
+        </ul>
+    </div>
+</div>

+ 8 - 0
resources/views/maintenance/menu.blade.php

@@ -18,6 +18,10 @@
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('maintenance/userWorkgroup')}}" :class="{active:isActive('userWorkgroup',2)}">工作组</a>
                 </li> @endcan
+            @can('仓库')
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/warehouse')}}" :class="{active:isActive('warehouse',2)}">仓库</a>
+                </li> @endcan
             @can('货主')
                 <li class="nav-item">
                     <a class="nav-link text-dark" href="{{url('maintenance/owner')}}" :class="{active:isActive('owner',2)}">货主</a>
@@ -80,6 +84,10 @@
                 <li class="nav-item">
                     <a class="nav-link text-muted" href="{{url('maintenance/userLabor')}}" :class="{active:isActive('userLabor',2)}">临时工</a>
                 </li> @endcan
+            @can('劳务所')
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/laborCompany')}}" :class="{active:isActive('laborCompany',2)}">劳务所</a>
+                </li> @endcan
             @can('日志')
                 <li class="nav-item">
                     <a class="nav-link text-muted" href="{{url('maintenance/log')}}" :class="{active:isActive('log',2)}">日志</a>

+ 6 - 6
resources/views/maintenance/owner/index.blade.php

@@ -28,8 +28,8 @@
                         <td>
                             @can('货主-编辑')
                             <button class="btn btn-sm btn-outline-primary" @click="edit(owner.id)">改</button> @endcan
-{{--                            @can('货主-删除')--}}
-{{--                            <button class="btn btn-sm btn-outline-dark" @click="destroy(owner)">删</button> @endcan--}}
+                            @can('货主-删除')
+                            <button class="btn btn-sm btn-outline-danger" @click="destroy(owner)">停用</button> @endcan
                         </td>
                     </tr>
                 </table>
@@ -55,7 +55,7 @@
                     location.href = "{{url('maintenance/owner')}}/"+id+"/edit";
                 },
                 destroy:function(owner){
-                    confirm('确定要删除货主“' + owner.name + '”吗?');
+                    confirm('确定要停用货主“' + owner.name + '”吗?');
                     let data=this;
                     let url = "{{url('maintenance/owner')}}/"+owner.id;
                     axios.delete(url,{id:owner.id})
@@ -68,15 +68,15 @@
                                     }
                                 }
                                 tempTip.setDuration(1000);
-                                tempTip.showSuccess('删除货主"'+owner.name+'"成功!')
+                                tempTip.showSuccess('停用货主"'+owner.name+'"成功!')
                             }else{
                                 tempTip.setDuration(1000);
-                                tempTip.show('删除货主"'+owner.name+'"失败!')
+                                tempTip.show('停用货主"'+owner.name+'"失败!')
                             }
                         })
                         .catch(function (err) {
                             tempTip.setDuration(3000);
-                            tempTip.show('删除货主失败!'+'网络错误:' + err);
+                            tempTip.show('停用货主失败!'+'网络错误:' + err);
                         });
                 },
             }

+ 10 - 7
resources/views/maintenance/owner/menu.blade.php

@@ -3,14 +3,17 @@
     <div class="card" >
         <ul class="nav nav-pills">
             @can('货主-查询')
-            <li class="nav-item">
-                <a class="nav-link" href="{{url('maintenance/owner')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
+                <li class="nav-item">
+                    <a class="nav-link" href="{{url('maintenance/owner')}}" :class="{active:isActive('',3)}">查询</a>
+                </li> @endcan
             @can('货主-录入')
-            <li class="nav-item">
-                <a class="nav-link" href="{{url('maintenance/owner/create')}}"  :class="{active:isActive('create',3)}">录入</a>
-            </li> @endcan
-            {{$slot}}
+                <li class="nav-item">
+                    <a class="nav-link" href="{{url('maintenance/owner/create')}}"  :class="{active:isActive('create',3)}">录入</a>
+                </li> @endcan
+            @can('货主-删除')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{url('maintenance/owners/recycle')}}" :class="{active:isActive('recycle',3)}">停用</a>
+                </li> @endcan
         </ul>
     </div>
 </div>

+ 74 - 0
resources/views/maintenance/owner/recycle.blade.php

@@ -0,0 +1,74 @@
+@extends('layouts.app')
+@section('title')停运货主@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.owner.menu')@endcomponent
+    </span>
+    <div class="container-fluid">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <table class="table table-striped table-sm table-hover" id="list">
+                    <tr>
+                        <th>ID</th>
+                        <th>货主编码</th>
+                        <th>货主名</th>
+                        <th>创建时间</th>
+                        <th>操作</th>
+                    </tr>
+                    <tr v-for="owner in owners">
+                        <td class="text-muted">@{{owner.id}}</td>
+                        <td>@{{owner.code}}</td>
+                        <td>@{{owner.name}}</td>
+                        <td class="text-muted">@{{owner.created_at}}</td>
+                        <td>
+                            @can('货主-删除')
+                                <button class="btn btn-sm btn-outline-danger" @click="restoreSelected(owner)">恢复</button> @endcan
+                        </td>
+                    </tr>
+                </table>
+                {{$owners->links()}}
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                owners:[
+                        @foreach( $owners as $owner )
+                    {id:'{{$owner->id}}',code:'{{$owner->code}}',name:'{{$owner->name}}',created_at:'{{$owner->created_at}}'},
+                    @endforeach
+                ],
+            },
+            methods:{
+                restoreSelected:function(owner){
+                    let _this=this;
+                    confirm('确定要恢复停用货主“' + owner.name + '”吗?');
+                    let ajaxUrl='{{url("apiLocal/owner/restoreSelected")}}';
+                    axios.post(ajaxUrl,{id:owner.id}).then(function(response){
+                        if(response.data.success){
+                            tempTip.setDuration(1000);
+                            tempTip.showSuccess('恢复货主'+owner.name+'成功');
+                            window.location.reload();
+                        }else{
+                            tempTip.setDuration(2500);
+                            tempTip.show('恢复货主失败,错误:'+response.data.fail_info);
+                        }
+                    }).catch(function (e) {
+                        alert('网络连接错误:'+e);
+                        tempTip.setDuration(2500);
+                        tempTip.show('恢复货主失败,网络连接错误:'+e);
+                    })
+                },
+            }
+        });
+    </script>
+@endsection

+ 29 - 19
resources/views/maintenance/userLabor/edit.blade.php

@@ -66,16 +66,20 @@
                     @enderror
                 </div>
                 <div class="form-group row">
-                    <label for="company" class="form-check-label col-3 pull-left">劳务所:</label>
-                    <input name="company" :value="userLabor.company" id="company" class="@error('company') is-invalid @enderror col-7 form-control" type="text">
-                    @error('company')
+                    <label for="name" class="form-check-label col-3 pull-left">劳务所:</label>
+{{--                    <input name="id" :value="userLabor.laborCompanyName" id="id" class="@error('id') is-invalid @enderror col-7 form-control" type="text">--}}
+                    <select name="name" id="name" class="@error('name') is-invalid @enderror col-7 form-control" type="text" >
+                        <option selected>@{{ userLabor.laborCompanyName }}</option>
+                        <option v-for="laborCompany in laborCompanies" >@{{ laborCompany.name }}</option>
+                    </select>
+                    @error('name')
                     <span class="invalid-feedback col-7 offset-3 mt-0" role="alert">
-                    <strong>{{ $errors->first('company') }}</strong>
+                    <strong>{{ $errors->first('name') }}</strong>
                     </span>
                     @enderror
                 </div>
                 <div class="form-group row pt-3">
-                    <button type="submit" class="col-7 offset-2 btn btn-success">提交更改</button>
+                    <button type="submit" class="col-7 offset-3 btn btn-success">提交更改</button>
                 </div>
             </form>
         </div>
@@ -83,17 +87,23 @@
 @endsection
 
 @section('lastScript')
-<script>
-    new Vue({
-        el:"#edit",
-        data:{
-            userLabor:{full_name:"{{old('full_name')??$userLabor->userDetail->full_name}}",
-                mobile_phone:'{{old('mobile_phone')??$userLabor->userDetail->mobile_phone}}',
-                gender:'{{old('gender')??$userLabor->userDetail->gender}}',
-                identity_number:'{{old('identity_number')??$userLabor->userDetail->identity_number}}',
-                default_hour_price:'{{old('default_hour_price')??$userLabor->default_hour_price}}',
-                company:'{{old('company')??$userLabor->company}}'},
-        },
-    });
-</script>
-@endsection
+    <script>
+        new Vue({
+            el:"#edit",
+            data:{
+                userLabor:{full_name:"{{old('full_name')??$userLabor->userDetail->full_name}}",
+                    mobile_phone:'{{old('mobile_phone')??$userLabor->userDetail->mobile_phone}}',
+                    gender:'{{old('gender')??$userLabor->userDetail->gender}}',
+                    identity_number:'{{old('identity_number')??$userLabor->userDetail->identity_number}}',
+                    default_hour_price:'{{old('default_hour_price')??$userLabor->default_hour_price}}',
+                    laborCompanyName:'{{old('name')??$userLabor->laborCompany->name}}'},
+                laborCompanies:[
+                        @foreach( $laborCompanies as $laborCompany )
+                        {id:'{{$laborCompany->id}}',name:'{{$laborCompany->name}}',},
+                        @endforeach
+                ],
+
+            },
+        });
+    </script>
+@endsection

+ 1 - 1
resources/views/maintenance/userLabor/show.blade.php

@@ -31,7 +31,7 @@
                     </tr>
                     <tr>
                         <td>劳务所</td>
-                        <td>@{{ userLabor.company }}</td>
+                        <td><b v-if="userLabor.labor_company">@{{ userLabor.labor_company.name }}</b></td>
                     </tr>
                     <tr>
                         <td>工资/工时</td>

+ 29 - 1
resources/views/maintenance/userWorkgroup/create.blade.php

@@ -8,9 +8,23 @@
     </div>
     <div class="container-fluid mt-3">
         <div class="card col-md-8 offset-md-2">
-            <div class="card-body">
+            <div class="card-body" id="list">
                 <form method="POST" action="{{ url('maintenance/userWorkgroup') }}">
                     @csrf
+                    <div class="form-group row">
+                        <label for="warehouse" class="col-2 col-form-label text-right">仓库名称</label>
+                        <div class="col-8">
+                            <select id="warehouse" type="text" class="form-control @error('warehouse') is-invalid @enderror" name="warehouse" autocomplete="off"  required>
+                                <option> </option>
+                                <option v-for="warehouse in warehouses">@{{ warehouse.name }}</option>
+                            </select>
+                            @error('warehouse')
+                            <span class="invalid-feedback" role="alert">
+                                        <strong>{{ $message }}</strong>
+                                    </span>
+                            @enderror
+                        </div>
+                    </div>
                     <div class="form-group row">
                         <label for="name" class="col-2 col-form-label text-right">工作组名称</label>
                         <div class="col-8">
@@ -33,3 +47,17 @@
         </div>
     </div>
 @endsection
+@section('lastScript')
+    <script>
+        new Vue({
+            el:'#list',
+            data:{
+                warehouses:[
+                    @foreach($warehouses as $warehouse)
+                    {id:'{{$warehouse->id}}',name:'{{$warehouse->name}}'},
+                    @endforeach
+                ],
+            },
+        });
+    </script>
+@endsection

+ 25 - 2
resources/views/maintenance/userWorkgroup/edit.blade.php

@@ -12,15 +12,23 @@
     </div>
     <div class="container-fluid mt-3">
         <div class="card">
-            <div class="card-body">
+            <div class="card-body" id="list">
                 <form method="POST" action='{{url("maintenance/userWorkgroup/{$userWorkgroup->id}")}}'>
                     @csrf
                     @method('PUT')
+                    <div class="form-group row">
+                        <label for="warehouse_id" class="col-2 col-form-label text-right">仓库名称</label>
+                        <div class="col-8">
+                            <select id="warehouse_id" type="text" v-model="userWorkgroup.warehouse_id" class="form-control" name="warehouse_id" autocomplete="off"  required>
+                                <option  v-for="warehouse in warehouses" :value="warehouse.id">@{{ warehouse.name }}</option>
+                            </select>
+                        </div>
+                    </div>
                     <div class="form-group row">
                         <label for="name" class="col-2 col-form-label text-right">工作组名称</label>
                         <div class="col-8">
                             <input type="text" class="form-control @error('name') is-invalid @enderror"
-                                   name="name" autocomplete="off" value="{{old('name')?old('name'):$userWorkgroup->name}}" required>
+                                   name="name" autocomplete="off" :value="userWorkgroup.name" required>
                             @error('name')
                             <span class="invalid-feedback" role="alert">
                                 <strong>{{ $message }}</strong>
@@ -38,3 +46,18 @@
         </div>
     </div>
 @endsection
+@section('lastScript')
+    <script>
+        new Vue({
+            el:'#list',
+            data:{
+                userWorkgroup:{name:'{{old('name')?old('name'):$userWorkgroup->name}}',warehouse_id:'{{old('warehouse_id')?old('warehouse_id'):$userWorkgroup->warehouse_id}}'},
+                warehouses:[
+                    @foreach($warehouses as $warehouse)
+                    {id:'{{$warehouse->id}}',name:'{{$warehouse->name}}'},
+                    @endforeach
+                ],
+            },
+        });
+    </script>
+@endsection

+ 3 - 1
resources/views/maintenance/userWorkgroup/index.blade.php

@@ -15,12 +15,14 @@
                 <table class="table table-striped table-sm" id="list">
                     <tr>
                         <th>ID</th>
+                        <th>仓库</th>
                         <th>名称</th>
                         <th>录入时间</th>
                         <th>操作</th>
                     </tr>
                     <tr v-for="userWorkgroup in userWorkgroups">
                         <td class="text-muted">@{{userWorkgroup.id}}</td>
+                        <td ><span v-if="userWorkgroup.warehouse">@{{userWorkgroup.warehouseName}}</span></td>
                         <td>@{{userWorkgroup.name}}</td>
                         <td class="text-muted">@{{userWorkgroup.created_at}}</td>
                         <td>
@@ -44,7 +46,7 @@
             data:{
                 userWorkgroups:[
                     @foreach($userWorkgroups as $userWorkgroup)
-                    {!! $userWorkgroup !!},
+                    {id:'{{$userWorkgroup->id}}',name:'{{$userWorkgroup->name}}',warehouse:'{{$userWorkgroup->warehouse}}',created_at:'{{$userWorkgroup->created_at}}',warehouseName:'{{$userWorkgroup->warehouse['name']}}'},
                     @endforeach
                 ],
             },

+ 50 - 0
resources/views/maintenance/warehouse/create.blade.php

@@ -0,0 +1,50 @@
+@extends('layouts.app')
+@section('title')创建仓库@endsection
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.warehouse.menu')@endcomponent
+    </div>
+    <div class="container-fluid">
+        <div class="card col-md-8 offset-md-2">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <form method="POST" action="{{ url('maintenance/warehouse') }}">
+                    @csrf
+                    <div class="form-group row">
+                        <label for="name" class="col-2 col-form-label text-right">仓库名称</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('name') is-invalid @enderror"
+                                   name="name" autocomplete="off" value="{{ old('name') }}" required>
+                            @error('name')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="code" class="col-2 col-form-label text-right">仓库代码</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('code') is-invalid @enderror"
+                                   name="code" autocomplete="off" value="{{ old('code') }}" required>
+                            @error('code')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-success form-control">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection

+ 56 - 0
resources/views/maintenance/warehouse/edit.blade.php

@@ -0,0 +1,56 @@
+@extends('layouts.app')
+@section('title')编辑仓库@endsection
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')
+        @endcomponent
+        @component('maintenance.warehouse.menu')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
+                </li>
+        @endcomponent
+    </div>
+    <div class="container-fluid">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}!</div>
+                @endif
+                <form method="POST" action='{{url("maintenance/warehouse/{$warehouse->id}")}}'>
+                    @csrf
+                    @method('PUT')
+                    <div class="form-group row">
+                        <label for="name" class="col-2 col-form-label text-right">仓库名称</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('name') is-invalid @enderror"
+                                   name="name" autocomplete="off" value="@if(old('name')){{old('name')}}@else{{$warehouse->name}}@endif" required>
+                            @error('name')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="code" class="col-2 col-form-label text-right">仓库代码</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('code') is-invalid @enderror"
+                                   name="code" autocomplete="off" value="@if(old('code')){{old('code')}}@else{{$warehouse->code}}@endif" required>
+                            @error('code')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-outline-dark form-control">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection

+ 85 - 0
resources/views/maintenance/warehouse/index.blade.php

@@ -0,0 +1,85 @@
+@extends('layouts.app')
+@section('title')仓库@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.warehouse.menu')@endcomponent
+    </span>
+    <div class="container-fluid">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <table class="table table-striped table-sm" id="list">
+                    <tr>
+                        <th>ID</th>
+                        <th>仓库名</th>
+                        <th>仓库代码</th>
+                        <th>创建时间</th>
+                        <th>操作</th>
+                    </tr>
+                    <tr v-for="warehouse in warehouses">
+                        <td class="text-muted">@{{warehouse.id}}</td>
+                        <td>@{{warehouse.name}}</td>
+                        <td>@{{warehouse.code}}</td>
+                        <td class="text-muted">@{{warehouse.created_at}}</td>
+                        <td>
+                            @can('仓库-编辑')
+                            <button class="btn btn-sm btn-outline-primary" @click="edit(warehouse.id)">改</button> @endcan
+                            @can('仓库-删除')
+                            <button class="btn btn-sm btn-outline-dark" @click="destroy(warehouse)">删</button> @endcan
+                        </td>
+                    </tr>
+                </table>
+                {{$warehouses->links()}}
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                warehouses:[
+                    @foreach( $warehouses as $warehouse )
+                    {id:'{{$warehouse->id}}',name:'{{$warehouse->name}}',code:'{{$warehouse->code}}',created_at:'{{$warehouse->created_at}}'},
+                    @endforeach
+                ],
+            },
+            methods:{
+                edit:function(id){
+                    location.href = "{{url('maintenance/warehouse')}}/"+id+"/edit";
+                },
+                destroy:function(warehouse){
+                    if(!confirm('确定要删除仓库“' + warehouse.name + '”吗?')){return};
+                    let data=this;
+                    let url = "{{url('maintenance/warehouse')}}/"+warehouse.id;
+                    axios.delete(url,{id:warehouse.id})
+                        .then(function (response) {
+                            if(response.data.success){
+                                for (let i = 0; i < data.warehouses.length; i++) {
+                                    if (data.warehouses[i].id===warehouse.id){
+                                        data.warehouses.splice(i,1);
+                                        break;
+                                    }
+                                }
+                                tempTip.setDuration(1000);
+                                tempTip.showSuccess('删除仓库"'+warehouse.name+'"成功!')
+                            }else{
+                                tempTip.setDuration(1000);
+                                tempTip.show('删除仓库"'+warehouse.name+'"失败!')
+                            }
+                        })
+                        .catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('删除仓库失败!'+'网络错误:' + err)
+                        });
+                },
+            }
+        });
+    </script>
+@endsection

+ 16 - 0
resources/views/maintenance/warehouse/menu.blade.php

@@ -0,0 +1,16 @@
+
+<div class="container-fluid nav3">
+    <div class="card" >
+        <ul class="nav nav-pills">
+            @can('仓库-查询')
+            <li class="nav-item">
+                <a class="nav-link" href="{{url('maintenance/warehouse')}}" :class="{active:isActive('',3)}">查询</a>
+            </li> @endcan
+            @can('仓库-录入')
+            <li class="nav-item">
+                <a class="nav-link" href="{{url('maintenance/warehouse/create')}}" :class="{active:isActive('create',3)}">录入</a>
+            </li> @endcan
+            {{$slot}}
+        </ul>
+    </div>
+</div>

+ 199 - 148
resources/views/order/index/delivering.blade.php

@@ -2,83 +2,85 @@
 
 @section('content')
     @component('order.index.menu')@endcomponent
-    <div id="list" class="d-none">
-        <form method="GET" action="{{url('order/index/delivering')}}" id="form">
-            <table class="table  table-sm table-bordered text-nowrap  mb-0 ml-3">
-                <tr v-if="isBeingFilterConditions">
-                    <td colspan="10">
-                        <div class="col" style="padding:0">
-                            <a  href="{{url('order/index/delivering')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
-                        </div></td>
-                </tr>
-                <tr>
-                    <td colspan="10">
-                        <select  name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control-sm" style="vertical-align: middle" @change="submit">
-                            <option value="50">每页显示50行</option>
-                            <option value="100">每页显示100行</option>
-                            <option value="200">每页显示200行</option>
-                            <option value="500">每页显示500行</option>
-                            <option value="1000">每页显示1000行</option>
-                        </select></td>
-                </tr>
-                <tr>
-                    <td style="width: 300px">
-                        <select  name="codename_c" v-model="filterData.codename_c" class="form-control form-control-sm" style="vertical-align: middle;max-width: 100px" @change="submit">
-                            <option value="" class="text-secondary">订单状态</option>
-                            <option v-for="code in codes" :value="code.code" class="font-weight-bold">@{{ code.codename_c }}</option>
-                        </select></td>
-                    <td style="width: 300px">
-                        <input style="max-width: 200px"  type="date" name="ordertime_start" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的起始时间"
-                               v-model="filterData.ordertime_start" :class="filterData.ordertime_start?'bg-warning':''">
-                    </td>
-                    <td style="width: 300px">
-                        <input style="max-width: 200px"  type="date" class=" form-control form-control-sm tooltipTarget" name="ordertime_end" title="选择显示指定日期的结束时间"
-                               v-model="filterData.ordertime_end" :class="filterData.ordertime_end?'bg-warning':''" >
-                    </td>
-                    <td style="width: 300px">
-                        <input style="max-width: 200px" name="carriername" v-model="filterData.carriername" class="form-control form-control-sm tooltipTarget" placeholder="承运人" :class="filterData.carriername?'bg-warning':''">
-                    </td>
-                    <td style="width: 300px">
-                        <input style="max-width: 200px" name="issuepartyname" v-model="filterData.issuepartyname" class="form-control form-control-sm tooltipTarget" placeholder="店铺名称" :class="filterData.issuepartyname?'bg-warning':''">
-                    </td>
-                    <td colspan="5"></td>
-                </tr>
-                <tr>
-                    <td >
-                        <div class="form-inline">
-                        <input type="text" class="form-control form-control-sm tooltipTarget" placeholder="客户"
-                               style="width:70px" @input="owner_seek"
-                               title="输入关键词快速定位下拉列表,回车确定">
-                        <select name="customerid" v-model="filterData.customerid" @change="submit" style="max-width: 120px" class="form-control form-control-sm tooltipTarget"  title="选择要显示的客户" :class="filterData.customerid?'bg-warning':''">
-                            <option >    </option>
-                            <option v-for="owner in owners" :value="owner.customerid" >@{{owner.descr_c}}</option>
-                        </select>
-                        </div>
-                    </td>
-                    <td>
-                        <input style="max-width: 200px" name="orderno" v-model="filterData.orderno" class="form-control form-control-sm tooltipTarget" placeholder="发运单号" :class="filterData.orderno?'bg-warning':''">
-                    </td>
-                    <td >
-                        <input style="max-width: 200px" name="soreference5" title="可输出多快递单号" v-model="filterData.soreference5" class="form-control form-control-sm tooltipTarget" placeholder="快递单号" :class="filterData.soreference5?'bg-warning':''">
-                    </td>
-                    <td>
-                        <input style="max-width: 200px" name="soreference1" v-model="filterData.soreference1" class="form-control form-control-sm tooltipTarget" placeholder="客户订单号" :class="filterData.soreference1?'bg-warning':''">
-                    </td>
-                    <td>
-                        <div class="form-inline">
-                        <input style="max-width: 200px" name="notes" title="右侧选择查询范围,默认为一天内" v-model="filterData.notes" class="form-control form-control-sm tooltipTarget" placeholder="备注" :class="filterData.notes?'bg-warning':''">
-                        <select style="max-width: 100px" title="查询范围"  name="addtime" v-model="filterData.addtime" class="form-control form-control-sm tooltipTarget">
-                            <option value="1">近一天</option>
-                            <option value="3">近三天</option>
-                            <option value="7">近一周</option>
-                            <option value="30">近一月</option>
-                            <option value="0">不限期</option>
-                        </select></div>
-                    </td>
-                    <td colspan="5"><input hidden type="submit"></td>
-                </tr>
-                <tr>
-                    <td colspan="10">
+    <div class="container-fluid">
+        <div style="min-width: 4070px;">
+            <div id="list" class="d-none">
+                <form method="GET" action="{{url('order/index/delivering')}}" id="form">
+                    <table class="table  table-sm table-bordered text-nowrap  mb-0 ml-3">
+                        <tr v-if="isBeingFilterConditions">
+                            <td colspan="10">
+                                <div class="col" style="padding:0">
+                                    <a  href="{{url('order/index/delivering')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
+                                </div></td>
+                        </tr>
+                        <tr>
+                            <td colspan="10">
+                                <select  name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control-sm" style="vertical-align: middle" @change="submit">
+                                    <option value="50">每页显示50行</option>
+                                    <option value="100">每页显示100行</option>
+                                    <option value="200">每页显示200行</option>
+                                    <option value="500">每页显示500行</option>
+                                    <option value="1000">每页显示1000行</option>
+                                </select></td>
+                        </tr>
+                        <tr>
+                            <td style="width: 300px">
+                                <select  name="codename_c" v-model="filterData.codename_c" class="form-control form-control-sm" style="vertical-align: middle;max-width: 100px" @change="submit">
+                                    <option value="" class="text-secondary">订单状态</option>
+                                    <option v-for="code in codes" :value="code.code" class="font-weight-bold">@{{ code.codename_c }}</option>
+                                </select></td>
+                            <td style="width: 300px">
+                                <input style="max-width: 200px"  type="date" name="ordertime_start" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的起始时间"
+                                       v-model="filterData.ordertime_start" :class="filterData.ordertime_start?'bg-warning':''">
+                            </td>
+                            <td style="width: 300px">
+                                <input style="max-width: 200px"  type="date" class=" form-control form-control-sm tooltipTarget" name="ordertime_end" title="选择显示指定日期的结束时间"
+                                       v-model="filterData.ordertime_end" :class="filterData.ordertime_end?'bg-warning':''" >
+                            </td>
+                            <td style="width: 300px">
+                                <input style="max-width: 200px" name="carriername" v-model="filterData.carriername" class="form-control form-control-sm tooltipTarget" placeholder="承运人" :class="filterData.carriername?'bg-warning':''">
+                            </td>
+                            <td style="width: 300px">
+                                <input style="max-width: 200px" name="issuepartyname" v-model="filterData.issuepartyname" class="form-control form-control-sm tooltipTarget" placeholder="店铺名称" :class="filterData.issuepartyname?'bg-warning':''">
+                            </td>
+                            <td colspan="5"></td>
+                        </tr>
+                        <tr>
+                            <td >
+                                <div class="form-inline">
+                                    <input type="text" class="form-control form-control-sm tooltipTarget" placeholder="客户"
+                                           style="width:70px" @input="owner_seek"
+                                           title="输入关键词快速定位下拉列表,回车确定">
+                                    <select name="customerid" v-model="filterData.customerid" @change="submit" style="max-width: 120px" class="form-control form-control-sm tooltipTarget"  title="选择要显示的客户" :class="filterData.customerid?'bg-warning':''">
+                                        <option >    </option>
+                                        <option v-for="owner in owners" :value="owner.customerid" >@{{owner.descr_c}}</option>
+                                    </select>
+                                </div>
+                            </td>
+                            <td>
+                                <input style="max-width: 200px" name="orderno" v-model="filterData.orderno" class="form-control form-control-sm tooltipTarget" placeholder="编号" :class="filterData.orderno?'bg-warning':''">
+                            </td>
+                            <td >
+                                <input style="max-width: 200px" name="soreference5" title="可输出多快递单号" v-model="filterData.soreference5" class="form-control form-control-sm tooltipTarget" placeholder="快递单号" :class="filterData.soreference5?'bg-warning':''">
+                            </td>
+                            <td>
+                                <input style="max-width: 200px" name="soreference1" v-model="filterData.soreference1" class="form-control form-control-sm tooltipTarget" placeholder="客户订单号" :class="filterData.soreference1?'bg-warning':''">
+                            </td>
+                            <td>
+                                <div class="form-inline">
+                                    <input style="max-width: 200px" name="notes" title="右侧选择查询范围,默认为一天内" v-model="filterData.notes" class="form-control form-control-sm tooltipTarget" placeholder="备注" :class="filterData.notes?'bg-warning':''">
+                                    <select style="max-width: 100px" title="查询范围,范围越短搜索越快"  name="addtime" v-model="filterData.addtime" class="form-control form-control-sm tooltipTarget">
+                                        <option value="31">近一月</option>
+                                        <option value="92">近三月</option>
+                                        <option value="183">近半年</option>
+                                        <option value="366">近一年</option>
+                                        <option value="0">不限期</option>
+                                    </select></div>
+                            </td>
+                            <td colspan="5"><input hidden type="submit"></td>
+                        </tr>
+                        <tr>
+                            <td colspan="10">
                        <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="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">
@@ -89,65 +91,112 @@
                                     <a class="dropdown-item" @click="orderExport(2)" href="javascript:">导出所有页</a>
                                 </div>
                         </span>
-                        @can('订单管理-批量备注')<button @click="modal()" type="button" class="btn btn-sm ml-2 btn-outline-primary">批量备注追加</button>@endcan
-                    </td>
-                </tr>
-            </table>
-        </form>
-        <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-            <div class="modal-dialog">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-                    </div>
-                    <div class="modal-body">
-                        <input class="form-control" v-model="content" placeholder="注释内容">
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
-                        <button type="button" @click="batchComments()" class="btn btn-primary">批量备注追加</button>
-                    </div>
-                </div><!-- /.modal-content -->
-            </div><!-- /.modal -->
-        </div>
-        <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ml-3">
-            <tr class="text-nowrap">
-                <th>
-                    <label for="all">
-                        <input id="all" type="checkbox" @click="checkAll($event)">全选
-                    </label>
-                </th>
-                <th>序号</th>
-                <th>操作</th>
-                <th>编号</th>
-                <th>订单状态</th>
-                <th>接口下发时间</th>
-                <th>店铺名称</th>
-                <th>客户</th>
-                <th>客户订单号</th>
-                <th>承运人</th>
-                <th>快递单号</th>
-                <th>收货人名称</th>
-                <th>收货人电话</th>
-                <th>省</th>
-                <th>市</th>
-                <th>区</th>
-                <th>收货人地址</th>
-                <th>波次编号</th>
-                <th>仓库</th>
-                <th>快递获取标记</th>
-                <th>快递获取时间</th>
-                <th style="width: 200px">产品代码</th>
-                <th style="width: 200px">产品条码</th>
-                <th style="width: 200px">产品名称</th>
-                <th>订单数量</th>
-                <th>复核时间</th>
-                <th>备注</th>
-                <th>接口取消标记</th>
-                <th>拣货单打印标记</th>
-                <th>接口回传标记</th>
-                <th>订单冻结标记</th>
+                                @can('订单管理-批量备注')<button @click="modal()" type="button" class="btn btn-sm ml-2 btn-outline-primary">批量备注追加</button>@endcan
+                            </td>
+                        </tr>
+                    </table>
+                </form>
+                <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                    <div class="modal-dialog">
+                        <div class="modal-content">
+                            <div class="modal-header">
+                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                            </div>
+                            <div class="modal-body">
+                                <input class="form-control" v-model="content" placeholder="注释内容">
+                            </div>
+                            <div class="modal-footer">
+                                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                                <button type="button" @click="batchComments()" class="btn btn-primary">批量备注追加</button>
+                            </div>
+                        </div><!-- /.modal-content -->
+                    </div><!-- /.modal -->
+                </div>
+                <table class="table table-sm table-striped table-bordered table-hover card-body mt-2 ml-3">
+                    <tr class="text-nowrap">
+                        <th>
+                            <label for="all">
+                                <input id="all" type="checkbox" @click="checkAll($event)">全选
+                            </label>
+                        </th>
+                        <th>序号</th>
+                        <th>操作</th>
+                        <th>编号</th>
+                        <th>订单状态</th>
+                        <th>接口下发时间</th>
+                        <th>店铺名称</th>
+                        <th>客户</th>
+                        <th>客户订单号</th>
+                        <th>承运人</th>
+                        <th>快递单号</th>
+                        <th>收货人名称</th>
+                        <th>收货人电话</th>
+                        <th>省</th>
+                        <th>市</th>
+                        <th>区</th>
+                        <th style="min-width:320px;">收货人地址</th>
+                        <th>波次编号</th>
+                        <th>仓库</th>
+                        <th>快递获取标记</th>
+                        <th>快递获取时间</th>
+                        <th style="min-width: 200px">产品代码</th>
+                        <th style="min-width: 200px">产品条码</th>
+                        <th style="min-width: 200px">产品名称</th>
+                        <th>订单数量</th>
+                        <th>复核时间</th>
+                        <th style="min-width:260px;">备注</th>
+                        <th>接口取消标记</th>
+                        <th>拣货单打印标记</th>
+                        <th>接口回传标记</th>
+                        <th>订单冻结标记</th>
 
+                    </tr>
+                    <tr v-for="(order,i) in orders" @click="selectedColor(order.orderno)" :style="{'font-weight': order.orderno==selectedStyle?'bold':''}">
+                        <td>
+                            <input class="checkItem" type="checkbox" :value="order.orderno" v-model="checkData">
+                        </td>
+                        <td>@can('订单管理-编辑')<button v-if="order.releasestatus==='N'" @click="freeze(order.orderno,order.waveno)" class="btn btn-sm btn-outline-danger text-nowrap">冻结</button>@endcan</td>
+                        <td>@{{ i+1 }}</td>
+                        <td class="text-dark font-weight-bold text-nowrap">@{{ order.orderno }}</td>
+                        <td class="text-muted text-nowrap">@{{ order.codename_c }}</td>
+                        <td class="text-nowrap">@{{ order.addtime }}</td>
+                        <td class="text-nowrap">@{{ order.issuepartyname }}</td>
+                        <td class="text-nowrap">@{{ order.customer_descr_c }}</td>
+                        <td class="text-nowrap">@{{ order.soreference1 }}</td>
+                        <td class="text-muted text-nowrap">@{{ order.carriername }}</td>
+                        <td class="text-nowrap">@{{ order.soreference5 }}</td>
+                        <td class="text-muted text-nowrap">@{{ order.c_contact }}</td>
+                        <td class="text-muted text-nowrap">@{{ 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>
+                        <td class="text-muted">@{{ order.c_address1 }}</td>
+                        <td class="text-nowrap">@{{ order.waveno }}</td>
+                        <td class="text-nowrap"> @{{ order.warehouseid }}</td>
+                        <td class="text-nowrap">@{{ order.edisendflag2 }}</td>
+                        <td class="text-nowrap">@{{ order.edisendtime2 }}</td>
+                        <td colspan="5" 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 :title="oracleDOCOrderDetail.descr_c" class="tooltipTarget" style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.descr_c }}</div></td>
+                                    <td>@{{ oracleDOCOrderDetail.qtyordered }}</td>
+                                    <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.checktime }}</div></td>
+                                </tr>
+                                <tr v-if="isBtn[order.orderno]">
+                                    <td colspan="5">
+                                        <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>
+                        <td>@{{ order.notes }}</td>
+                        <td>@{{ order.erpcancelflag }}</td>
+                        <td>@{{ order.picking_print_flag }}</td>
+                        <td>@{{ order.edisendflag }}</td>
+                        <td>@{{ order.releasestatus }}</td>
             </tr>
             <tr v-for="(order,i) in orders" @click="selectedColor(order.orderno)" :style="{'font-weight': order.orderno==selectedStyle?'bold':''}">
                 <td>
@@ -196,12 +245,14 @@
                 <td>@{{ order.edisendflag }}</td>
                 <td>@{{ order.releasestatus }}</td>
 
-            </tr>
-        </table>
-        <button type="button" @click="pageUp()" :readonly="page>1?false:true" class="btn btn-sm " :class="page>1?'btn-outline-info':''">上一页</button>
-        <button type="button" @click="pageDown()" :readonly="page<maxPage?false:true" class="btn btn-sm m-3" :class="page<maxPage?'btn-outline-info':''">下一页</button>
-        <input  @keyup.enter="pageSkip($event)" class="form-control-sm ml-3 tooltipTarget" :placeholder="'当前页数:'+page+'/'+maxPage" title="去往指定页">
-        <span class="text-muted m-1">共 @{{ sum }} 条</span>
+                    </tr>
+                </table>
+                <button type="button" @click="pageUp()" :readonly="page>1?false:true" class="btn btn-sm " :class="page>1?'btn-outline-info':''">上一页</button>
+                <button type="button" @click="pageDown()" :readonly="page<maxPage?false:true" class="btn btn-sm m-3" :class="page<maxPage?'btn-outline-info':''">下一页</button>
+                <input  @keyup.enter="pageSkip($event)" class="form-control-sm ml-3 tooltipTarget" :placeholder="'当前页数:'+page+'/'+maxPage" title="去往指定页">
+                <span class="text-muted m-1">共 @{{ sum }} 条</span>
+            </div>
+        </div>
     </div>
 @endsection
 
@@ -212,7 +263,7 @@
             data:{
                 filterData:{
                     paginate:50,ordertime_start:'',ordertime_end:'',customerid:'',orderno:'',soreference5:'',codename_c:'',
-                    carriername:'',issuepartyname:'',soreference1:'',notes:'',addtime:'1'
+                    carriername:'',issuepartyname:'',soreference1:'',notes:'',addtime:'31'
                 },
                 page:Number('{{$page}}'),
                 maxPage:1,
@@ -358,14 +409,14 @@
                         return;
                     }
                     window.location.href="{{url('order/index/delivering?ordertime_start=')}}"+this.filterData.ordertime_start
-                    +"&&ordertime_end="+this.filterData.ordertime_end+"&&orderno="+this.filterData.orderno
-                    +"&&soreference5="+this.filterData.soreference5+"&&export="+true+"&&codename_c="+this.filterData.codename_c
+                        +"&&ordertime_end="+this.filterData.ordertime_end+"&&orderno="+this.filterData.orderno
+                        +"&&soreference5="+this.filterData.soreference5+"&&export="+true+"&&codename_c="+this.filterData.codename_c
                         +"&&issuepartyname="+this.filterData.issuepartyname+"&&carriername="+this.filterData.carriername
                         +"&&soreference1="+this.filterData.soreference1+"&&notes="+this.filterData.notes
                         +"&&addtime="+this.filterData.addtime;
                 },
                 modal(){
-                  $("#myModal").modal('show');
+                    $("#myModal").modal('show');
                 },
                 batchComments(){
                     let _this=this;
@@ -395,9 +446,9 @@
                             tempTip.showSuccess('注释完毕!')
                             _this.content='';
                         }).catch(function (err) {
-                            tempTip.setDuration(4000);
-                            tempTip.show('网络错误:'+err)
-                        });
+                        tempTip.setDuration(4000);
+                        tempTip.show('网络错误:'+err)
+                    });
                     $("#myModal").modal('hide');
                 },
                 selectedColor(orderno){

+ 66 - 34
resources/views/personnel/checking-in/QRcode.blade.php

@@ -3,50 +3,82 @@
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
-    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
+    <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="{{ asset('css/app200519b.css') }}" rel="stylesheet">
 </head>
 <body>
-<div class="container-fluid mt-3" id="page">
-    <div class="card col-md-10 offset-md-1 p-0">
-        <div class="card-body">
-            <p class="h3 p-1 m-1" style="text-align:center">扫描进入@{{ userWorkgroup.name }}工作组</p>
-            <div class="col m-0 pull-right mt-5 form-inline" >
-                <img id="img" class="img-thumbnail"   src="" />
-                <div class="pull-right col-6" >
+    <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">首次扫描后将与设备绑定,之后扫描需使用原设备与原软件!</h3><br>
                     <h4 class="text-center text-danger">如更换设备请联系管理人员解除设备绑定!</h4>
                 </div>
+                <div v-if="userWorkgroups.length>3">
+                <div class="row row-cols-3">
+                    <div class="col text-center" style="float:left;" v-for="userWorkgroup in userWorkgroups">
+                            <img id="img" class="img-thumbnail"  :src="userWorkgroup.url" />
+                        <p class="m-2 h5 text-center" >@{{ userWorkgroup.name }}工作组</p>
+                    </div>
+                </div>
+                </div>
+                <div v-else="userWorkgroups.length<=3">
+                    <div class="row">
+                        <div class="col text-center" style="float:left;" v-for="userWorkgroup in userWorkgroups">
+                            <img id="img" class="img-thumbnail" style="margin-top: 20px" :src="userWorkgroup.url" />
+                            <p class="m-2 h5 text-center" >@{{ userWorkgroup.name }}工作组</p>
+                        </div>
+                    </div>
+                </div>
             </div>
         </div>
     </div>
-</div>
 
 
-<script src="{{ asset('js/app.js?202002111414') }}"></script>
-<script>
-    new Vue({
-        el:"#page",
-        data:{
-            userWorkgroup:{
-                id:'{{$userWorkgroup->id}}',name:'{{$userWorkgroup->name}}',
-            },
-
-        },
-        mounted:function () {
-            let _this=this;
-            axios.get('{{url("personnel/checking-in/userDutyCheck/getQRCode?userWorkgroup_id=")}}'+_this.userWorkgroup.id)
-                .then(function (response) {
-                    console.log(response.data)
-                    $("#img").attr('src',response.data);
-                }).catch(function (err) {
-                tempTip.setDuration(3000);
-                tempTip.show('获取二维码失败!网络错误:'+err);
-            });
+    <script src="{{ asset('js/app.js?202002111414') }}"></script>
+    <script>
+        function computeDiffMicroTime_fromNow(dateComparing) {
+            let now=new Date();
+            let dateComparingObj=new Date(dateComparing)
+            let mil = dateComparingObj.getTime()-now.getTime();
+            if (mil>0){
+                return mil;
+            }else {
+                return mil=1000;
+            }
         }
-
-
-
-    });
-</script>
+        new Vue({
+            el:"#page",
+            data:{
+                userWorkgroups:[
+                    @foreach($userWorkgroups as $userWorkgroup)
+                    {id:'{{$userWorkgroup->id}}',name:'{{$userWorkgroup->name}}',url:'{{$userWorkgroup->url}}',},
+                    @endforeach
+                ],
+                last_refresh_date:'{{$last_refresh_date}}',
+                warehouseId:'{{$warehouseId}}',
+            },
+            mounted(){
+                let _this=this;
+                let refreshQRCode=function(){
+                    axios.post('{{url('personnel/checking-in/refreshQRCode')}}',{beforeTime:_this.last_refresh_date,warehouseId:_this.warehouseId})
+                        .then(function (response) {
+                            _this.userWorkgroups=response.data.userWorkgroups;
+                            _this.last_refresh_date=response.data.last_refresh_date;
+                            setTimeout(refreshQRCode,computeDiffMicroTime_fromNow(_this.last_refresh_date));
+                        }).catch(function (err) {
+                        setTimeout(refreshQRCode,computeDiffMicroTime_fromNow(_this.last_refresh_date));
+                        tempTip.setDuration(4000);
+                        tempTip.show(err);
+                    });
+                };
+                refreshQRCode();
+            }
+        });
+    </script>
 </body>
 </html>

+ 2 - 2
resources/views/personnel/checking-in/clock.blade.php

@@ -14,9 +14,9 @@
                         <label for="mobile_phone" class="form-check-label col-3 pull-right">手机号:</label>
                         <input name="mobile_phone" id="mobile_phone" class="@error('mobile_phone') is-invalid @enderror col-7 form-control" type="text">
                     </div>
-                    <input hidden name="userWorkgroupID" value="{{$userWorkgroupID}}">
+                    <input type="hidden" name="userWorkgroupID" value="{{ old('userWorkgroupID',$userWorkgroupID)}}">
                     <div class="form-group row pt-3">
-                        <button type="submit" class="col-7 offset-2 btn btn-success">提交</button>
+                        <button type="submit" class="col-7 offset-3 btn btn-success">提交</button>
                     </div>
                 </form>
             </div>

+ 90 - 51
resources/views/personnel/checking-in/clockAudit.blade.php

@@ -6,73 +6,102 @@
         @component('personnel.checking-in.menuChecking-in')@endcomponent
     </div>
     <div class="container-fluid" id="list">
-        <div class="card col-md-10 offset-md-1">
+        <div class="card col-md visible-on">
             <div class="card-body p-0">
-                <table class="table table-striped table-bordered text-nowrap">
-                    <thead class="thead-light">
-                    <tr>
-                        <td>序号</td>
-                        <td>姓名</td>
-                        <td>手机号</td>
-                        <td>劳务所</td>
-                        <td>打卡时间</td>
-                        <td>打卡类型</td>
-                        @can('人事管理-打卡审核')<td>操作</td>@endcan
-                        <td>工作组</td>
-                        <td v-if="workgroupSign">组长审核</td>
-                        <td>异常</td>
-                        <td>合计工时</td>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr v-for="(userDutyCheck,i) in userDutyChecks">
-                        <td>@{{ i+1 }}</td>
-                        <td ><span v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.full_name }}</span></td>
-                        <td  class="text-muted"><span v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.mobile_phone }}</span></td>
-                        <td ><span v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.user_labor_company }}</span></td>
-                        <td>@{{ userDutyCheck.checked_at }}</td>
-                        <td>
-                            <div v-if="userDutyCheck.verify_user_id" class="text-center">@{{ userDutyCheck.type }}</div>
-                            <select v-else v-model="userDutyCheck.type" @change="isException(userDutyCheck.id,userDutyCheck.user_id,userDutyCheck.checked_at,userDutyCheck.type)" class="form-control" style="width: 100px">
-                                <option value="登入">登入</option>
-                                <option value="登出">登出</option>
-                            </select>
-                        </td>
-                        @can('人事管理-打卡审核')<td>
-                            <b v-if="userDutyCheck.verify_user_id" class="text-success">已审核</b>
-                            <button v-else @click="storeClockAudit(userDutyCheck.id,userDutyCheck.type)" class="btn btn-primary w-80">审核</button>
-                        </td>@endcan
-                        <td class="font-weight-bold"><span v-if="userDutyCheck.user_detail.user.user_workgroups&&userDutyCheck.user_detail.user.user_workgroups.length>0">
-                                @{{ userDutyCheck.user_detail.user.user_workgroups[0].name }}</span></td>
-                        <td v-if="workgroupSign">
-                            <b v-if="userDutyCheck.group_user_id" class="text-success">已审核</b>
-                            <button v-else @click="storeGroupAudit(userDutyCheck.id,userDutyCheck.type)" class="btn btn-primary w-80">组长审核</button>
-                        </td>
-                        <td>@{{ userDutyCheck.exception }}</td>
-                        <td>@{{ userDutyCheck.duration_man_hour }}</td>
-                    </tr>
-                    </tbody>
-                </table>
+                <div v-if="userDutyChecks&&userDutyChecks.length>=1">
+                    <table class="table table-striped table-bordered text-nowrap"  v-for="day in date" >
+                        <thead class="thead-light" >
+                        <tr class="text-center">
+                            <th v-if="day==0" colspan="11">@{{ day | toDate}}</th>
+                            <th v-if="day==-1" colspan="11">@{{ day | toDate}}</th>
+                            <th v-if="day==-2" colspan="11">@{{ day | toDate}}</th>
+                        </tr>
+                        <tr>
+                            <td>序号</td>
+                            <td>姓名</td>
+                            @can('人事管理-打卡审核')<td>操作</td>@endcan
+                            <td v-if="workgroupSign">组长审核</td>
+                            <td >打卡时间</td>
+                            <td>打卡类型</td>
+                            <td>手机号</td>
+                            <td>劳务所</td>
+                            <td>工作组</td>
+                            <td>异常</td>
+                            <td>合计工时</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="(userDutyCheck,i) in userDutyChecks" v-if="whichDay(userDutyCheck.checked_at)==day">
+                            <td>@{{ i+1 }}</td>
+                            <td ><span v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.full_name }}</span></td>
+                            @can('人事管理-打卡审核')<td>
+                                <b v-if="userDutyCheck.verify_user_id" class="text-success">已审核</b>
+                                <button v-else @click="storeClockAudit(userDutyCheck.id,userDutyCheck.type)" class="btn btn-primary w-80">审核</button>
+                            </td>@endcan
+                            <td v-if="workgroupSign">
+                                <b v-if="userDutyCheck.group_user_id" class="text-success">已审核</b>
+                                <button v-else @click="storeGroupAudit(userDutyCheck.id,userDutyCheck.type)" class="btn btn-primary w-80">组长审核</button>
+                            </td>
+                            <td>@{{ userDutyCheck.checked_at.substring(11,16) }}</td>
+                            <td>
+                                <div v-if="userDutyCheck.verify_user_id" class="text-center">@{{ userDutyCheck.type }}</div>
+                                <select v-else v-model="userDutyCheck.type" @change="isException(userDutyCheck.id,userDutyCheck.user_id,userDutyCheck.checked_at,userDutyCheck.type)" class="form-control" style="width: 100px">
+                                    <option value="登入">登入</option>
+                                    <option value="登出">登出</option>
+                                </select>
+                            </td>
+                            <td  class="text-muted"><span v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.mobile_phone }}</span></td>
+                            <td ><span v-if="userDutyCheck.user_labor">@{{ userDutyCheck.user_labor.labor_company.name }}</span></td>
+                            <td class="font-weight-bold"><span v-if="userDutyCheck.user_workgroup">
+                                @{{ userDutyCheck.user_workgroup.name }}</span></td>
+                            <td>@{{ userDutyCheck.exception }}</td>
+                            <td>@{{ userDutyCheck.duration_man_hour }}</td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <div class="text-center" v-else><h3>暂无任何打卡记录!</h3></div>
             </div>
         </div>
     </div>
+
 @endsection
 
 @section('lastScript')
     <script>
+
         new Vue({
             el:"#list",
             data:{
+                date:[0,-1,-2],
+                dateStr:'',
                 userDutyChecks:[
-                    @foreach($userDutyChecks as $userDutyCheck)
-                    {id:'{{$userDutyCheck->id}}',user_id:'{{$userDutyCheck->user_id}}',checked_at:'{{$userDutyCheck->checked_at}}',
-                    type:'{{$userDutyCheck->type}}',verify_user_id:'{{$userDutyCheck->verify_user_id}}',group_user_id:'{{$userDutyCheck->group_user_id}}',
-                    exception:'',duration_man_hour:'',@if($userDutyCheck->userDetail)user_detail:{!! $userDutyCheck->userDetail !!} @endif },
+                        @foreach($userDutyChecks as $userDutyCheck)
+                    {id:'{{$userDutyCheck->id}}',user_id:'{{$userDutyCheck->user_id}}',
+                        checked_at:'{{$userDutyCheck->checked_at}}',
+                        type:'{{$userDutyCheck->type}}',verify_user_id:'{{$userDutyCheck->verify_user_id}}',group_user_id:'{{$userDutyCheck->group_user_id}}',
+                        exception:'',duration_man_hour:'',@if($userDutyCheck->userWorkgroup)user_workgroup:{!! $userDutyCheck->userWorkgroup !!}, @endif
+                            @if($userDutyCheck->userDetail)user_detail:{!! $userDutyCheck->userDetail !!}, @endif
+                            @if($userDutyCheck->userLabor)user_labor:{!! $userDutyCheck->userLabor !!}, @endif},
                     @endforeach
                 ],
                 workgroupSign:'{{$workgroupSign}}',
             },
             methods:{
+                whichDay(dateStr){
+                    let nowDate=new Date();
+                    let targetDate=new Date(dateStr);
+                    if(nowDate.getMonth()!=targetDate.getMonth()){
+                        if (new Date(targetDate.setDate(targetDate.getDate()+1))==nowDate){
+                            return -1;
+                        }
+                        if (new Date(targetDate.setDate(targetDate.getDate()+2))==nowDate){
+                            return -2;
+                        }
+                    }
+                    let diffOfDays=targetDate.getDate()-nowDate.getDate();
+                    return diffOfDays;
+                },
                 store(id,type,url){
 
                 },
@@ -139,9 +168,19 @@
                         }).catch(function (err) {
                         tempTip.setDuration(4000);
                         tempTip.show('校验失败!网络错误:'+err);
-                        });
+                    });
                 }
             },
+            filters:{
+                toDate:function(val){
+                    let dd = new Date();
+                    dd.setDate(dd.getDate()+val);//获取AddDayCount天后的日期
+                    let y = dd.getFullYear();
+                    let m = dd.getMonth()+1;//获取当前月份的日期
+                    let d = dd.getDate();
+                    return  y+'-'+(m<10?'0'+m:m)+'-'+d;
+                }
+            }
         });
     </script>
 @endsection

+ 33 - 7
resources/views/personnel/checking-in/createUserDetail.blade.php

@@ -15,14 +15,34 @@
             </div>
             <div class="form-group row pt-0">
                 <label for="full_name" class="form-check-label col-3 pull-left">姓名:</label>
-                <input name="full_name" id="full_name" class="@error('full_name') is-invalid @enderror col-7 form-control" type="text">
+                <div class="col-8">
+                <input name="full_name" id="full_name" class="@error('full_name') is-invalid @enderror  form-control" value="{{ old('full_name') }}" autocomplete="off" type="text">
+                @error('full_name')
+                <span class="invalid-feedback" role="alert">
+                    <strong>{{ $message }}</strong>
+                </span>
+                @enderror
+                </div>
             </div>
             <div class="form-group row">
                 <label for="mobile_phone" class="form-check-label col-3 pull-left">电话:</label>
-                <input name="mobile_phone" @if($mobile_phone) value="{{$mobile_phone}}" @endif readonly id="mobile_phone" class="@error('mobile_phone') is-invalid @enderror col-7 form-control" type="text">
+                <div class="col-8">
+                <input name="mobile_phone" @if($mobile_phone) value="{{$mobile_phone}}" @endif readonly id="mobile_phone" class="@error('mobile_phone') is-invalid @enderror  form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group row pt-0">
+                <label for="identity_number" class="form-check-label col-3 pull-left">身份证号码:</label>
+                <div class="col-8">
+                <input name="identity_number" id="identity_number" class="@error('identity_number') is-invalid @enderror  form-control" value="{{ old('identity_number') }}" autocomplete="off" type="text">
+                @error('identity_number')
+                <span class="invalid-feedback" role="alert">
+                    <strong>{{ $message }}</strong>
+                </span>
+                @enderror
+                </div>
             </div>
             <div class="form-group row">
-                <label for="gender" class="form-check-label col-3 pull-left">性别:</label>
+                <label for="gender" class="form-check-label col-4 pull-left">性别:</label>
                 <div class="custom-control custom-radio col-4">
                     <input checked name="gender" value="男"  type="radio" id="boy" class=" custom-control-input" >
                     <label class="custom-control-label" for="boy">男</label>
@@ -33,12 +53,18 @@
                 </div>
             </div>
             <div class="form-group row">
-                <label for="company" class="form-check-label col-3 pull-left">劳务所:</label>
-                <input name="company" id="company" class="col-7 form-control" type="text">
+                <label for="labor_company_id" class="form-check-label col-3 pull-left">劳务所:</label>
+                <div class="col-8">
+                <select name="labor_company_id" id="labor_company_id" class=" form-control"  type="text">
+                    @foreach( $laborCompanies as $laborCompany )
+                        <option value="{{$laborCompany->id}}">{{$laborCompany->name}}</option>
+                    @endforeach
+                </select>
+                </div>
             </div>
-            <input hidden name="userWorkgroupID" value="{{$userWorkgroupID}}">
+            <input type="hidden" name="userWorkgroupID" value="{{ old('userWorkgroupID',$userWorkgroupID)}}" >
             <div class="form-group row pt-3">
-                <button type="submit" class="col-7 offset-2 btn btn-success">登记</button>
+                <button type="submit" class="col-8 offset-3 btn btn-success">登记</button>
             </div>
         </form>
     </div>

+ 9 - 9
resources/views/personnel/checking-in/getQRcode.blade.php

@@ -8,11 +8,11 @@
     <div class="container-fluid mt-3" id="page">
         <div class="card col-md-10 offset-md-1 p-0">
             <div class="card-body">
-                    <div class="list-group list-group-horizontal-lg" >
-{{--                        @click="getQRCode(userWorkgroup.id)"--}}
-                        <a target="_blank"  class="btn list-group-item" type="button" :href="('{{url('personnel/checking-in/userDutyCheck/QRCode?userWorkgroupId=')}}'+userWorkgroup.id)"  :class="userWorkgroup==checkedUserWorkgroup ? 'btn-primary' : 'btn-outline-primary'"
-                                v-for="userWorkgroup in userWorkgroups">@{{ userWorkgroup.name }}</a>
-                    </div>
+                <div class="list-group list-group-horizontal-lg align-content-center" v-if="warehouses">
+                    <a target="_blank"  class="btn list-group-item col-md-2" type="button" :href="('{{url('personnel/checking-in/QRCode?warehouseId=')}}'+warehouse.id)"  :class="warehouse==checkedWarehouse ? 'btn-primary' : 'btn-outline-primary'"
+                       v-for="warehouse in warehouses">@{{ warehouse.name }}</a>
+                </div>
+                <h3 v-else>还未录入仓库,请先录入仓库!</h3>
             </div>
         </div>
     </div>
@@ -23,12 +23,12 @@
         new Vue({
             el:"#page",
             data:{
-                userWorkgroups:[
-                    @foreach($userWorkgroups as $userWorkgroup)
-                    {!! $userWorkgroup !!},
+                warehouses:[
+                    @foreach($warehouses as $warehouse)
+                    {!! $warehouse !!},
                     @endforeach
                 ],
-                checkedUserWorkgroup:'',
+                checkedWarehouse:'',
             },
         });
     </script>

+ 3 - 3
resources/views/personnel/checking-in/menuChecking-in.blade.php

@@ -1,9 +1,9 @@
-<div class="container-fluid">
-    <div class="card menu-third" style="background: #f9f0f0;transform: scale(0.95)">
+<div class="container-fluid nav3">
+    <div class="card menu-third" >
         <ul class="nav nav-pills">
                 @can('人事管理-打卡')
                 <li class="nav-item">
-                    <a class="nav-link text-dark" href="{{url('personnel/checking-in/userDutyCheck/goGetQRCode')}}" :class="{active:isActive('goGetQRCode',4)}">打卡</a>
+                    <a class="nav-link text-dark" href="{{url('personnel/checking-in/goGetQRCode')}}" :class="{active:isActive('goGetQRCode',3)}">打卡</a>
                 </li>@endcan
                 @can('人事管理-录入补卡')
                 <li class="nav-item">

+ 10 - 18
resources/views/personnel/checking-in/missionAudit.blade.php

@@ -19,9 +19,6 @@
                         <td></td>
                     </tr>
                     <tr>
-                        <td>
-                            <span class="text-muted">每页显示记录:</span>
-                        </td>
                         <td colspan="3">
                             <select name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control-sm" style="vertical-align: middle" @change="submit">
                                 <option value="50">50行</option>
@@ -33,23 +30,17 @@
                         <td></td>
                     </tr>
                     <tr>
-                        <td style="width: 200px">
-                            <span class="text-muted">根据条件过滤:</span>
-                        </td>
-                        <td class="col" style="width: 300px">
+                        <td class="col" style="width: 220px">
                             <div class="col p-0">
-                                <label class="form-check-label col-2 pull-left p-0">日期:</label>
-                                <input v-model="filterData.start_date" name="start_date" type="date" class="form-control-sm m-0 col-7" style="width: 130px">
+                                <input v-model="filterData.start_date" :class="filterData.start_date?'bg-warning':''" name="start_date" type="date" class="form-control-sm m-0 col-8 tooltipTarget" title="选择显示指定日期的开始时间" style="width: 130px">
                             </div>
-                            <input v-model="filterData.end_date" name="end_date" type="date" class="form-control-sm col-7 offset-md-2 mt-2" style="width: 130px">
+                            <input v-model="filterData.end_date" :class="filterData.end_date?'bg-warning':''" name="end_date" type="date" class="form-control-sm col-8 offset-md-0 mt-2 tooltipTarget" title="选择显示指定日期的结束时间" style="width: 130px">
                         </td>
-                        <td style="width: 300px">
-                            <label class="form-check-label">姓名</label>
-                            <input v-model="filterData.full_name" name="full_name" class="form-control-sm" type="text">
+                        <td style="width: 220px">
+                            <input v-model="filterData.full_name" :class="filterData.full_name?'bg-warning':''" name="full_name" class="form-control-sm" type="text" placeholder="姓名">
                         </td>
-                        <td style="width: 300px">
-                            <label class="form-check-label">电话</label>
-                            <input v-model="filterData.mobile_phone" name="mobile_phone" class="form-control-sm" type="text">
+                        <td style="width: 220px">
+                            <input v-model="filterData.mobile_phone" :class="filterData.mobile_phone?'bg-warning':''" name="mobile_phone" class="form-control-sm" type="text" placeholder="电话">
                         </td>
                         <td><input hidden type="submit"></td>
                     </tr>
@@ -86,7 +77,7 @@
                     <td><p v-if="processDailyParticipant.user_detail">
                             @{{ processDailyParticipant.user_detail.mobile_phone }}</p></td>
                     <td><p v-if="processDailyParticipant.user_detail">
-                            @{{ processDailyParticipant.user_detail.user_labor_company }}</p></td>
+                            @{{ processDailyParticipant.user_detail.user_labor.labor_company.name}}</p></td>
                     <td>@{{ processDailyParticipant.hour_count }}</td>
                     <td class="text-danger">@{{ processDailyParticipant.hour }}</td>
                     <td class="text-danger">@{{ processDailyParticipant.diff }}</td>
@@ -119,6 +110,7 @@
         },
         mounted:function () {
             this.initInputs();
+            $(".tooltipTarget").tooltip({'trigger':'hover'});
         },
         computed:{
             isBeingFilterConditions:function(){
@@ -183,4 +175,4 @@
         },
     });
 </script>
-@endsection
+@endsection

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff