Forráskód Böngészése

Merge branch 'Haozi'

# Conflicts:
#	public/js/app.js
LD 5 éve
szülő
commit
11330fc845
34 módosított fájl, 1544 hozzáadás és 481 törlés
  1. 5 4
      app/Events/ClockinEvent.php
  2. 37 0
      app/Events/GuardAuditEvent.php
  3. 37 0
      app/Events/ImportEvent.php
  4. 5 4
      app/Events/TeamAuditEvent.php
  5. 100 18
      app/Http/Controllers/LaborReportController.php
  6. 22 21
      app/Http/Controllers/PersonnelController.php
  7. 180 52
      app/Http/Controllers/QRCodeController.php
  8. 349 149
      app/Http/Controllers/UserDutyCheckController.php
  9. 153 68
      app/LaborReport.php
  10. 1 0
      app/UserDutyCheck.php
  11. 0 7
      app/UserLabor.php
  12. 1 1
      database/migrations/2020_05_22_114410_create_labor_reports_table.php
  13. 1 1
      database/migrations/2020_05_22_172739_create_labor_companies_table.php
  14. 35 0
      database/migrations/2020_07_01_175324_change_user_duty_check_tables.php
  15. 37 0
      database/migrations/2020_07_02_142427_change_labor_reports_tables.php
  16. 0 3
      laravel-echo-server.lock
  17. BIN
      public/images/QRCodeIMG/10.png
  18. BIN
      public/images/QRCodeIMG/4.png
  19. BIN
      public/images/QRCodeIMG/5.png
  20. 1 1
      resources/views/layouts/menu.blade.php
  21. 28 46
      resources/views/personnel/checking-in/QRcode.blade.php
  22. 26 21
      resources/views/personnel/checking-in/clock.blade.php
  23. 13 11
      resources/views/personnel/checking-in/clockAudit.blade.php
  24. 8 1
      resources/views/personnel/checking-in/createReplenishClock.blade.php
  25. 13 7
      resources/views/personnel/checking-in/createUserDetail.blade.php
  26. 4 2
      resources/views/personnel/checking-in/getQRcode.blade.php
  27. 35 0
      resources/views/personnel/checking-in/getUserWorkGroups.blade.php
  28. 25 0
      resources/views/personnel/checking-in/importAndExportClock.blade.php
  29. 75 0
      resources/views/personnel/checking-in/importAndExportQRCode.blade.php
  30. 73 0
      resources/views/personnel/checking-in/importAndExportSuccess.blade.php
  31. 9 21
      resources/views/personnel/checking-in/success.blade.php
  32. 20 4
      resources/views/personnel/checking-in/updateUserDetail.blade.php
  33. 230 37
      resources/views/personnel/laborReport/index.blade.php
  34. 21 2
      routes/web.php

+ 5 - 4
app/Events/ClockinEvent.php

@@ -3,6 +3,7 @@
 namespace App\Events;
 
 use App\Http\Controllers\Controller;
+use App\LaborReport;
 use App\UserDutyCheck;
 use Illuminate\Broadcasting\Channel;
 use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
@@ -13,16 +14,16 @@ class ClockinEvent implements ShouldBroadcast
 {
     use  SerializesModels;
 
-    public $userDutyCheck;
+    public $laborReport;
 
     /**
      * Create a new event instance.
      *
      * @param UserDutyCheck $userDutyCheck
      */
-    public function __construct(UserDutyCheck $userDutyCheck)
+    public function __construct(LaborReport $laborReport)
     {
-        $this->userDutyCheck=$userDutyCheck;
+        $this->laborReport=$laborReport;
     }
 
     /**
@@ -32,7 +33,7 @@ class ClockinEvent implements ShouldBroadcast
      */
     public function broadcastOn()
     {
-        return new Channel($this->userDutyCheck->userWorkgroup->token);
+        return new Channel($this->laborReport->userWorkgroup->token);
     }
 
 }

+ 37 - 0
app/Events/GuardAuditEvent.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 GuardAuditEvent 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');
+    }
+
+}

+ 37 - 0
app/Events/ImportEvent.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 importEvent 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');
+    }
+
+}

+ 5 - 4
app/Events/TeamAuditEvent.php

@@ -2,6 +2,7 @@
 
 namespace App\Events;
 
+use App\LaborReport;
 use App\UserDutyCheck;
 use Illuminate\Broadcasting\Channel;
 use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
@@ -12,16 +13,16 @@ class TeamAuditEvent implements ShouldBroadcast
 {
     use  SerializesModels;
 
-    public $userDutyCheck;
+    public $laborReport;
 
     /**
      * Create a new event instance.
      *
      * @return void
      */
-    public function __construct(UserDutyCheck $userDutyCheck)
+    public function __construct(LaborReport $laborReport)
     {
-        $this->userDutyCheck=$userDutyCheck;
+        $this->laborReport=$laborReport;
     }
 
     /**
@@ -31,7 +32,7 @@ class TeamAuditEvent implements ShouldBroadcast
      */
     public function broadcastOn()
     {
-        return new Channel('userDutyCheck');
+        return new Channel('laborReport');
     }
 
 }

+ 100 - 18
app/Http/Controllers/LaborReportController.php

@@ -2,12 +2,15 @@
 
 namespace App\Http\Controllers;
 
+use App\Events\GuardAuditEvent;
+use App\Events\TeamAuditEvent;
 use App\Exports\Export;
 use App\LaborReport;
 use App\UserDutyCheck;
 use App\UserWorkgroup;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
 use Maatwebsite\Excel\Facades\Excel;
 
@@ -58,34 +61,30 @@ class LaborReportController extends Controller
      */
     public function index(Request $request)
     {
+        if(!Gate::allows('人事管理')){ return redirect(url('/'));  }
+        $user=Auth::user();
+        if (!$user)return redirect('/');
+        $userWorkgroupIds=$user->getPermittingWorkgroupIds();
+        $permittingWorkgroups=UserWorkgroup::whereIn('id',$userWorkgroupIds)->get();
+        if($permittingWorkgroups->isEmpty())$permittingWorkgroups="\'\'";
+        $laravelEchoPrefix = config('database.redis.options.prefix');
+
         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()]);
+            return view('personnel.laborReport.index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,'request'=>$request->input(),'permittingWorkgroups'=>$permittingWorkgroups,'laravelEchoPrefix'=>$laravelEchoPrefix,]);
         }
-        $laborReports=LaborReport::with(['userWorkgroup','user'])->orderBy('id','DESC')->paginate(50);
+        $laborReports=LaborReport::with(['userWorkgroup','user','userDutyCheck'])->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']));
-            }
+           $createdAtDate=Carbon::parse($laborReport->created_at)->format('Y-m-d');
+           $userDutyCheck=UserDutyCheck::where('checked_at','like',$createdAtDate.'%')->where('user_id',$laborReport->user_id)->first();
+            if ($userDutyCheck) $laborReport->userDutyCheck=$userDutyCheck;
         }
         $userWorkGroups=UserWorkgroup::select('id','name')->get();
-        return view('personnel/laborReport/index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,]);
+        return view('personnel/laborReport/index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,'laravelEchoPrefix'=>$laravelEchoPrefix,'permittingWorkgroups'=>$permittingWorkgroups]);
 
     }
 
@@ -116,6 +115,7 @@ class LaborReportController extends Controller
             'verify_at'=>'审核时间',
             'group_user_id'=>'审核人',
             'check_out_at'=>'退场时间',
+            'relax_time'=>'晚饭时间',
             'online_duration'=>'在线时长',
             'working_duration'=>'本次工作时长',
         ]];
@@ -135,6 +135,7 @@ class LaborReportController extends Controller
                 '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:'',
+                'relax_time'=>isset($laborReport->relax_time)?$laborReport->relax_time:'',
                 'online_duration'=>isset($laborReport->online_duration)?$laborReport->online_duration:'',
                 'working_duration'=>isset($laborReport->working_duration)?$laborReport->working_duration:'',
             ];
@@ -142,4 +143,85 @@ class LaborReportController extends Controller
         }
         return Excel::download(new Export($row,$list),date('YmdHis', time()).'-临时工报表记录单.xlsx');
     }
+
+    //门卫打卡审核
+    public function guardClockAudit(Request $request){
+        if(!Gate::allows('人事管理-门卫审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $id=$request->input('id');
+        $type=$request->input('type');
+        $userDutyCheck=UserDutyCheck::find($id);
+        $userDutyCheck->type=$type;
+        $userDutyCheck->verify_user_id=Auth::user()['id'];
+        $userDutyCheck->update();
+        event(new GuardAuditEvent($userDutyCheck));
+        $this->log(__METHOD__,"打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        return ["success"=>true,"data"=>$userDutyCheck->verify_user_id];
+    }
+    //打卡组长审核
+    public function groupClockAudit(Request $request){
+        if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $id=$request->input('id');
+        $laborReport=LaborReport::find($id);
+        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $laborReport->group_user_id=Auth::user()['id'];
+        $laborReport->verify_at=date('Y-m-d H:i:s');
+        $laborReport->update();
+        $laborReport->verifyPerson=Auth::user()['name'];
+        $this->log(__METHOD__,"打卡组长审核".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        event(new TeamAuditEvent($laborReport));
+        return ["success"=>true,"data"=>$laborReport];
+    }
+
+    //组长点击退场
+    public function groupExport(Request $request){
+        if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $id=$request->input('id');
+        $laborReport=LaborReport::find($id);
+        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
+        $check_in_at=$laborReport->check_in_at;
+        $laborReport->check_out_at=$check_out_at;
+        $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
+        $laborReport->online_duration=$online_duration;
+        $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
+        $laborReport->update();
+        $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
+        $this->log(__METHOD__,"退场".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        return ["success"=>true,"data"=>$laborReport];
+    }
+
+    //晚19点后组长点击退场,判断是否有晚餐情况
+    public function groupExportEnsure(Request $request){
+        if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $id=$request->input('id');
+        $relax_time=$request->input('relax_time');
+        if(!$relax_time){ return ["success"=>false,"data"=>"未选择确切晚饭时间,请重新选择!"];  }
+        $laborReport=LaborReport::find($id);
+        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
+        $check_in_at=$laborReport->check_in_at;
+        $laborReport->check_out_at=$check_out_at;
+        $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
+        $laborReport->online_duration=$online_duration;
+        if ($relax_time){
+            $laborReport->relax_time=$relax_time;
+            $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration)-$relax_time/60;//减去晚饭时间
+        }else{
+            $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
+        }
+        $laborReport->update();
+        $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
+        $this->log(__METHOD__,"退场".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        return ["success"=>true,"data"=>$laborReport];
+    }
+
+    //工作时长减午饭休息时间
+    public function minusLunchTime($laborReport,$hour){
+        $date=$laborReport->check_in_at;
+        $date=Carbon::parse($date)->format('H');
+        if ((int)$date<=11){
+            $hour=$hour-1;
+        }
+        return $hour;
+    }
 }

+ 22 - 21
app/Http/Controllers/PersonnelController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Events\ClockinEvent;
 use App\Events\ClockoutEvent;
+use App\Events\importEvent;
 use App\Events\TeamAuditEvent;
 use App\LaborReport;
 use App\ProcessDailyParticipant;
@@ -88,10 +89,10 @@ 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();
+//        $checkInDate=Carbon::parse($userDutyCheck->checked_at)->format('Y-m-d');where('created_at','like',$checkInDate."%")
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('user_workgroup_id',$workgroup->id)->orderBy('id','desc')->first();
         if (!$laborReport){
-            $laborReportNew=LaborReport::createLaborReportData($userDutyCheck->user_id,$userDutyCheck->workgroup_id,$userDutyCheck);
+            $laborReportNew=LaborReport::createLaborReportData($userDutyCheck);
             $this->log(__METHOD__,"提交临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck->user_id,$userDutyCheck->workgroup_id,$userDutyCheck]));
             //验证五分钟之内重新换组情况
             $checkInDateNow=Carbon::parse($laborReportNew->created_at)->format('Y-m-d H');
@@ -182,35 +183,29 @@ class PersonnelController extends Controller
     public function storeReplenishClock(Request $request){
         if(!Gate::allows('人事管理-录入补卡')){ return redirect(url('/'));  }
         $errors=$this->validatorUserDutyCheck($request)->errors();
-        if (count($errors)>0)return ['success'=>false,'data'=>$errors];
+        if (count($errors)>0)return ['success'=>false,'error'=>$errors];
         $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
         ]);
-        if ($type=='登出')$userDutyCheck->verify_user_id=0;
+        $checkedAtDate=Carbon::parse($checked_at)->format('Y-m-d');
+        $userDutyCheckImport=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$checkedAtDate.'%')->where('type','登入')->orderBy('id','desc')->first();
+        if ($userDutyCheckImport&&$userDutyCheck->type=='登入')return ['result'=>true,'data'=>'已存在进场记录!'];
+        $userDutyCheckExport=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$checkedAtDate.'%')->where('type','登出')->orderBy('id','desc')->first();
+        if ($userDutyCheckExport&&$userDutyCheck->type=='登出')return ['result'=>true,'data'=>'已存在出场记录!'];
         $userDutyCheck->save();
-        if ($userDutyCheck&&$userDutyCheck->type=='登入'){
-            event(new ClockinEvent($userDutyCheck));
-        }else if ($userDutyCheck&&$userDutyCheck->type=='登出'){
-            event(new ClockoutEvent($userDutyCheck));
-        }
-        $checkInDate=Carbon::parse($userDutyCheck->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();
+        $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$checkedAtDate.'%')->orderBy('id','desc')->first();
         if (!$laborReport){
-            $laborReportNew=LaborReport::createLaborReportData($userDutyCheck->user_id,$userDutyCheck->workgroup_id,$userDutyCheck);
-            $this->log(__METHOD__,"提交临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck->user_id,$userDutyCheck->workgroup_id,$userDutyCheck]));
-        }else if ($laborReport&&$userDutyCheck->type){
-            LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
-            $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
+            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+            if ($newReport) event(new importEvent($userDutyCheck));
         }
-        $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
         return ['success'=>true,'data'=>$userDutyCheck];
     }
     //搜索临时工下打卡信息
@@ -236,7 +231,8 @@ class PersonnelController extends Controller
             'type'=>'required',
         ],[
             'date_format'=>':attribute 格式错误',
-        ],['checked_at'=>'日期']);
+        ],['checked_at'=>'日期'
+            ,'type'=>'补卡类型']);
         return $validator;
     }
     //打卡审核类型
@@ -250,6 +246,11 @@ class PersonnelController extends Controller
         $userDutyCheck=UserDutyCheck::find($userDutyCheckId);
         $userDutyCheck->type=$userDutyCheckType;
         $userDutyCheck->update();
+        $laborReport=LaborReport::where('user_workgroup_id',$userDutyCheck->workgroup_id)->where('user_id',$userDutyCheck->user_id)->orderBy('id','desc')->first();
+        if ($laborReport&&$userDutyCheck->type){
+            LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
+            $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+        }
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>true,'data'=>$userDutyCheck];
     }

+ 180 - 52
app/Http/Controllers/QRCodeController.php

@@ -3,106 +3,234 @@
 namespace App\Http\Controllers;
 
 use App\UserDetail;
+use App\UserDutyCheck;
 use App\UserToken;
 use App\UserWorkgroup;
 use App\Warehouse;
 use Endroid\QrCode\QrCode;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Cache;
+use mysql_xdevapi\Collection;
 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){
+
+    //获取进出场二维码
+    public function getImportAndExportQRCode($importAndExportQRCodes){
+            foreach ($importAndExportQRCodes as $importAndExportQRCode){
+                $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
+                if ($qrCode_refresh_everyday){
+                    $date=md5(date('Y-m-d'));
+                    $url=url("personnel/checking-in/userDutyCheck/importAndExportClock?key=").$date;
+                    $url=$url."&&importAndExportQRCodeType=".$importAndExportQRCode->type;
+                }else{
+                    $url=url("personnel/checking-in/userDutyCheck/importAndExportClock");
+                    $url=$url."?importAndExportQRCodeType=".$importAndExportQRCode->type;
+                }
+                $qrCode=new QrCode($url);
+                if ($importAndExportQRCode->type){
+                    $fileURL=base_path('public/images/QRCodeIMG/'.$importAndExportQRCode->type.'.png');
+                    if (file_exists($fileURL)){
+                        $importAndExportQRCode->url=url('images/QRCodeIMG/'.$importAndExportQRCode->type.'.png');
+                        continue;
+                    }
+                    $qrCode->writeFile($fileURL);
+                    $importAndExportQRCode->url=url('images/QRCodeIMG/'.$importAndExportQRCode->type.'.png');
+                }
+            }
+        return $importAndExportQRCodes;
+    }
+
+    //第一次进入进出场二维码显示页面
+    public function importAndExportQRCode(){
+        $importAndExportQRCodes=[];
+        $userDutyCheckOne=new UserDutyCheck([
+            'source'=>'进场',
+            'type'=>'import',
+        ]);
+        $userDutyCheck=new UserDutyCheck([
+            'source'=>'出场',
+            'type'=>'export',
+        ]);
+        array_push($importAndExportQRCodes,$userDutyCheckOne,$userDutyCheck);
+        $beforeTime=date('Y-m-d H:i:s');
+        $importAndExportQRCodes=$this->qrCode_refresh_time($importAndExportQRCodes,$beforeTime);
+        Cache::forget('last_refresh_date');
+        return view('personnel/checking-in/importAndExportQRCode',['importAndExportQRCodes'=>$importAndExportQRCodes,'last_refresh_date'=>Cache::get('last_refresh_date'),]);
+
+    }
+    //进出场二维码刷新时间
+    public function qrCode_refresh_time($importAndExportQRCodes,$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);
+            return $this->flushQRCode($importAndExportQRCodes);
         }
         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);
+            return $this->flushQRCode($importAndExportQRCodes);
         }
-        //每次刷新都标记一个cache 新建  每次刷新前判断这个标记时间
-        //直接去本地获取二维码
-        return $this->getQRCode($userWorkgroups);
+        return $this->getImportAndExportQRCode($importAndExportQRCodes);
     }
-    //刷新二维码
-    public function flushQRCode($userWorkgroups){
-        foreach ($userWorkgroups as $userWorkgroup){
+    //刷新进出场二维码方法
+    public function flushQRCode($importAndExportQRCodes){
+        foreach ($importAndExportQRCodes as $importAndExportQRCode){
             $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;
+                $url=url("personnel/checking-in/userDutyCheck/importAndExportClock?key=").$date;
+                $url=$url."&&importAndExportQRCodeType=".$importAndExportQRCode->type;
             }else{
-                $url=url("personnel/checking-in/userDutyCheck/clock");
-                $url=$url."?userWorkgroupID=".$userWorkgroup->id;
+                $url=url("personnel/checking-in/userDutyCheck/importAndExportClock");
+                $url=$url."?importAndExportQRCodeType=".$importAndExportQRCode->type;
             }
             $qrCode=new QrCode($url);
-            if ($userWorkgroup->id){
-                $fileURL=base_path('public/images/QRCodeIMG/'.$userWorkgroup->id.'.png');
+            if ($importAndExportQRCode->type){
+                $fileURL=base_path('public/images/QRCodeIMG/'.$importAndExportQRCode->type.'.png');
                 $qrCode->writeFile($fileURL);
-                $userWorkgroup->url=url('images/QRCodeIMG/'.$userWorkgroup->id.'.png').'?da='.Uuid::uuid1();
+                $importAndExportQRCode->url=url('images/QRCodeIMG/'.$importAndExportQRCode->type.'.png').'?da='.Uuid::uuid1();
             }
         }
-        return $userWorkgroups;
+        return $importAndExportQRCodes;
     }
-    //获取二维码
-    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{
+    //刷新进出场二维码页面
+    public function refreshQRCode(Request $request){
+        $beforeTime=$request->input('beforeTime');
+        $importAndExportQRCodes=[];
+        $userDutyCheckOne=new UserDutyCheck([
+            'type'=>'import',
+            'source'=>'进场',
+        ]);
+        $userDutyCheck=new UserDutyCheck([
+            'type'=>'export',
+            'source'=>'出场',
+        ]);
+        array_push($importAndExportQRCodes,$userDutyCheckOne,$userDutyCheck);
+        $importAndExportQRCodes=$this->qrCode_refresh_time($importAndExportQRCodes,$beforeTime);
+        $csrfToken=csrf_token();
+        return ['importAndExportQRCodes'=>$importAndExportQRCodes,'last_refresh_date'=>Cache::get('last_refresh_date'),'csrf_Token'=>$csrfToken];
+    }
+
+    //点击仓获取仓下所有工作组页面
+    public function getUserWorkGroups(Request $request){
+        $warehouseId=$request->input('warehouseId');
+        $userWorkgroups=UserWorkgroup::where('warehouse_id',$warehouseId)->get();
+        if (!$userWorkgroups)return view('exception.404',['error'=>'未找到工作组!']);
+        return view('personnel/checking-in/getUserWorkGroups',['userWorkgroups'=>$userWorkgroups]);
+    }
+
+    //进入工作组二维码显示页面
+    public function QRCode(Request $request){
+        $userWorkgroupId=$request->input('userWorkgroupId');
+        $userWorkgroup=UserWorkgroup::find($userWorkgroupId);
+        $userWorkgroup=$this->getQRCode($userWorkgroup);
+        if (!$userWorkgroup)return view('exception.404',['error'=>'未找到工作组!']);
+        return view('personnel/checking-in/QRcode',['userWorkgroup'=>$userWorkgroup]);
+    }
+
+    //获取工作组二维码
+    public function getQRCode($userWorkgroup){
                 $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;
+        return $userWorkgroup;
+    }
 
+//    //进入刷新二维码页面
+//    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);
+//        $csrfToken=csrf_token();
+//        if (!$userWorkgroups)return view('exception.404',['error'=>'未找到工作组!']);
+//        return ['userWorkgroups'=>$userWorkgroups,'last_refresh_date'=>Cache::get('last_refresh_date'),'csrf_Token'=>$csrfToken];
+//    }
+
+//    //二维码刷新时间
+//    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);
-        $csrfToken=csrf_token();
-        if (!$userWorkgroups)return view('exception.404',['error'=>'未找到工作组!']);
-        return ['userWorkgroups'=>$userWorkgroups,'last_refresh_date'=>Cache::get('last_refresh_date'),'csrf_Token'=>$csrfToken];
-    }
-    //第一次进入二维码显示页面
-    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'),]);
-    }
 }

+ 349 - 149
app/Http/Controllers/UserDutyCheckController.php

@@ -4,12 +4,14 @@ namespace App\Http\Controllers;
 
 use App\Events\ClockinEvent;
 use App\Events\ClockoutEvent;
+use App\Events\importEvent;
 use App\LaborCompany;
 use App\LaborReport;
 use App\User;
 use App\UserDetail;
 use App\UserDutyCheck;
 use App\UserLabor;
+use App\UserWorkgroup;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -19,104 +21,155 @@ use Ramsey\Uuid\Uuid;
 
 class UserDutyCheckController extends Controller
 {
-    //校验二维码进入打卡页面
-    public function clock(Request $request){
-        $userWorkgroupID=$request->input('userWorkgroupID');
+
+
+    //校验二维码进入进出场打卡页面
+    public function importAndExportClock(Request $request){
+        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
         $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 view('exception.404',['error'=>'二维码失效!']);
+            if (!$key) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
             $date=md5(date('Y-m-d'));
-            if ($key!=$date) return view('exception.404',['error'=>'二维码失效!']);
+            if ($key!=$date) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
         }
         if ($qrCode_refresh){
             $key=$request->input('key');
-            if (!$key) return view('exception.404',['error'=>'二维码失效!']);
+            if (!$key) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
             $date=date('Y-m-d H:i:s');
-            if ($key<$date) return view('exception.404',['error'=>'二维码失效!']);
+            if ($key<$date) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
         }
         $userLaborToken=$request->cookie('userLaborToken');
         if ($userLaborToken && Cache::has('dutyCheckTokenStr_'.$userLaborToken)) {
             $user_id=Cache::get('dutyCheckTokenStr_'.$userLaborToken);
             $userDetail=UserDetail::find($user_id);
-            if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$userDetail->mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
-            $userDutyCheck=$this->dutyCheck($userDetail->user_id,$userWorkgroupID);
-            if ($userDutyCheck&&$userDutyCheck->type=='登入'){
-                event(new ClockinEvent($userDutyCheck));
-            }else if ($userDutyCheck&&$userDutyCheck->type=='登出'){
-                event(new ClockoutEvent($userDutyCheck));
-            }
-            //正常情况
-            $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 ($laborReport&&$userDutyCheck->type=='登出'){
-                LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
-                $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode($laborReport));
+            if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$userDetail->mobile_phone)->with("importAndExportQRCodeType",$importAndExportQRCodeType);
+            $userDutyCheck=$this->importAndExportDutyCheck($user_id,$importAndExportQRCodeType);
+            $dateNow=Carbon::now()->format('Y-m-d');
+            $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+            //判断当前日期下临时工是否有临时工报表记录并且是进场打卡
+            if (!$laborReport&&$importAndExportQRCodeType=='import'){
+                $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
+                $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+                if ($newReport) event(new importEvent($userDutyCheck));
+
             }
-            if ($userDutyCheck&&$userDutyCheck->error==true)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+//else if(!$laborReport&&$importAndExportQRCodeType=='export'){
+//                //退场时间跨天情况
+//                $yesterdayDate=Carbon::now()->subDays(1)->format('Y-m-d');
+//                $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$yesterdayDate.'%')->orderBy('id','asc')->first();
+//                if ($laborReport){
+//
+//                }
+//            }else if($laborReport){
+//
+//            }
+            if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
+            if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
             if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-                $group_name=$userDutyCheck->userWorkgroup['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]);
+            return response()->view('personnel/checking-in/importAndExportSuccess',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix]);
         }
-        return view("personnel/checking-in/clock",compact('userWorkgroupID'));
+        return view("personnel/checking-in/importAndExportClock",compact('importAndExportQRCodeType'));
     }
 
     //提交打卡
     public function storeClock(Request $request){
+        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
         $mobile_phone=$request->input('mobile_phone');
-        $userWorkgroupID=$request->input('userWorkgroupID');
         $this->validator($request)->validate();
         $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
-        if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
+        if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$mobile_phone)->with("importAndExportQRCodeType",$importAndExportQRCodeType);
         if (Cache::has('dutyCheckTokenUser_'.$userDetail->user_id))return "<h1 style='color: red;text-align:center'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
         $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);
+            return redirect('personnel/checking-in/userDutyCheck/updateUserDetail/'.$mobile_phone)->with("importAndExportQRCodeType",$importAndExportQRCodeType);
         }
-        $userDutyCheck=$this->dutyCheck($userDetail->user_id,$userWorkgroupID);
-        if ($userDutyCheck&&$userDutyCheck->type=='登入'){
-            event(new ClockinEvent($userDutyCheck));
-        }else if ($userDutyCheck&&$userDutyCheck->type=='登出'){
-            event(new ClockoutEvent($userDutyCheck));
-        }
-        //正常情况
-        $laborReport=LaborReport::where('user_workgroup_id',$userWorkgroupID)->where('created_at','like',$dateNow."%")->where('user_id',$userDetail->user_id)->first();
-            if ($laborReport&&$userDutyCheck->type=='登出'){
-            LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
-            $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+        $userDutyCheck=$this->importAndExportDutyCheck($userDetail->user_id,$importAndExportQRCodeType);
+        $dateNow=Carbon::now()->format('Y-m-d');
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+        if (!$laborReport){
+            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
+            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+            if ($newReport) event(new importEvent($userDutyCheck));
         }
-        if ($userDutyCheck&&$userDutyCheck->error==true)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+        if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
+        if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
         if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
-        $group_name=$userDutyCheck->userWorkgroup['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])
+        return response()->view('personnel/checking-in/importAndExportSuccess',['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  importAndExportDutyCheck($user_id,$importAndExportQRCodeType){
+        $dateNow=Carbon::now()->format('Y-m-d');
+        $userDutyCheckOld=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$dateNow.'%')->orderBy('id','desc')->limit(10)->first();
+        $date=date('Y-m-d H:i:s');
+        $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode([$user_id,$date]));
+        $userDutyCheck=new UserDutyCheck([
+            'user_id'=>$user_id,
+            'checked_at'=>$date,
+            'source'=>'正常',
+        ]);
+        if (!$userDutyCheckOld){
+            //跨天登出情况
+            if ($importAndExportQRCodeType&&$importAndExportQRCodeType=='export'){
+                //当前日期的前一天
+                $yesterday=Carbon::yesterday()->format('Y-m-d');
+                $userDutyCheckYesterday=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$yesterday.'%')->orderBy('id','desc')->limit(10)->first();
+                if ($userDutyCheckYesterday&&$userDutyCheckYesterday->type=='登入'){
+                    $userDutyCheck->type='登出';
+                    $userDutyCheck->save();
+                    return $userDutyCheck;
+                }
+            }
+            $userDutyCheck->type="登入";
+            $userDutyCheck->save();
+            return $userDutyCheck;
+        }
+        if ($importAndExportQRCodeType&&$importAndExportQRCodeType=='import'){
+            if ($userDutyCheckOld->type=='登入'){
+                $userDutyCheck->import=true;//已入场的不能再入场
+                return $userDutyCheck;
+            }
+            $userDutyCheck->type='登入';
+        }
+        if ($importAndExportQRCodeType&&$importAndExportQRCodeType=='export'){
+            if ($userDutyCheckOld->type=='登出'){
+                $userDutyCheck->export=true;//已出场的不能再出场
+                return $userDutyCheck;
+            }
+            $userDutyCheck->type='登出';
+        }
+        $userDutyCheck->save();
+        return $userDutyCheck;
+    }
+
     //去往登记资料页面
     public function createUserDetail($mobile_phone){
-        $userWorkgroupID=session("userWorkgroupID");
+        $importAndExportQRCodeType=session("importAndExportQRCodeType");
         $laborCompanies=LaborCompany::select('id','name')->get();
-        return view('personnel/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone,'userWorkgroupID'=>$userWorkgroupID,'laborCompanies'=>$laborCompanies]);
+        return view('personnel/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone,'importAndExportQRCodeType'=>$importAndExportQRCodeType,'laborCompanies'=>$laborCompanies]);
     }
     //七天未打卡去往选择劳务所页面
     public function updateUserDetail($mobile_phone){
-        $userWorkgroupID=session("userWorkgroupID");
+        $importAndExportQRCodeType=session("importAndExportQRCodeType");
         $laborCompanies=LaborCompany::select('id','name')->get();
-        return view('personnel/checking-in/updateUserDetail',['mobile_phone'=>$mobile_phone,'userWorkgroupID'=>$userWorkgroupID,'laborCompanies'=>$laborCompanies]);
+        return view('personnel/checking-in/updateUserDetail',['mobile_phone'=>$mobile_phone,'importAndExportQRCodeType'=>$importAndExportQRCodeType,'laborCompanies'=>$laborCompanies]);
     }
-    //提交修改资料
+    //提交临时工修改资料
     public  function storeUpdateUserDetail(Request $request){
-        $this->validator($request)->validate();
+        $this->updateValidator($request)->validate();
+        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
         $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');
@@ -125,28 +178,49 @@ class UserDutyCheckController extends Controller
             'labor_company_id'=>$labor_company_id,
         ]);
         $this->log(__METHOD__,"更改临时工劳务所信息".__FUNCTION__,json_encode($userLabor),Auth::user()['id']);
-        $userDutyCheck=$this->dutyCheck($userDetail->user_id,$userWorkgroupID);
-        if ($userDutyCheck&&$userDutyCheck->type=='登入'){
-            event(new ClockinEvent($userDutyCheck));
-        }else if ($userDutyCheck&&$userDutyCheck->type=='登出'){
-            event(new ClockoutEvent($userDutyCheck));
+        $userDutyCheck=$this->importAndExportDutyCheck($userDetail->user_id,$importAndExportQRCodeType);
+        $dateNow=Carbon::now()->format('Y-m-d');
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+        if (!$laborReport){
+            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
+            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+            if ($newReport){
+                event(new importEvent($userDutyCheck));
+            }
         }
-        if ($userDutyCheck&&$userDutyCheck->error==true)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+        if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
+        if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
         if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
         $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all()));
-        $group_name=$userDutyCheck->userWorkgroup['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])
+        return response()->view('personnel/checking-in/importAndExportSuccess',['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 updateValidator(Request $request){
+        $updateValidator=Validator::make($request->input(),[
+            'mobile_phone'=>['required','integer','digits:11'],
+            'labor_company_id'=>['filled'],
+        ],[
+            'filled' => ':attribute 不能为空',
+            'required'=>':attribute 为必填项',
+            'integer'=>':attribute 数字类型',
+            'digits'=>':attribute 必须是11位',
+        ],[
+            'mobile_phone'=>'手机号',
+            'labor_company_id'=>'劳务所',
+        ]);
+        return $updateValidator;
+    }
+
     //提交登记资料
     public  function storeUserDetail(Request $request){
         $this->validator($request)->validate();
+        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
         $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(),
@@ -167,110 +241,32 @@ class UserDutyCheckController extends Controller
             'labor_company_id'=>$labor_company_id,
         ]);
         $userLabor->save();
-        $userDutyCheck=$this->dutyCheck($user->id,$userWorkgroupID);
-        if ($userDutyCheck&&$userDutyCheck->type=='登入'){
-            event(new ClockinEvent($userDutyCheck));
-        }else if ($userDutyCheck&&$userDutyCheck->type=='登出'){
-            event(new ClockoutEvent($userDutyCheck));
+        $userDutyCheck=$this->importAndExportDutyCheck($user->id,$importAndExportQRCodeType);
+        $dateNow=Carbon::now()->format('Y-m-d');
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+        if (!$laborReport){
+            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
+            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+            if ($newReport){
+                event(new importEvent($userDutyCheck));
+            }
         }
-        if ($userDutyCheck&&$userDutyCheck->error==true)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+        if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
+        if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
         if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
         $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all()));
-        $group_name=$userDutyCheck->userWorkgroup['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])
+        return response()->view('personnel/checking-in/importAndExportSuccess',['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,$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();
-            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;//重复打卡
-            if($userWorkgroupID!=$userDutyCheckOld['workgroup_id']&&$userDutyCheckOld->type=='登入'){
-                if ($userDutyCheck->error){
-                    $userDutyCheck->error=false;
-                }
-                $userDutyCheckOld->checked_at=$date;
-                $userDutyCheckOld->verify_user_id=null;
-                $userDutyCheckOld->workgroup_id=$userWorkgroupID;
-                $userDutyCheckOld->group_user_id=null;
-                $userDutyCheckOld->update();
-                return $userDutyCheckOld;
-            }
-            return $userDutyCheck;
-        }
-        if ($userWorkgroupID!=$userDutyCheckOld['workgroup_id']&&$userDutyCheckOld->type=="登入"&&$userDutyCheck->type="登出"){
-            if ($diffDate>=1380){
-                $userDutyCheck->type="登入";
-            }else{
-                $userDutyCheck->workgroup_id=$userDutyCheckOld['workgroup_id'];
-            }
-
-        }
-            if ($userDutyCheckOld->type=="登入"){
-            switch ($diffDate){
-                case $diffDate<=20:
-                    $userDutyCheck->type="登入";
-                    $userDutyCheck->workgroup_id=$userDutyCheckOld->workgroup_id;
-                    break;
-                case $diffDate>=1380:
-                    $userDutyCheck->type="登入";
-                    break;
-                default:
-                    $userDutyCheck->type="登出";
-                    $userDutyCheck->verify_user_id=0;
-            }
-        }
-        if ($userDutyCheckOld->type=="登出"){
-            switch ($diffDate){
-                case $diffDate<=20:
-                    $userDutyCheck->type="登出";
-                    $userDutyCheck->verify_user_id=0;
-                    $userDutyCheck->workgroup_id=$userDutyCheckOld->workgroup_id;
-                    break;
-                default:
-                    $userDutyCheck->type="登入";
-            }
-        }
-        $userDutyCheck->save();
-        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'],
+            'labor_company_id'=>['filled'],
         ],[
             'unique'=>':attribute 已经存在,不能重复!',
             'filled' => ':attribute 不能为空',
@@ -279,11 +275,215 @@ class UserDutyCheckController extends Controller
             'digits'=>':attribute 必须是11位',
         ],[
             'full_name'=>'姓名',
-            'userWorkgroupID'=>'工作组ID',
             'gender'=>'性别',
             'mobile_phone'=>'手机号',
             'identity_number' => '身份证号',
+            'labor_company_id'=>'劳务所',
         ]);
         return $validator;
     }
+
+    //校验工作组二维码进入打卡页面
+    public function clock(Request $request){
+        $userWorkgroupID=$request->input('userWorkgroupID');
+        $userLaborToken=$request->cookie('userLaborToken');
+        if ($userLaborToken && Cache::has('dutyCheckTokenStr_'.$userLaborToken)) {
+            $user_id=Cache::get('dutyCheckTokenStr_'.$userLaborToken);
+            $userDetail=UserDetail::find($user_id);
+            $dateNow=Carbon::now()->format('Y-m-d');
+            $group_name=UserWorkgroup::where('id',$userWorkgroupID)->value('name');
+            $laravelEchoPrefix = config('database.redis.options.prefix');
+            $laborReportHas=LaborReport::where('user_id',$user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+            if(!$laborReportHas)return "<h1 style='color: red;text-align:center'>进场是否未打卡?如若未打,请先返回打进场卡!</h1>";
+            //判断是否是第一次进组
+            $laborReport=LaborReport::where('user_id',$user_id)->where('user_workgroup_id',null)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+            if ($laborReport){
+                $newLaborReport=LaborReport::intoGroupAndUpdateLaborReportData($laborReport,$userWorkgroupID);
+                $this->log(__METHOD__,"当日首次进组更新临时工报表记录__".__FUNCTION__,json_encode($request->all()));
+                if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+                if ($newLaborReport){
+                    event(new ClockinEvent($newLaborReport));
+                }
+                return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix]);
+            }else{
+                $laborReport=LaborReport::where('user_id',$user_id)->where('user_workgroup_id',$userWorkgroupID)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+                //此处表示临时工当日换组操作
+                if (!$laborReport){
+                    $newLaborReport=LaborReport::changeGroupAndCreateLaborReportData($user_id,$userWorkgroupID);
+                    $this->log(__METHOD__,"当日临时工换组新建临时工报表记录__".__FUNCTION__,json_encode([$user_id,$userWorkgroupID]));
+                    if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+                    if ($newLaborReport){
+                        event(new ClockinEvent($newLaborReport));
+                    }
+                    return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix]);
+                }else{
+                    return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+                }
+            }
+        }
+        return view("personnel/checking-in/clock",compact('userWorkgroupID'));
+    }
+    //进组提交打卡
+    public function importGroupClock(Request $request){
+        $mobile_phone=$request->input('mobile_phone');
+        $userWorkgroupID=$request->input('userWorkgroupID');
+        $this->validator($request)->validate();
+        $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
+        if (Cache::has('dutyCheckTokenUser_'.$userDetail->user_id))return "<h1 style='color: red;text-align:center'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
+        $dateNow=Carbon::now()->format('Y-m-d');
+        $group_name=UserWorkgroup::where('id',$userWorkgroupID)->value('name');
+        $laravelEchoPrefix = config('database.redis.options.prefix');
+        $laborReportHas=LaborReport::where('user_id',$userDetail->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+        if(!$laborReportHas)return "<h1 style='color: red;text-align:center'>进场是否未打卡?如若未打,请先返回打进场卡!</h1>";
+        //判断是否是第一次进组
+        $laborReport=LaborReport::where('user_id',$userDetail->user_id)->where('user_workgroup_id',null)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+        if ($laborReport){
+            $newLaborReport=LaborReport::intoGroupAndUpdateLaborReportData($laborReport,$userWorkgroupID);
+            $this->log(__METHOD__,"当日首次进组更新临时工报表记录__".__FUNCTION__,json_encode($request->all()));
+            if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+            if ($newLaborReport){
+                event(new ClockinEvent($newLaborReport));
+            }
+            return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix]);
+        }else{
+            $laborReport=LaborReport::where('user_id',$userDetail->user_id)->where('user_workgroup_id',$userWorkgroupID)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+            //此处表示临时工当日换组操作
+            if (!$laborReport){
+                $newLaborReport=LaborReport::changeGroupAndCreateLaborReportData($userDetail->user_id,$userWorkgroupID);
+                $this->log(__METHOD__,"当日临时工换组新建临时工报表记录__".__FUNCTION__,json_encode([$userDetail->user_id,$userWorkgroupID]));
+                if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+                if ($newLaborReport){
+                    event(new ClockinEvent($newLaborReport));
+                }
+                $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
+                return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix])
+                    ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
+            }else{
+                return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+            }
+        }
+
+    }
+
+
+
+//    //根据用户提交打卡记录
+//    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();
+//            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;//重复打卡
+//            if($userWorkgroupID!=$userDutyCheckOld['workgroup_id']&&$userDutyCheckOld->type=='登入'){
+//                if ($userDutyCheck->error){
+//                    $userDutyCheck->error=false;
+//                }
+//                $userDutyCheckOld->checked_at=$date;
+//                $userDutyCheckOld->verify_user_id=null;
+//                $userDutyCheckOld->workgroup_id=$userWorkgroupID;
+//                $userDutyCheckOld->group_user_id=null;
+//                $userDutyCheckOld->update();
+//                return $userDutyCheckOld;
+//            }
+//            return $userDutyCheck;
+//        }
+//        if ($userWorkgroupID!=$userDutyCheckOld['workgroup_id']&&$userDutyCheckOld->type=="登入"&&$userDutyCheck->type="登出"){
+//            if ($diffDate>=1380){
+//                $userDutyCheck->type="登入";
+//            }else{
+//                $userDutyCheck->workgroup_id=$userDutyCheckOld['workgroup_id'];
+//            }
+//
+//        }
+//        if ($userDutyCheckOld->type=="登入"){
+//            switch ($diffDate){
+//                case $diffDate<=20:
+//                    $userDutyCheck->type="登入";
+//                    $userDutyCheck->workgroup_id=$userDutyCheckOld->workgroup_id;
+//                    break;
+//                case $diffDate>=1380:
+//                    $userDutyCheck->type="登入";
+//                    break;
+//                default:
+//                    $userDutyCheck->type="登出";
+//                    $userDutyCheck->verify_user_id=0;
+//            }
+//        }
+//        if ($userDutyCheckOld->type=="登出"){
+//            switch ($diffDate){
+//                case $diffDate<=20:
+//                    $userDutyCheck->type="登出";
+//                    $userDutyCheck->verify_user_id=0;
+//                    $userDutyCheck->workgroup_id=$userDutyCheckOld->workgroup_id;
+//                    break;
+//                default:
+//                    $userDutyCheck->type="登入";
+//            }
+//        }
+//        $userDutyCheck->save();
+//        return $userDutyCheck;
+//    }
+    //进组提交打卡
+//    public function importGroupClock(Request $request){
+//        $mobile_phone=$request->input('mobile_phone');
+//        $userWorkgroupID=$request->input('userWorkgroupID');
+//        $this->validator($request)->validate();
+//        $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
+//        if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
+//        if (Cache::has('dutyCheckTokenUser_'.$userDetail->user_id))return "<h1 style='color: red;text-align:center'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
+//        $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);
+//        if ($userDutyCheck&&$userDutyCheck->type=='登入'){
+//            event(new ClockinEvent($userDutyCheck));
+//        }else if ($userDutyCheck&&$userDutyCheck->type=='登出'){
+//            event(new ClockoutEvent($userDutyCheck));
+//        }
+//        //正常情况
+//        $laborReport=LaborReport::where('user_workgroup_id',$userDutyCheck->workgroup_id)->where('user_id',$userDutyCheck->user_id)->orderBy('id','desc')->first();
+//        if ($laborReport&&$userDutyCheck->type=='登出'){
+//            LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
+//            $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+//        }
+//        if ($userDutyCheck&&$userDutyCheck->error==true)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+//        if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+//        $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
+//        $group_name=$userDutyCheck->userWorkgroup['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'),'/');
+//    }
 }

+ 153 - 68
app/LaborReport.php

@@ -14,7 +14,11 @@ 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','group_user_id','check_out_at','online_duration','working_duration',
+        'id','enter_number','user_workgroup_id','user_id','name','mobile_phone','identity_number','labor_company',
+        'check_in_at','verify_at','group_user_id','check_out_at','online_duration','working_duration','created_at',
+    ];
+    protected $appends = [
+        'is_exportGroup',
     ];
 
     public function userWorkgroup(){
@@ -23,19 +27,70 @@ class LaborReport extends Model
     public function user(){
         return $this->belongsTo('App\User','group_user_id','id');
     }
+    public function userDutyCheck(){
+        return $this->belongsTo('App\UserDutyCheck','user_id','user_id');
+    }
+    public function getIsExportGroupAttribute(){
+        return $this['check_out_at']? true:false;
+    }
 
-    //添加临时工报表数据
-    static function createLaborReportData($user_id,$userWorkgroupID,$userDutyCheck){
+    //进场创建临时工报表信息
+    static function importToCreateLaborReportData($userDutyCheck){
+        $userDetail=UserDetail::find($userDutyCheck->user_id);
+        $name=$userDetail['full_name'];
+        $mobile_phone=$userDetail['mobile_phone'];
+        $identity_number=$userDetail['identity_number'];
+        $labor_company_id=UserLabor::where('user_id',$userDutyCheck->user_id)->value('labor_company_id');
+        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
+        $laborReport=new LaborReport([
+            'enter_number'=>$userDutyCheck->user_id,
+            'user_id'=>$userDutyCheck->user_id,
+            'name'=>$name,
+            'mobile_phone'=>$mobile_phone,
+            'identity_number'=>$identity_number,
+            'labor_company'=>$labor_company,
+        ]);
+        $laborReport->save();
+        return $laborReport;
+    }
+    //出场更新临时工报表信息
+    static function exportToCreateLaborReportData($laborReport,$userDutyCheck){
+        $userDetail=UserDetail::find($userDutyCheck->user_id);
+        $name=$userDetail['full_name'];
+        $mobile_phone=$userDetail['mobile_phone'];
+        $identity_number=$userDetail['identity_number'];
+        $labor_company_id=UserLabor::where('user_id',$userDutyCheck->user_id)->value('labor_company_id');
+        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
+        $laborReport=new LaborReport([
+            'enter_number'=>$userDutyCheck->user_id,
+            'user_id'=>$userDutyCheck->user_id,
+            'name'=>$name,
+            'mobile_phone'=>$mobile_phone,
+            'identity_number'=>$identity_number,
+            'labor_company'=>$labor_company,
+        ]);
+        $laborReport->save();
+        return $laborReport;
+    }
+    //当天第一次进工作组更新临时工报表
+    static function intoGroupAndUpdateLaborReportData($laborReport,$userWorkgroupID){
+        $laborReport->user_workgroup_id=$userWorkgroupID;
+        $laborReport->check_in_at=date('Y-m-d H:i:s');
+        $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 $laborReport;
+    }
+
+    //换组添加临时工报表数据
+    static function changeGroupAndCreateLaborReportData($user_id,$userWorkgroupID){
         $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'];
-        }
-        $date=date('Y-m-d H:i:s');
         $laborReport=new LaborReport([
             'enter_number'=>Uuid::uuid1(),
             'user_workgroup_id'=>$userWorkgroupID,
@@ -44,9 +99,7 @@ class LaborReport extends Model
             'mobile_phone'=>$mobile_phone,
             'identity_number'=>$identity_number,
             'labor_company'=>$labor_company,
-            'check_in_at'=>$check_in_at,
-            'verify_at'=>$date,
-            'group_user_id'=>$userDutyCheck->group_user_id,
+            'check_in_at'=>date('Y-m-d H:i:s'),
         ]);
         $laborReport->save();
         $number_id=$laborReport->id;
@@ -55,65 +108,97 @@ class LaborReport extends Model
         $laborReport->update();
         return $laborReport;
     }
-    //修改临时工报表数据
-    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']=$hour;
-                $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 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;
-    }
+//    //添加临时工报表数据
+//    static function createLaborReportData($userDutyCheck){
+//        $userDetail=UserDetail::find($userDutyCheck->user_id);
+//        $name=$userDetail['full_name'];
+//        $mobile_phone=$userDetail['mobile_phone'];
+//        $identity_number=$userDetail['identity_number'];
+//        $labor_company_id=UserLabor::where('user_id',$userDutyCheck->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'];
+//        }
+//        $date=date('Y-m-d H:i:s');
+//        $laborReport=new LaborReport([
+//            'enter_number'=>Uuid::uuid1(),
+//            'user_workgroup_id'=>$userDutyCheck->workgroup_id,
+//            'user_id'=>$userDutyCheck->user_id,
+//            'name'=>$name,
+//            'mobile_phone'=>$mobile_phone,
+//            'identity_number'=>$identity_number,
+//            'labor_company'=>$labor_company,
+//            'check_in_at'=>$check_in_at,
+//            'verify_at'=>$date,
+//            'group_user_id'=>$userDutyCheck->group_user_id,
+//        ]);
+//        $laborReport->save();
+//        $number_id=$laborReport->id;
+//        $enter_number=$userDutyCheck->workgroup_id.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 $laborReport;
+//    }
+//    //修改临时工报表数据
+//    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']=$hour;
+//                $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 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;
+//    }
     //修改临时工报表审核时间
     static function updateLaborReportVerify($laborReport,$userDutyCheck){
         $date=date('Y-m-d H:i:s');

+ 1 - 0
app/UserDutyCheck.php

@@ -2,6 +2,7 @@
 
 namespace App;
 
+use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
 

+ 0 - 7
app/UserLabor.php

@@ -27,13 +27,6 @@ class UserLabor extends Model
         return $this->belongsTo('App\LaborCompany');
     }
     public function getIsRelieveFacilityAttribute(){
-         // return  $this->userDetail()->hasDutyCheckToken();
-//        $token=Cache::get('dutyCheckTokenUser_'.$this['user_id']);
-//        if ($token){
-//            return true;
-//        }else{
-//            return Cache::has('dutyCheckTokenStr_'.$token);
-//        }
         return Cache::has('dutyCheckTokenUser_'.$this['user_id']);
     }
 

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

@@ -16,7 +16,7 @@ class CreateLaborReportsTable extends Migration
         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_workgroup_id')->index()->comment('外键工作组');
             $table->bigInteger('user_id')->index()->comment('外键用户');
             $table->string('name')->index()->comment('临时工名称');
             $table->string('mobile_phone')->nullable()->index()->comment('手机号');

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

@@ -18,7 +18,7 @@ class CreateLaborCompaniesTable extends Migration
             $table->string('name')->unique()->nullable()->comment('劳务所名称');
             $table->timestamps();
         });
-        (new LaborCompany(['name'=>'其他']))->save();
+        //(new LaborCompany(['name'=>'其他']))->save();
     }
 
     /**

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

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeUserDutyCheckTables extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('user_duty_checks', function (Blueprint $table) {
+            $table->dropColumn('workgroup_id');
+        });
+        Schema::table('user_duty_checks', function (Blueprint $table) {
+            $table->bigInteger('workgroup_id')->nullable()->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_07_02_142427_change_labor_reports_tables.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeLaborReportsTables extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->dropColumn('user_workgroup_id');
+        });
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->bigInteger('user_workgroup_id')->nullable()->index()->comment('外键工作组');
+            $table->bigInteger('relax_time')->nullable()->comment('晚饭时长');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->dropColumn('user_workgroup_id');
+            $table->dropColumn('relax_time');
+        });
+    }
+}

+ 0 - 3
laravel-echo-server.lock

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

BIN
public/images/QRCodeIMG/10.png


BIN
public/images/QRCodeIMG/4.png


BIN
public/images/QRCodeIMG/5.png


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

@@ -37,7 +37,7 @@
                     <span class="fa fa-hand-scissors-o" style="color: #726e1b"></span>
                     二次加工管理</a></li> @endcan
         @can('人事管理')
-            <li class="nav-item"><a href="{{url("personnel/checking-in/createReplenishClock")}}" class="nav-link"
+            <li class="nav-item"><a href="{{url("personnel/laborReport")}}" class="nav-link"
                                     :class="{active:isActive('personnel',1)}">
                     <span class="fa fa-header" style="color: #72441b"></span>
                     人事管理</a></li> @endcan

+ 28 - 46
resources/views/personnel/checking-in/QRcode.blade.php

@@ -8,7 +8,7 @@
     <meta name="csrf-token" content="{{ csrf_token() }}">
     <title>显示二维码 BsWAS</title>
     <!-- Styles -->
-    <link href="{{ asset('css/app200629c.css') }}" rel="stylesheet">
+    <link href="{{ asset('css/app200519b.css') }}" rel="stylesheet">
 </head>
 <body>
     <div class="container-fluid " id="page">
@@ -18,22 +18,20 @@
                     <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-sm-3  col-lg-3 col-xl-3 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 v-if="userWorkgroups.length>3">--}}
+{{--                <div class="row row-cols-3">--}}
+{{--                    <div class="col-sm-3  col-lg-3 col-xl-3 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 class="row">
-                        <div class="col text-center" style="float:left;" v-for="userWorkgroup in userWorkgroups">
+                        <div class="col text-center" style="float:left;">
                             <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>
@@ -41,44 +39,28 @@
 
     <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;
-            }
-        }
         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}}',
+                userWorkgroup:{!! $userWorkgroup !!},
             },
-            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;
-                            $("meta[name='csrf-token']").attr('content', response.data.csrf_Token);
-                            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();
-            }
+            {{--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;--}}
+            {{--                $("meta[name='csrf-token']").attr('content', response.data.csrf_Token);--}}
+            {{--                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>

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

@@ -1,25 +1,30 @@
 <!DOCTYPE html>
 <html>
-    <head>
-        <meta charset="utf-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1">
-        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
-    </head>
-    <body>
-        <div class="card col-md-8 offset-md-2 mt-5">
-            <div class="card-body">
-                <form method="post" action="{{url('personnel/checking-in/userDutyCheck/storeClock')}}">
-                    @csrf
-                    <div class="form-group row">
-                        <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 type="hidden" name="userWorkgroupID" value="{{ old('userWorkgroupID',$userWorkgroupID)}}">
-                    <div class="form-group row pt-3">
-                        <button type="submit" class="col-7 offset-3 btn btn-success">提交</button>
-                    </div>
-                </form>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
+</head>
+<body>
+<div class="card col-md-8 offset-md-2 mt-5">
+    <div class="card-body">
+        <form method="post" action="{{url('personnel/checking-in/userDutyCheck/importGroupClock')}}">
+            @csrf
+            <div class="form-group row">
+                <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">
+                @error('mobile_phone')
+                <span class="invalid-feedback" role="alert">
+                    <strong>{{ $message }}</strong>
+                    </span>
+                @enderror
             </div>
-        </div>
-    </body>
+            <input type="hidden" name="userWorkgroupID" value="{{ old('userWorkgroupID',$userWorkgroupID)}}">
+            <div class="form-group row pt-3">
+                <button type="submit" class="col-7 offset-3 btn btn-success">提交</button>
+            </div>
+        </form>
+    </div>
+</div>
+</body>
 </html>

+ 13 - 11
resources/views/personnel/checking-in/clockAudit.blade.php

@@ -99,17 +99,17 @@
                 ],
                 permittingWorkgroups:{!! $permittingWorkgroups !!},
             },
-            mounted(){
-                initEcho();
-                this.permittingWorkgroups.forEach(function(workgroup){
-                    Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockinEvent',(e)=>{
-                        window.location.reload();
-                    });
-                    Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockoutEvent',(e)=>{
-                        window.location.reload();
-                    });
-                });
-            },
+            {{--mounted(){--}}
+            {{--    initEcho();--}}
+            {{--    this.permittingWorkgroups.forEach(function(workgroup){--}}
+            {{--        Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockinEvent',(e)=>{--}}
+            {{--            window.location.reload();--}}
+            {{--        });--}}
+            {{--        Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockoutEvent',(e)=>{--}}
+            {{--            window.location.reload();--}}
+            {{--        });--}}
+            {{--    });--}}
+            {{--},--}}
             methods:{
                 // 打卡类型修改
                 dutyCheckType:function (e,userDutyCheck) {
@@ -159,6 +159,7 @@
                 store(id,type,url){
 
                 },
+                //门卫审核
                 storeClockAudit(id,type){
                     let url='{{url("personnel/checking-in/storeClockAudit")}}';
                     let _this=this;
@@ -183,6 +184,7 @@
                         tempTip.show('审核失败!网络错误:'+err);
                     });
                 },
+                //组长打卡审核
                 storeGroupAudit(id,type){
                     let url='{{url("personnel/checking-in/storeGroupAudit")}}';
                     let _this=this;

+ 8 - 1
resources/views/personnel/checking-in/createReplenishClock.blade.php

@@ -45,6 +45,7 @@
                                 <option value="登入">登入</option>
                                 <option value="登出">登出</option>
                             </select>
+                            <small v-if="errors.type && errors.type.length>0 " class="text-danger">@{{ errors.type[0] }}</small>
                         </td>
                         <td><button @click="storeReplenishClock(userLabor)" class="btn btn-info w-100">提交补卡</button></td>
                     </tr>
@@ -102,6 +103,7 @@
                     let _this=this;
                     axios.post("{{url('personnel/checking-in/storeReplenishClock')}}",{user_id:user_id,checked_at:checked_at,type:type})
                         .then(function (response) {
+                            console.log(response.data.data);
                             if (response.data.success){
                                 _this.userLabors.every(function (userLabor) {
                                     if (userLabor.user_id==userLabor.user_id) {
@@ -116,7 +118,12 @@
                                 _this.errors={'checked_at':[],'type':[],};
                                 return;
                             }
-                            _this.errors=response.data.data;
+                            if (response.data.result){
+                                tempTip.setDuration(4000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
+                            _this.errors=response.data.error;
                         }).catch(function (err) {
                             tempTip.setDuration(4000);
                             tempTip.show('录入补卡失败!网络错误:'+err);

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

@@ -28,11 +28,11 @@
                 <label for="mobile_phone" class="form-check-label col-3 pull-left">电话:</label>
                 <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">
-{{--                    @error('mobile_phone')--}}
-{{--                    <span class="invalid-feedback" role="alert">--}}
-{{--                    <strong>{{ $message }}</strong>--}}
-{{--                    </span>--}}
-{{--                    @enderror--}}
+                    @error('mobile_phone')
+                    <span class="invalid-feedback" role="alert">
+                    <strong>{{ $message }}</strong>
+                    </span>
+                    @enderror
                 </div>
             </div>
             <div class="form-group row pt-0">
@@ -60,14 +60,20 @@
             <div class="form-group row">
                 <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">
+                    <select name="labor_company_id" id="labor_company_id" class="@error('labor_company_id') is-invalid @enderror  form-control"  type="text">
+                        <option></option>
                         @foreach( $laborCompanies as $laborCompany )
                             <option value="{{$laborCompany->id}}">{{$laborCompany->name}}</option>
                         @endforeach
                     </select>
+                    @error('labor_company_id')
+                    <span class="invalid-feedback" role="alert">
+                    <strong>{{ $message }}</strong>
+                    </span>
+                    @enderror
                 </div>
             </div>
-            <input type="hidden" name="userWorkgroupID" value="{{ old('userWorkgroupID',$userWorkgroupID)}}" >
+            <input type="hidden" name="importAndExportQRCodeType" value="{{ old('importAndExportQRCodeType',$importAndExportQRCodeType)}}" >
             <div class="form-group row pt-3">
                 <button type="submit" class="col-8 offset-3 btn btn-success">登记</button>
             </div>

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

@@ -8,8 +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 align-content-center">
+                <a target="_blank" class="btn list-group-item col-md-2 list-group-item-info" type="button" :href="('{{url('personnel/checking-in/importAndExportQRCode')}}')" >进出场打卡</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'"
+                    <a class="btn list-group-item col-md-2" type="button" :href="('{{url('personnel/checking-in/getUserWorkGroups?warehouseId=')}}'+warehouse.id)"  :class="warehouse==checkedWarehouse ? 'btn-primary' : 'btn-outline-primary'"
                        v-for="warehouse in warehouses">@{{ warehouse.name }}</a>
                 </div>
                 <h3 v-else>还未录入仓库,请先录入仓库!</h3>
@@ -17,7 +20,6 @@
         </div>
     </div>
 @endsection
-
 @section('lastScript')
     <script>
         new Vue({

+ 35 - 0
resources/views/personnel/checking-in/getUserWorkGroups.blade.php

@@ -0,0 +1,35 @@
+@extends('layouts.app')
+@section('title')打卡@endsection
+@section('content')
+    <div id="nav2" class="dontprint">
+        @component('personnel.menu')@endcomponent
+        @component('personnel.checking-in.menuChecking-in')@endcomponent
+    </div>
+    <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 align-content-center" v-if="userWorkgroups">
+                    <a target="_blank"  class="btn list-group-item col-md-2" type="button" :href="('{{url('personnel/checking-in/QRCode?userWorkgroupId=')}}'+userWorkgroup.id)"  :class="userWorkgroup==checkedUserWorkgroup ? 'btn-primary' : 'btn-outline-primary'"
+                       v-for="userWorkgroup in userWorkgroups">@{{ userWorkgroup.name }}</a>
+                </div>
+                <h3 v-else>还未录入工作组,请先录入工作组!</h3>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#page",
+            data:{
+                userWorkgroups:[
+                    @foreach($userWorkgroups as $userWorkgroup)
+                    {!! $userWorkgroup !!},
+                    @endforeach
+                ],
+                checkedUserWorkgroup:'',
+            },
+        });
+    </script>
+@endsection

+ 25 - 0
resources/views/personnel/checking-in/importAndExportClock.blade.php

@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
+    </head>
+    <body>
+        <div class="card col-md-8 offset-md-2 mt-5">
+            <div class="card-body">
+                <form method="post" action="{{url('personnel/checking-in/userDutyCheck/storeClock')}}">
+                    @csrf
+                    <div class="form-group row">
+                        <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 type="hidden" name="importAndExportQRCodeType" value="{{ old('importAndExportQRCodeType',$importAndExportQRCodeType)}}">
+                    <div class="form-group row pt-3">
+                        <button type="submit" class="col-7 offset-3 btn btn-success">提交</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </body>
+</html>

+ 75 - 0
resources/views/personnel/checking-in/importAndExportQRCode.blade.php

@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="icon" href="{{asset('icon/faviconc.ico')}}" type="image/x-icon"/>
+    <!-- CSRF Token -->
+    <meta name="csrf-token" content="{{ csrf_token() }}">
+    <title>显示二维码 BsWAS</title>
+    <!-- Styles -->
+    <link href="{{ asset('css/app200519b.css') }}" rel="stylesheet">
+</head>
+<body>
+    <div class="container-fluid " id="page">
+        <div class="card ">
+            <div class="card-body">
+                <div class="align-content-center m-3" >
+                    <h3 class="text-center text-dark">首次扫描后将与设备绑定,之后扫描需使用原设备与原软件!</h3><br>
+                    <h4 class="text-center text-danger">如更换设备请联系管理人员解除设备绑定!</h4>
+                </div>
+
+                <div class="row-cols-2" v-for="importAndExportQRCode in importAndExportQRCodes">
+                    <div class="col text-center" style="float:left;">
+                            <img id="img" class="img-thumbnail"  :src="importAndExportQRCode.url" />
+                        <p class="font-weight-bold m-2 h5 text-center" style="color: red">@{{ importAndExportQRCode.source }}</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <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;
+            }
+        }
+        new Vue({
+            el:"#page",
+            data:{
+                importAndExportQRCodes:[
+                    @foreach($importAndExportQRCodes as $importAndExportQRCode)
+                    {url:'{{$importAndExportQRCode->url}}', type:'{{$importAndExportQRCode->type}}',source:'{{$importAndExportQRCode->source}}'},
+                    @endforeach
+                ],
+                last_refresh_date:'{{$last_refresh_date}}',
+            },
+            mounted(){
+                let _this=this;
+                let refreshQRCode=function(){
+                    axios.post('{{url('personnel/checking-in/refreshQRCode')}}',{beforeTime:_this.last_refresh_date})
+                        .then(function (response) {
+                            _this.importAndExportQRCodes=response.data.importAndExportQRCodes;
+                            _this.last_refresh_date=response.data.last_refresh_date;
+                            $("meta[name='csrf-token']").attr('content', response.data.csrf_Token);
+                            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>

+ 73 - 0
resources/views/personnel/checking-in/importAndExportSuccess.blade.php

@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <!-- CSRF Token -->
+    <meta name="csrf-token" content="{{ csrf_token() }}">
+</head>
+<body >
+<div style="text-align: center" id="page">
+    <h4 style="margin-bottom: 0">宝时物流 欢迎你</h4><br/>
+    <h5 style="margin-top: 0;color:#B8860B ">
+        @if($type=='登入')
+            <b style="color: #2a9055">进场打卡</b>
+        @endif
+        @if($type=='登出')
+            <b style="color: #2a9055">出场打卡</b>
+        @endif
+    </h5><br/>
+    <h3 style="margin-bottom: 0">姓名:@if($full_name)<b style="color: #2a9055">{{$full_name}}</b>@endif&nbsp;&nbsp;&nbsp;&nbsp;进场时间:@if($checked_at)<b style="color: #2a9055">{{$checked_at}}</b> @endif</h3><br/>
+    @if($type=='登入')
+        <div v-if="userDutyCheck.verify_user_id"><h5 style="color: #2a9055" >门卫审核完成,请到工作组入组打卡审核</h5></div>
+        <h5 v-else style="margin-top: 0;color: red">等待门卫审核,请勿关闭:<span id="_lefttime" ></span></h5>
+    @endif
+
+    @if($type=='登出')
+        <h5 style="margin-top: 0;color: red">下班登出成功</h5>
+    @endif
+</div>
+<script src="{{ asset('js/app.js?202002111414') }}"></script>
+<script>
+    new Vue({
+        el:'#page',
+        data:{
+          userDutyCheck:{
+              verify_user_id:''
+          },
+        },
+        mounted(){
+            initEcho();
+            Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('GuardAuditEvent',(e)=>{
+                let _this=this;
+                let userDutyCheck=e.userDutyCheck;
+                _this.userDutyCheck.verify_user_id=userDutyCheck.verify_user_id;
+            });
+        },
+    });
+    var secondsInit = 0;
+    function _fresh()
+    {
+        secondsInit ++;
+        var seconds = secondsInit;
+        var result = '';
+        if (seconds >= 3600)
+        {
+            var h = Math.floor(seconds / 3600);
+            result += h + "小时";
+            seconds -= 3600 * h;
+        }
+        if (seconds >= 60)
+        {
+            var m = Math.floor(seconds / 60);
+            result += m + "分";
+            seconds -= 60 * m;
+        }
+        result += seconds + "秒";
+        document.getElementById('_lefttime').innerHTML = result;
+    }
+    _fresh()
+    setInterval(_fresh,1000);
+</script>
+</body>
+</html>

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

@@ -9,40 +9,28 @@
 <body >
 <div style="text-align: center" id="page">
     <h4 style="margin-bottom: 0">宝时物流 欢迎你</h4><br/>
-    <h5 style="margin-top: 0;color:#B8860B ">
-        @if($type=='登入')
-            <b style="color: #2a9055">上班打卡</b>
-        @endif
-        @if($type=='登出')
-            <b style="color: #2a9055">下班打卡</b>
-        @endif
-    </h5><br/>
-    <h2 class="text-danger">小组:{{$group_name}}</h2><br/>
-    <h3 style="margin-bottom: 0">姓名:@if($full_name)<b style="color: #2a9055">{{$full_name}}</b>@endif&nbsp;&nbsp;&nbsp;&nbsp;打卡时间:@if($checked_at)<b style="color: #2a9055">{{$checked_at}}</b> @endif</h3><br/>
-    @if($type=='登入')
-        <div v-if="userDutyCheck.group_user_id"><h5 style="color: #2a9055" >组长已确认</h5></div>
+    <h2 class="text-danger">进入组:{{$group_name}}</h2><br/>
+    <h3 style="margin-bottom: 0">姓名:@if($full_name)<b style="color: #2a9055">{{$full_name}}</b>@endif&nbsp;&nbsp;&nbsp;&nbsp;进组时间:@if($check_in_at)<b style="color: #2a9055">{{$check_in_at}}</b> @endif</h3><br/>
+    <div>
+        <div v-if="laborReport.group_user_id"><h5 style="color: #2a9055" >组长已确认</h5></div>
         <h5 v-else style="margin-top: 0;color: red">等待组长确认登入,请勿关闭:<span id="_lefttime" ></span></h5>
-    @endif
-
-    @if($type=='登出')
-        <h5 style="margin-top: 0;color: red">下班登出成功,如是误操作,请在五分钟以后再次登入并找组长确认</h5>
-    @endif
+    </div>
 </div>
 <script src="{{ asset('js/app.js?202002111414') }}"></script>
 <script>
     new Vue({
         el:'#page',
         data:{
-          userDutyCheck:{
+            laborReport:{
               group_user_id:''
           },
         },
         mounted(){
             initEcho();
-            Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('TeamAuditEvent',(e)=>{
+            Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('TeamAuditEvent',(e)=>{
                 let _this=this;
-                let userDutyCheck=e.userDutyCheck;
-                _this.userDutyCheck.group_user_id=userDutyCheck.group_user_id;
+                let laborReport=e.laborReport;
+                _this.laborReport.group_user_id=laborReport.group_user_id;
             });
         },
     });

+ 20 - 4
resources/views/personnel/checking-in/updateUserDetail.blade.php

@@ -12,19 +12,35 @@
             @csrf
             <div class="form-group row">
                 <label for="mobile_phone" class="form-check-label col-3 pull-left">电话:</label>
+                <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 col-7 form-control" type="text">
+                @error('mobile_phone')
+                <span class="invalid-feedback" role="alert">
+                    <strong>{{ $message }}</strong>
+                    </span>
+                @enderror
+            </div>
             </div>
             <div class="form-group row">
                 <label for="labor_company_id" class="form-check-label col-3 pull-left">劳务所:</label>
-                <select name="labor_company_id" id="labor_company_id" class="col-7 form-control" type="text">
+                <div class="col-8">
+                <select name="labor_company_id" id="labor_company_id" class="@error('labor_company_id') is-invalid @enderror col-7 form-control" type="text">
+                    <option></option>
                     @foreach( $laborCompanies as $laborCompany )
                         <option value="{{$laborCompany->id}}">{{$laborCompany->name}}</option>
                     @endforeach
                 </select>
+                @error('labor_company_id')
+                <span class="invalid-feedback" role="alert">
+                    <strong>{{ $message }}</strong>
+                    </span>
+                @enderror
+                </div>
             </div>
-            <input hidden name="userWorkgroupID" value="{{$userWorkgroupID}}">
-            <div class="form-group row pt-3">
-                <button type="submit" class="col-7 offset-3 btn btn-success">提交</button>
+
+            <input hidden name="importAndExportQRCodeType" value="{{ old('importAndExportQRCodeType',$importAndExportQRCodeType)}}">
+            <div class="form-group row pt-4">
+                <button type="submit" class="col-5 offset-3 btn btn-success">提交</button>
             </div>
         </form>
     </div>

+ 230 - 37
resources/views/personnel/laborReport/index.blade.php

@@ -31,20 +31,19 @@
                             <tr>
                                 <td >
                                     <input style="width: 140px" name="created_at_start" type="date" v-model="filterData.created_at_start" :class="filterData.created_at_start?'bg-warning':''" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的起始时间">
-
                                 </td>
                                 <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="user_workgroup_id" id="user_workgroup_id" :class="filterData.user_workgroup_id?'bg-warning':''" v-model="filterData.user_workgroup_id" @change="setUserWorkGroup"
-                                            class="form-control form-control-sm tooltipTarget"  title="选择要显示的工作组">
-                                        @foreach($userWorkGroups as $userWorkGroup)
-                                            <option value="{{$userWorkGroup->id}}">{{$userWorkGroup->name}}</option>
-                                        @endforeach
-                                    </select>
-                                    <input hidden type="submit" >
+                                        <input type="text" class="form-control form-control-sm tooltipTarget" placeholder="小组"
+                                               style="width:70px" @input="owner_seek"
+                                               title="输入关键词快速定位下拉列表,回车确定">
+                                        <select name="user_workgroup_id" id="user_workgroup_id" :class="filterData.user_workgroup_id?'bg-warning':''" v-model="filterData.user_workgroup_id" @change="setUserWorkGroup"
+                                                class="form-control form-control-sm tooltipTarget"  title="选择要显示的工作组">
+                                            @foreach($userWorkGroups as $userWorkGroup)
+                                                <option value="{{$userWorkGroup->id}}">{{$userWorkGroup->name}}</option>
+                                            @endforeach
+                                        </select>
+                                        <input hidden type="submit" >
                                     </div>
                                 </td>
 
@@ -80,7 +79,7 @@
                     </form>
                 </div>
                 <div class="">
-                    <table class="table table-sm  table-hover table-striped table-bordered text-nowrap">
+                    <table class="table table-sm table-striped table-bordered text-nowrap table-hover">
                         <tr>
                             <th>
                                 <label for="all">
@@ -88,19 +87,20 @@
                                 </label>
                             </th>
                             <th>序号</th>
-                            <th>ID</th>
+                            {{--                            <th>ID</th>--}}
+                            <th>操作</th>
                             <th>创建日期</th>
-                            <th class="laborReport_1">进厂编号</th>
-                            <th class="laborReport_1">小组</th>
-                            <th class="laborReport_1">临时工</th>
-                            <th class="laborReport_1">电话</th>
-                            <th class="laborReport_1">身份证号</th>
-                            <th class="laborReport_1">劳务所</th>
+                            <th  style="background-color: rgb(241, 234, 190)">进厂编号</th>
+                            <th style="background-color: rgb(241, 234, 190)">小组</th>
+                            <th style="background-color: rgb(241, 234, 190)">临时工</th>
+                            <th style="background-color: rgb(241, 234, 190)">电话</th>
+                            <th style="background-color: rgb(241, 234, 190)">身份证号</th>
+                            <th style="background-color: rgb(241, 234, 190)">劳务所</th>
                             <th>打卡时间</th>
                             <th>审核时间</th>
                             <th>审核人</th>
-                            <th>退时间</th>
-                            <th>午饭打卡</th>
+                            <th>退时间</th>
+                            <th>晚饭打卡(分)</th>
                             <th>在线时长</th>
                             <th>本次工作时长</th>
                         </tr>
@@ -109,25 +109,77 @@
                                 <input class="checkItem" type="checkbox" :value="laborReport.id" v-model="checkData">
                             </td>
                             <td>@{{ i+1  }}</td>
-                            <td class="text-muted">@{{laborReport.id}}</td>
+                            <td>
+                                @can('人事管理-门卫审核')
+                                 <span >
+                                <b v-if="laborReport.userDutyCheckVerifyUserId"  class="text-success">门卫已审核</b>
+                                <button v-else class="btn btn-sm btn-outline-secondary"  @click="guardClockAudit(laborReport.userDutyCheckId,laborReport.userDutyCheckType)">门卫审核</button>
+                                </span>
+                                @else
+                                    <span class="text-center"><p style="color: red">门卫未审核</p></span>
+                                @endcan
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                @can('人事管理-组长审核')
+                                <span class="inline">
+                                <button v-if="laborReport.groupUserId&&!laborReport.is_exportGroup" @click="groupExport(laborReport.id,laborReport.name)" class="btn btn-sm btn-outline-danger">退场</button>
+                                <b v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup" class="text-success">已退场</b>
+                                <button v-else @click="groupClockAudit(laborReport.id)" class="btn btn-sm btn-outline-primary">组长审核</button>
+                                </span>
+                                @else
+                                    <span  v-if="laborReport.groupUserId"><p style="color: green">在场</p></span>
+                                    <span class="text-center"><p style="color: red">组长未审核</p></span>
+                                @endcan
+
+                            </td>
                             <td class="text-muted">@{{laborReport.created_at}}</td>
                             <td class="text-muted">@{{laborReport.enterNumber}}</td>
-                            <td class="text-muted">@{{laborReport.userWorkGroupName}}</td>
-                            <td class="text-muted">@{{laborReport.name}}</td>
+                            <td>@{{laborReport.userWorkGroupName}}</td>
+                            <td >@{{laborReport.name}}</td>
                             <td class="text-muted">@{{laborReport.mobilePhone}}</td>
                             <td class="text-muted">@{{laborReport.identityNumber}}</td>
                             <td class="text-muted">@{{laborReport.laborCompany}}</td>
-                            <td class="text-muted">@{{laborReport.checkInAt}}</td>
+                            <td>@{{laborReport.checkInAt}}</td>
                             <td class="text-muted">@{{laborReport.verifyAt}}</td>
                             <td class="text-muted"><span v-if="laborReport.verifyPerson">@{{laborReport.verifyPerson}}</span></td>
                             <td class="text-muted">@{{laborReport.checkOutAt}}</td>
-                            <td class="text-muted"><span v-if="laborReport.beginLunch&&laborReport.endLunch&&laborReport.beginLunch<laborReport.endLunch">@{{laborReport.beginLunch}}-@{{laborReport.endLunch}}</span></td>
+                            <td class="text-muted"><span v-if="laborReport.relax_time">@{{laborReport.relax_time}}</span></td>
                             <td class="text-muted"><span v-if="laborReport.onlineDuration">@{{laborReport.onlineDuration}}</span></td>
-                            <td class="text-muted"><span v-if="laborReport.workingDuration">@{{laborReport.workingDuration}}</span></td>
+                            <td><span v-if="laborReport.workingDuration">@{{laborReport.workingDuration}}</span></td>
                         </tr>
                     </table>
                 </div>
             </div>
+            {{--      选择晚饭时长弹框      --}}
+            <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+                <div class="modal-dialog">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <h5 class="modal-title" id="exampleModalLabel">晚餐时长</h5>
+                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                <span aria-hidden="true">&times;</span>
+                            </button>
+                        </div>
+                        <div class="modal-body">
+                            <form>
+                                <div class="form-group">
+                                    <label for="relax_time" class="col-form-label">选择晚饭时长:</label>
+                                    <select class="form-control" id="relax_time" v-model="relax_time">
+                                        <option value="30">30分</option>
+                                        <option value="60">60分</option>
+                                    </select>
+                                </div>
+                            </form>
+                        </div>
+                        <div class="modal-footer">
+                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                <span class="btn btn-block" aria-hidden="true">取消</span>
+                            </button>
+                            <button type="button" class="btn btn-primary" data-dismiss="modal" @click="makeSureRelax_time">确定</button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
         </div>
     </div>
 @endsection
@@ -142,14 +194,18 @@
             data:{
                 laborReports:[
                         @foreach($laborReports as $laborReport)
-                         {id:'{{$laborReport->id}}',enterNumber:'{{$laborReport->enter_number}}',userWorkGroupId:'{{$laborReport->userWorkgroup->id}}'
-                        ,userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',userId:'{{$laborReport->user_id}}',name:'{{$laborReport->name}}'
+                    {id:'{{$laborReport->id}}',enterNumber:'{{$laborReport->enter_number}}'
+                        ,@if($laborReport->userWorkgroup)userWorkGroupId:'{{$laborReport->userWorkgroup->id}}', userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',@endif
+                        userId:'{{$laborReport->user_id}}',name:'{{$laborReport->name}}'
                         ,mobilePhone:'{{$laborReport->mobile_phone}}',identityNumber:'{{$laborReport->identity_number}}',laborCompany:'{{$laborReport->labor_company}}'
-                        ,checkInAt:'{{$laborReport->check_in_at}}',endLunch:'{{$laborReport->endLunch}}'
-                        ,beginLunch:'{{$laborReport->beginLunch}}',
+                        ,checkInAt:'{{$laborReport->check_in_at}}', relax_time:'{{$laborReport->relax_time}}',
+                        is_exportGroup:'{{$laborReport->is_exportGroup}}',
                         verifyAt:'{{$laborReport->verify_at}}',groupUserId:'{{$laborReport->group_user_id}}',verifyPerson:'{{$laborReport->user['name']}}',
                         checkOutAt:'{{$laborReport->check_out_at}}',onlineDuration:'{{$laborReport->online_duration}}',
-                        workingDuration:'{{$laborReport->working_duration}}', created_at:'{{$laborReport->created_at}}',},
+                        workingDuration:'{{$laborReport->working_duration}}', created_at:'{{$laborReport->created_at}}',
+                        @if($laborReport->userDutyCheck)userDutyCheckId:'{{$laborReport->userDutyCheck->id}}', userDutyCheckVerifyUserId:'{{$laborReport->userDutyCheck->verify_user_id}}'
+                        ,userDutyCheckType:'{{$laborReport->userDutyCheck->type}}',@endif},
+
                     @endforeach
                 ],
                 i:0,
@@ -160,9 +216,23 @@
                 ],
                 filterData:
                     {paginate:'50',created_at_start:'',created_at_end:'',enter_number:'',identity_number:'',user_workgroup_id: '',mobile_phone:''},
-                checkData:[]
+                checkData:[],
+                permittingWorkgroups:{!! $permittingWorkgroups !!},
+                relax_time:'',
             },
             mounted:function(){
+                initEcho();
+                Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('importEvent',(e)=>{
+                    window.location.reload();
+                });
+                this.permittingWorkgroups.forEach(function(workgroup){
+                    Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockinEvent',(e)=>{
+                        window.location.reload();
+                    });
+                    {{--Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockoutEvent',(e)=>{--}}
+                    {{--    window.location.reload();--}}
+                    {{--});--}}
+                });
                 this.initInputs();
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
                 $('#list').removeClass('d-none');
@@ -245,6 +315,125 @@
                             "&mobile_phone="+data.mobile_phone;
                     }
                 },
+                //门卫审核
+                guardClockAudit(id,type){
+                    let url='{{url("laborReport/guardClockAudit")}}';
+                    let _this=this;
+                    axios.post(url,{id:id,type:type})
+                        .then(function (response) {
+                            if (!response.data.success){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
+                            _this.laborReports.every(function (laborReport) {
+                                if (laborReport.userDutyCheckId==id){
+                                    laborReport.userDutyCheckVerifyUserId=response.data.data;
+                                    tempTip.setDuration(3000);
+                                    tempTip.showSuccess('审核通过!');
+                                    return false
+                                }
+                                return true;
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('审核失败!网络错误:'+err);
+                    });
+                },
+                //组长打卡审核
+                groupClockAudit(id){
+                    let url='{{url("laborReport/groupClockAudit")}}';
+                    let _this=this;
+                    axios.post(url,{id:id})
+                        .then(function (response) {
+                            if (!response.data.success){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
+                            _this.laborReports.every(function (laborReport) {
+                                if (laborReport.id==id){
+                                    laborReport.groupUserId=response.data.data.group_user_id;
+                                    laborReport.verifyAt=response.data.data.verify_at;
+                                    laborReport.verifyPerson=response.data.data.verifyPerson;
+                                    tempTip.setDuration(3000);
+                                    tempTip.showSuccess('审核通过!');
+                                    return false
+                                }
+                                return true;
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('审核失败!网络错误:'+err);
+                    });
+                },
+                //退场有晚饭时间
+                makeSureRelax_time(){
+                    let url='{{url("laborReport/groupExportEnsure")}}';
+                    let _this=this;
+                    let id = getSelectId();
+                    axios.post(url,{id:id,relax_time:_this.relax_time})
+                        .then(function (response) {
+                            if (!response.data.success){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
+                            _this.laborReports.every(function (laborReport) {
+                                if (laborReport.id==id){
+                                    laborReport.checkOutAt=response.data.data.check_out_at;
+                                    laborReport.workingDuration=response.data.data.working_duration;
+                                    laborReport.relax_time=response.data.data.relax_time;
+                                    laborReport.is_exportGroup=response.data.data.is_exportGroup;
+                                    laborReport.onlineDuration=response.data.data.online_duration;
+                                    tempTip.setDuration(3000);
+                                    tempTip.showSuccess('退场成功!');
+                                    return false
+                                }
+                                return true;
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('退场失败!网络错误:'+err);
+                    });
+                },
+                //组长点击退场,不包含晚饭时长情况
+                groupExport(id,name){
+                    const start = new Date(new Date(new Date().toLocaleDateString()).getTime()+19*60*60*1000);
+                    if(!confirm("确定要临时工“"+name+"“退场吗?")){return}
+                    if (new Date()>start){
+                        if (confirm('是否晚餐')){
+                            selectId(id);
+                            $('#exampleModal').modal('show');
+                            return;
+                        }
+                    }
+                    let url='{{url("laborReport/groupExport")}}';
+                    let _this=this;
+                    axios.post(url,{id:id})
+                        .then(function (response) {
+                            if (!response.data.success){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
+                            _this.laborReports.every(function (laborReport) {
+                                if (laborReport.id==id){
+                                    laborReport.checkOutAt=response.data.data.check_out_at;
+                                    laborReport.workingDuration=response.data.data.working_duration;
+                                    laborReport.is_exportGroup=response.data.data.is_exportGroup;
+                                    laborReport.onlineDuration=response.data.data.online_duration;
+                                    tempTip.setDuration(3000);
+                                    tempTip.showSuccess('退场成功!');
+                                    return false
+                                }
+                                return true;
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('退场失败!网络错误:'+err);
+                    });
+                },
                 owner_seek:function (e) {
                     let _this=this;
                     let $val=e.target.value;
@@ -258,9 +447,13 @@
                 },
             },
         });
+
+        let select_id = 0;
+        function selectId(id) {
+            select_id = id;
+        }
+        function getSelectId() {
+            return select_id;
+        }
     </script>
 @endsection
-<style>
-    .laborReport_1{background-color: rgb(241, 234, 190)
-    }
-</style>

+ 21 - 2
routes/web.php

@@ -147,18 +147,27 @@ Route::resource('store/storeItem','StoreItemsController');
  */
 //进入打卡
 Route::get('personnel/checking-in/goGetQRCode','QRCodeController@goGetQRCode');
-//进入二维码显示页面
+//进入二维码显示页面
 Route::get('personnel/checking-in/QRCode','QRCodeController@QRCode');
+//打卡页面点击仓库获取所有的工作组
+Route::get('personnel/checking-in/getUserWorkGroups','QRCodeController@getUserWorkGroups');
+
+//进入进出场二维码显示页面
+Route::get('personnel/checking-in/importAndExportQRCode','QRCodeController@importAndExportQRCode');
 //获取刷新二维码
 Route::post('personnel/checking-in/refreshQRCode','QRCodeController@refreshQRCode');
 /**
  *  用户打卡
  */
 Route::group(['prefix'=>'personnel/checking-in/userDutyCheck'],function(){
+    //进出场打卡接口
+    Route::get('importAndExportClock','UserDutyCheckController@importAndExportClock');
     //进入打卡接口
     Route::get('clock','UserDutyCheckController@clock');
-    //提交打卡
+    //进出场提交打卡
     Route::post('storeClock','UserDutyCheckController@storeClock');
+    //进出场提交打卡
+    Route::post('importGroupClock','UserDutyCheckController@importGroupClock');
     //去往登记资料页面
     Route::get('createUserDetail/{mobile_phone}','UserDutyCheckController@createUserDetail');
     //去往修改资料页面
@@ -220,6 +229,16 @@ Route::resource('process','ProcessController');
 Route::resource('personnel/laborReport','LaborReportController');
 Route::get('laborReport/export/{id}','LaborReportController@export');
 Route::get('getLaborReport','LaborReportController@getDailyLabor');
+Route::group(['prefix'=>'laborReport'],function(){
+    //门卫打卡审核
+    Route::post('guardClockAudit','LaborReportController@guardClockAudit');
+    //组长打卡审核
+    Route::post('groupClockAudit','LaborReportController@groupClockAudit');
+    //组长点击退场
+    Route::post('groupExport','LaborReportController@groupExport');
+    //组长点击退场,是否包含晚饭时间情况
+    Route::post('groupExportEnsure','LaborReportController@groupExportEnsure');
+});
 
 Route::group(['prefix'=>'personnel'],function(){
     //去往录入补卡