Explorar o código

需求调整:
权限表增加字段:类别(type),enum: 通用,工作组,货主
查询界面增加对应字段显示

增加人事模块(人事管理)
人事增加组概念维护
(用户工作组表:user_workgroups: id, name(唯一索引), timestamp() )
(关联表:user_workgroup_user: id, user_id, user_workgroup_id, timestamp() )
人事下二级菜单:相关设置:(伪三级菜单: 工作组, 实际是基础设置二级菜单,放在权限后第四个位置)
三级菜单:查询,录入,(修改:目前只能改名字)
录入后,在权限增加类别为工作组的同名权限
用户录入和设置中增加工作组选择(如同角色选择)
为工作组、角色、可见承运商分别设置自己的边框或可区别背景色(深浅不一的灰色)

设置多个小组相关的打卡二维码(恒久不变)
在原来“获取二维码”页面以小组为列表列出所有小组,点击后打开新页面展示二维码
(二维码参考原型设计的排版大小,太大的二维码打印在A4纸上会需要离很远扫描。文字改成黑色,不然打印后很不醒目)
临时工打卡后审核,需要进行二次审核,关联至相关组,拥有相关权限的审核
临时工扫了不同组二维码则自动修改相应维护记录
在打卡审核页面列表最后增加一列:小组审核,其中有权限的可见“确定为X组” 按钮或“X组”字样,
每条记录设置为拥有相应小组权限的人可审核
(注意调整或增加一个浏览打卡审核页面的权限,以实现小组审核人可以进入该页面且不能完成保安审核的操作)

Zhouzhendong %!s(int64=6) %!d(string=hai) anos
pai
achega
4d7d0ba12d
Modificáronse 41 ficheiros con 974 adicións e 327 borrados
  1. 1 1
      app/Authority.php
  2. 4 0
      app/Http/Controllers/Auth/RegisterController.php
  3. 190 0
      app/Http/Controllers/PersonnelController.php
  4. 1 149
      app/Http/Controllers/ProcessController.php
  5. 1 1
      app/Http/Controllers/TestController.php
  6. 13 3
      app/Http/Controllers/UserController.php
  7. 35 11
      app/Http/Controllers/UserDutyCheckController.php
  8. 101 0
      app/Http/Controllers/UserWorkGroupController.php
  9. 3 3
      app/Http/Controllers/WaybillsController.php
  10. 21 0
      app/User.php
  11. 15 0
      app/UserWorkGroup.php
  12. 1 1
      config/hr.php
  13. 40 0
      database/migrations/2020_05_12_104656_change_authorities_and_user_duty_checks_table.php
  14. 32 0
      database/migrations/2020_05_12_130510_create_user_workgroups_table.php
  15. 32 0
      database/migrations/2020_05_12_130804_create_user_workgroup_user_table.php
  16. 57 0
      database/migrations/2020_05_14_091440_add_personnel_authority.php
  17. 4 1
      resources/views/layouts/menu.blade.php
  18. 3 1
      resources/views/maintenance/authority/index.blade.php
  19. 4 0
      resources/views/maintenance/menu.blade.php
  20. 16 3
      resources/views/maintenance/user/create.blade.php
  21. 17 0
      resources/views/maintenance/user/edit.blade.php
  22. 3 1
      resources/views/maintenance/user/index.blade.php
  23. 35 0
      resources/views/maintenance/userWorkGroup/create.blade.php
  24. 40 0
      resources/views/maintenance/userWorkGroup/edit.blade.php
  25. 83 0
      resources/views/maintenance/userWorkGroup/index.blade.php
  26. 16 0
      resources/views/maintenance/userWorkGroup/menu.blade.php
  27. 2 1
      resources/views/personnel/checking-in/clock.blade.php
  28. 49 10
      resources/views/personnel/checking-in/clockAudit.blade.php
  29. 4 4
      resources/views/personnel/checking-in/createReplenishClock.blade.php
  30. 2 1
      resources/views/personnel/checking-in/createUserDetail.blade.php
  31. 60 0
      resources/views/personnel/checking-in/getQRcode.blade.php
  32. 22 0
      resources/views/personnel/checking-in/menuChecking-in.blade.php
  33. 4 4
      resources/views/personnel/checking-in/missionAudit.blade.php
  34. 0 0
      resources/views/personnel/checking-in/success.blade.php
  35. 14 0
      resources/views/personnel/menu.blade.php
  36. 18 0
      resources/views/personnel/menuPersonnel.blade.php
  37. 0 19
      resources/views/process/checking-in/getQRcode.blade.php
  38. 0 19
      resources/views/process/checking-in/menuChecking-in.blade.php
  39. 2 2
      resources/views/process/index.blade.php
  40. 0 4
      resources/views/process/menu.blade.php
  41. 29 88
      routes/web.php

+ 1 - 1
app/Authority.php

@@ -8,7 +8,7 @@ use App\Traits\ModelTimeFormat;
 class Authority extends Model
 {
     use ModelTimeFormat;
-    protected $fillable = ['name','remark','id_parent','alias_name'];
+    protected $fillable = ['name','remark','id_parent','alias_name','type','relevance'];
     function roles(){
         return $this->belongsToMany('App\Role','authority_role','id_authority','id_role');
     }

+ 4 - 0
app/Http/Controllers/Auth/RegisterController.php

@@ -92,6 +92,10 @@ class RegisterController extends Controller
             $carrierIds=explode(',',$carrierIds);
             $user->carriers()->sync($carrierIds);
         }
+        $userWorkGroupId=$request->input('userWorkGroupID');
+        if ($userWorkGroupId){
+            $user->userWorkGroups()->sync([$userWorkGroupId]);
+        }
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),$user['id']);
         if($headTo){return redirect(url($headTo))->with('successTip',"录入用户 {$user->name} 成功");}
         return $this->registered($request, $user)

+ 190 - 0
app/Http/Controllers/PersonnelController.php

@@ -0,0 +1,190 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\ProcessDailyParticipant;
+use App\User;
+use App\UserDetail;
+use App\UserDutyCheck;
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Validator;
+
+class PersonnelController extends Controller
+{
+    //任务审核
+    public function storeMissionAudit(Request $request){
+        if(!Gate::allows('人事管理-任务审核')){ return redirect(url('/'));  }
+        $id=$request->input('id');
+        if (!$id)return ['error'=>'提交审核失败!'];
+        $processDailyParticipant=ProcessDailyParticipant::find($id);
+        if (!$id)return ['error'=>'未找到对应记录!'];
+        $processDailyParticipant->status='已审核';
+        $processDailyParticipant->update();
+        $this->log(__METHOD__,"任务审核".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
+        return;
+    }
+
+    //打卡审核时判断是否异常
+    public function isException(Request $request){
+        $id=$request->input('id');
+        $checked_at=$request->input('checked_at');
+        $type=$request->input('type');
+        $user_id=$request->input('user_id');
+        if (!$id || !$checked_at || !$type || !$user_id)return ['exception'=>'数据异常!','duration_man_hour'=>''];
+        $userDutyCheck=UserDutyCheck::where('user_id',$user_id)->where('checked_at','<',$checked_at)->first();
+        if (!$userDutyCheck)return ['exception'=>'','duration_man_hour'=>''];
+        $dateStart=Carbon::parse($userDutyCheck->checked_at);
+        $dateEnd=Carbon::parse($checked_at);
+        $minute=($dateEnd->diffInMinutes($dateStart));
+        if ($type=="登入"&&$userDutyCheck->type=="登入"&&$minute>30){
+            return ['exception'=>'无出场纪录!','duration_man_hour'=>''];
+        }
+        if ($type=="登出"&&$userDutyCheck->type=="登出"&&$minute>30){
+            return ['exception'=>'无入场纪录!','duration_man_hour'=>''];
+        }
+        if ($type=="登出"&&$userDutyCheck->type=="登入"&&$minute>=720){
+            return ['exception'=>'时间异常!','duration_man_hour'=>''];
+        }
+        if ($type=="登出"&&$userDutyCheck->type=="登入"){
+            return ['exception'=>'','duration_man_hour'=>$minute/60];
+        }
+        return ['exception'=>'','duration_man_hour'=>''];
+    }
+
+    //打卡审核
+    public function storeClockAudit(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();
+        $this->log(__METHOD__,"打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        return ["success"=>true,"data"=>$userDutyCheck->verify_user_id];
+    }
+
+    //打卡组长审核
+    public function storeGroupAudit(Request $request){
+        if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $id=$request->input('id');
+        $userDutyCheck=UserDutyCheck::find($id);
+        $user=User::find($userDutyCheck->user_id);
+        $workGroup=$user->userWorkGroups()->first();
+        if ($workGroup){
+            if(!Gate::allows($workGroup->name)){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        }
+        $type=$request->input('type');
+        $userDutyCheck->type=$type;
+        $userDutyCheck->group_user_id=Auth::user()['id'];
+        $userDutyCheck->update();
+        $this->log(__METHOD__,"打卡组长审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        return ["success"=>true,$userDutyCheck->group_user_id];
+    }
+
+    //去往任务审核
+    public function missionAudit(Request $request){
+        if(!Gate::allows('人事管理-任务审核')){ return redirect(url('/'));  }
+        $processDailyParticipants=ProcessDailyParticipant::with(['processDaily','user_detail'])
+            ->orderBy('id','DESC');
+        $start_date=$request->input('start_date');
+        $end_date=$request->input('end_date');
+        $full_name=$request->input('full_name');
+        $mobile_phone=$request->input('mobile_phone');
+        if ($start_date) {
+            $processDailyParticipants->whereHas('processDaily',function (Builder $builder)use($start_date){
+                $builder->where('date','>=',$start_date);
+            });
+        }
+        if ($end_date) {
+            $processDailyParticipants->whereHas('processDaily',function (Builder $builder)use($end_date){
+                $builder->where('date','<=',$end_date);
+            });
+        }
+        if ($full_name){
+            $processDailyParticipants->whereHas('user_detail',function (Builder $builder)use($full_name){
+                $builder->where('full_name',$full_name);
+            });
+        }
+        if ($mobile_phone){
+            $processDailyParticipants->whereHas('user_detail',function (Builder $builder)use($mobile_phone){
+                $builder->where('mobile_phone',$mobile_phone);
+            });
+        }
+        $processDailyParticipants=$processDailyParticipants->paginate($request->input('paginate')?$request->input('paginate'):50);
+        foreach ($processDailyParticipants as $processDailyParticipant){
+            if ($processDailyParticipant->processDaily){
+                $processController=new ProcessController();
+                $processDailyParticipant=$processController->countParticipantManHour($processDailyParticipant,$processDailyParticipant->processDaily->date);
+            }
+        }
+        return view('personnel/checking-in/missionAudit',['processDailyParticipants'=>$processDailyParticipants,'request'=>$request->input()]);
+    }
+
+    //去往打卡审核
+    public function clockAudit(){
+        if(!Gate::allows('人事管理')){ return redirect(url('/'));  }
+        $user=Auth::user();
+        if (!$user)return redirect('/');
+        $result=$user->getPermittingWorkGroupIdsAttribute();
+        $userWorkGroupIds=$result['workGroupIds'];
+        $users=User::whereHas("userWorkGroups",function (Builder $query)use(&$userWorkGroupIds){
+            $query->whereIn("id",$userWorkGroupIds);
+        })->get();
+        $user_ids=array_column($users->toArray(),'id');
+        $date=date('Y-m-d');
+        $userDutyChecks=UserDutyCheck::with('userDetail')->whereIn("user_id",$user_ids)
+            ->where('checked_at','like',$date."%")->get();
+        return view('personnel/checking-in/clockAudit',['userDutyChecks'=>$userDutyChecks,'workGroupSign'=>$result['workGroupSign']]);
+    }
+
+    //录入补卡
+    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];
+        $user_id=$request->input('user_id');
+        $checked_at=$request->input('checked_at');
+        $type=$request->input('type');
+        $userDutyCheck=new UserDutyCheck([
+            'user_id'=>$user_id,
+            'checked_at'=>$checked_at,
+            'type'=>$type,
+            'source'=>'补入',
+        ]);
+        $userDutyCheck->save();
+        $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        return ['success'=>true,'data'=>$userDutyCheck];
+    }
+
+    //搜索临时工下打卡信息
+    public function checkUserLabors(Request $request){
+        if(!Gate::allows('人事管理-录入补卡')){ return redirect(url('/'));  }
+        $full_name=$request->input('full_name');
+        $userDetail=UserDetail::with(['userDutyChecks'=>function ($query){
+            return $query->orderBy('checked_at','DESC')->limit(5);
+        }])->where('full_name',$full_name)->get();
+        return ['success'=>true,'data'=>$userDetail];
+    }
+
+    //考勤
+    public function createReplenishClock(){
+        if(!Gate::allows('人事管理-录入补卡')){ return redirect(url('/'));  }
+        return view('personnel/checking-in/createReplenishClock');
+    }
+
+    public function validatorUserDutyCheck(Request $request){
+        $validator=Validator::make($request->input(),[
+            'user_id'=>'required',
+            'checked_at'=>'required|date_format:Y-m-d H:i',
+            'type'=>'required',
+        ],[
+            'date_format'=>':attribute 格式错误',
+        ],['checked_at'=>'日期']);
+        return $validator;
+    }
+}

+ 1 - 149
app/Http/Controllers/ProcessController.php

@@ -296,8 +296,6 @@ class ProcessController extends Controller
         $processDaily->update();
         $result=$this->countRemains($processDaily);
         $processDailies=$result['processDailies'];
-        //$remain=$this->countRemain($processDaily);
-        //$processDaily->remain=$remain;
         $this->log(__METHOD__,"修改当日产量".__FUNCTION__,json_encode($processDaily),Auth::user()['id']);
         $response=[];
         $response['status']='success';
@@ -349,18 +347,6 @@ class ProcessController extends Controller
         }
         return $process_id;
     }
-    /*//计算当日剩余  根据日期
-    public function countRemain($processDaily){
-        if (!$processDaily || !$processDaily->process) return;
-        $processDailies=ProcessDaily::where('process_id',$processDaily->process_id)
-            ->where('date','<=',$processDaily->date)->get();
-        $sum=0;
-        foreach ($processDailies as $processDaily){
-            $sum=$sum+($processDaily->output);
-        }
-        return ($processDaily->process->amount)-$sum;
-    }*/
-    //添加参与人
     public function shortProcessDailyParticipant(Request $request){
         if(!Gate::allows('二次加工管理-登记工时')){ return redirect(url('/'));  }
         $errors=$this->validatorProcessDailyParticipant($request)->errors();
@@ -457,7 +443,7 @@ class ProcessController extends Controller
     }
     //参与人审核
     public function processDailyParticipantAudit($id){
-        if(!Gate::allows('二次加工管理-登记工时-审核')){ return redirect(url('/'));  }
+        if(!Gate::allows('人事管理-任务审核')){ return redirect(url('/'));  }
         $processDailyParticipant=ProcessDailyParticipant::select('id','status')->find($id);
         if (!$processDailyParticipant) return ['success'=>false];
         $processDailyParticipant->status='已审核';
@@ -522,129 +508,6 @@ class ProcessController extends Controller
         return $tutorials;
     }
 
-    //考勤
-    public function createReplenishClock(){
-        return view('process/checking-in/createReplenishClock');
-    }
-    //搜索临时工下打卡信息
-    public function checkUserLabors(Request $request){
-        $full_name=$request->input('full_name');
-        $userDetail=UserDetail::with(['userDutyChecks'=>function ($query){
-            return $query->orderBy('checked_at','DESC')->limit(5);
-        }])->where('full_name',$full_name)->get();
-        return ['success'=>true,'data'=>$userDetail];
-    }
-    //录入补卡
-    public function storeReplenishClock(Request $request){
-        $errors=$this->validatorUserDutyCheck($request)->errors();
-        if (count($errors)>0)return ['success'=>false,'data'=>$errors];
-        $user_id=$request->input('user_id');
-        $checked_at=$request->input('checked_at');
-        $type=$request->input('type');
-        $userDutyCheck=new UserDutyCheck([
-            'user_id'=>$user_id,
-            'checked_at'=>$checked_at,
-            'type'=>$type,
-            'source'=>'补入',
-        ]);
-        $userDutyCheck->save();
-        $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
-        return ['success'=>true,'data'=>$userDutyCheck];
-    }
-
-    //去往打卡审核
-    public function clockAudit(){
-        $date=date('Y-m-d');
-        $userDutyChecks=UserDutyCheck::with('userDetail')->where('checked_at','like',$date."%")->get();
-        return view('process/checking-in/clockAudit',['userDutyChecks'=>$userDutyChecks]);
-    }
-    //打卡审核
-    public function storeClockAudit(Request $request){
-        $id=$request->input('id');
-        $type=$request->input('type');
-        $userDutyCheck=UserDutyCheck::find($id);
-        $userDutyCheck->type=$type;
-        $userDutyCheck->verify_user_id=Auth::user()['id'];
-        $userDutyCheck->update();
-        $this->log(__METHOD__,"打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
-        return $userDutyCheck->verify_user_id;
-    }
-    //打卡审核时判断是否异常
-    public function isException(Request $request){
-        $id=$request->input('id');
-        $checked_at=$request->input('checked_at');
-        $type=$request->input('type');
-        $user_id=$request->input('user_id');
-        if (!$id || !$checked_at || !$type || !$user_id)return ['exception'=>'数据异常!','duration_man_hour'=>''];
-        $userDutyCheck=UserDutyCheck::where('user_id',$user_id)->where('checked_at','<',$checked_at)->first();
-        if (!$userDutyCheck)return ['exception'=>'','duration_man_hour'=>''];
-        $dateStart=Carbon::parse($userDutyCheck->checked_at);
-        $dateEnd=Carbon::parse($checked_at);
-        $minute=($dateEnd->diffInMinutes($dateStart));
-        if ($type=="登入"&&$userDutyCheck->type=="登入"&&$minute>30){
-            return ['exception'=>'无出场纪录!','duration_man_hour'=>''];
-        }
-        if ($type=="登出"&&$userDutyCheck->type=="登出"&&$minute>30){
-            return ['exception'=>'无入场纪录!','duration_man_hour'=>''];
-        }
-        if ($type=="登出"&&$userDutyCheck->type=="登入"&&$minute>=720){
-            return ['exception'=>'时间异常!','duration_man_hour'=>''];
-        }
-        if ($type=="登出"&&$userDutyCheck->type=="登入"){
-            return ['exception'=>'','duration_man_hour'=>$minute/60];
-        }
-        return ['exception'=>'','duration_man_hour'=>''];
-    }
-
-    //去往任务审核
-    public function missionAudit(Request $request){
-        $processDailyParticipants=ProcessDailyParticipant::with(['processDaily','user_detail'])
-            ->orderBy('id','DESC');
-        $start_date=$request->input('start_date');
-        $end_date=$request->input('end_date');
-        $full_name=$request->input('full_name');
-        $mobile_phone=$request->input('mobile_phone');
-        if ($start_date) {
-            $processDailyParticipants->whereHas('processDaily',function (Builder $builder)use($start_date){
-                $builder->where('date','>=',$start_date);
-            });
-        }
-        if ($end_date) {
-            $processDailyParticipants->whereHas('processDaily',function (Builder $builder)use($end_date){
-                $builder->where('date','<=',$end_date);
-            });
-        }
-        if ($full_name){
-            $processDailyParticipants->whereHas('user_detail',function (Builder $builder)use($full_name){
-                $builder->where('full_name',$full_name);
-            });
-        }
-        if ($mobile_phone){
-            $processDailyParticipants->whereHas('user_detail',function (Builder $builder)use($mobile_phone){
-                $builder->where('mobile_phone',$mobile_phone);
-            });
-        }
-        $processDailyParticipants=$processDailyParticipants->paginate($request->input('paginate')?$request->input('paginate'):50);
-        foreach ($processDailyParticipants as $processDailyParticipant){
-            if ($processDailyParticipant->processDaily){
-                $processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$processDailyParticipant->processDaily->date);
-            }
-        }
-        return view('process/checking-in/missionAudit',['processDailyParticipants'=>$processDailyParticipants,'request'=>$request->input()]);
-    }
-
-    //任务审核
-    public function storeMissionAudit(Request $request){
-        $id=$request->input('id');
-        if (!$id)return ['error'=>'提交审核失败!'];
-        $processDailyParticipant=ProcessDailyParticipant::find($id);
-        if (!$id)return ['error'=>'未找到对应记录!'];
-        $processDailyParticipant->status='已审核';
-        $processDailyParticipant->update();
-        $this->log(__METHOD__,"任务审核".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
-        return;
-    }
-
     public function store(Request $request)
     {
         if(!Gate::allows('二次加工管理-录入')){ return redirect(url('/'));  }
@@ -917,17 +780,6 @@ class ProcessController extends Controller
         return $validator;
     }
 
-    public function validatorUserDutyCheck(Request $request){
-        $validator=Validator::make($request->input(),[
-            'user_id'=>'required',
-            'checked_at'=>'required|date_format:Y-m-d H:i',
-            'type'=>'required',
-        ],[
-            'date_format'=>':attribute 格式错误',
-        ],['checked_at'=>'日期']);
-        return $validator;
-    }
-
     //参与人信息校验
     public function validatorProcessDailyParticipant(Request $request){
         $validator=Validator::make($request->input(),[

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

@@ -128,7 +128,7 @@ class TestController extends Controller
     }
 
     public function test1(){
-        return UserToken::getUser('b2b3c637909997033801f5f733cf1fe3');
+
     }
 
 

+ 13 - 3
app/Http/Controllers/UserController.php

@@ -6,6 +6,7 @@ use App\Carrier;
 use App\Exports\UserExport;
 use App\Role;
 use App\User;
+use App\UserWorkGroup;
 use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
@@ -24,7 +25,7 @@ class UserController extends Controller
     public function index()
     {
         if(!Gate::allows('用户-查询')){ return redirect(url('/'));  }
-        $users=User::with(['roles','carriers'])->orderBy('id','desc')->paginate(35);
+        $users=User::with(['roles','carriers','userWorkGroups'])->orderBy('id','desc')->paginate(35);
         $users->each(function (User $user){
             $user['isSuperAdmin']=$user->isSuperAdmin();
         });
@@ -41,7 +42,8 @@ class UserController extends Controller
         if(!Gate::allows('用户-录入')){ return redirect(url('/'));  }
         $roles=Role::all();
         $carriers=Carrier::select('id','name')->get();
-        return view('maintenance.user.create',['rolesAll'=>$roles,'carriers'=>$carriers]);
+        $userWorkGroups=UserWorkGroup::get();
+        return view('maintenance.user.create',['rolesAll'=>$roles,'carriers'=>$carriers,'userWorkGroups'=>$userWorkGroups]);
     }
 
 
@@ -82,7 +84,9 @@ class UserController extends Controller
         $roles=$user->roles()->get();
         $carriers=Carrier::select('id','name')->get();
         $carrierUser=$user->carriers()->get();
-        return view('maintenance.user.edit',compact('user','rolesAll','roles','carriers','carrierUser'));
+        $userWorkGroups=UserWorkGroup::get();
+        $userWorkGroup=$user->userWorkGroups()->first();
+        return view('maintenance.user.edit',compact('user','rolesAll','roles','carriers','carrierUser','userWorkGroups','userWorkGroup'));
     }
 
     /**
@@ -112,6 +116,12 @@ class UserController extends Controller
         }else{
             $user->carriers()->sync([]);
         }
+        $userWorkGroupId=$request->input('userWorkGroupID');
+        if($userWorkGroupId){
+            $user->userWorkGroups()->sync([$userWorkGroupId]);
+        }else{
+            $user->userWorkGroups()->sync([]);
+        }
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return redirect('maintenance/user/')->with('successTip',"成功修改用户“{$user['name']}”!");
     }

+ 35 - 11
app/Http/Controllers/UserDutyCheckController.php

@@ -6,6 +6,8 @@ use App\User;
 use App\UserDetail;
 use App\UserDutyCheck;
 use App\UserLabor;
+use App\UserToken;
+use App\UserWorkGroup;
 use Carbon\Carbon;
 use Endroid\QrCode\QrCode;
 use Illuminate\Http\Request;
@@ -17,24 +19,36 @@ use Ramsey\Uuid\Uuid;
 class UserDutyCheckController extends Controller
 {
     public function goGetQRCode(){
-        return view("process/checking-in/getQRcode");
+        $userWorkGroups=UserWorkGroup::get();
+        return view("personnel/checking-in/getQRcode",compact('userWorkGroups'));
     }
 
     //获取二维码
-    public function getQRCode(){
+    public function getQRCode(Request $request){
+        $userWorkGroup_id=$request->input('userWorkGroup_id');
         $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
         if ($qrCode_refresh_everyday){
             $date=md5(date('Y-m-d'));
-            $url=url("userDutyCheck/clock?key=").$date;
+            $url=url("personnel/checking-in/userDutyCheck/clock?key=").$date;
+            if ($userWorkGroup_id)$url=$url."&&userWorkGroupID=".$userWorkGroup_id;
         }else{
-            $url=url("userDutyCheck/clock");
+            $url=url("personnel/checking-in/userDutyCheck/clock");
+            if ($userWorkGroup_id)$url=$url."?userWorkGroupID=".$userWorkGroup_id;
         }
         $qrCode=new QrCode($url);
+        if ($userWorkGroup_id){
+            if (file_exists("storage/QRCodeIMG/".$userWorkGroup_id.'.png')){
+                return "/storage/QRCodeIMG/".$userWorkGroup_id.'.png';
+            }
+            $qrCode->writeFile(storage_path('app/public/QRCodeIMG/'.$userWorkGroup_id.'.png'));
+            return '/storage/QRCodeIMG/'.$userWorkGroup_id.'.png';
+        }
         return (new Response())->header('Content-Type',$qrCode->getContentType())->setContent($qrCode->writeString());
     }
 
     //校验二维码进入打卡页面
     public function clock(Request $request){
+        $userWorkGroupID=$request->input('userWorkGroupID');
         $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
         if ($qrCode_refresh_everyday){
             $key=$request->input('key');
@@ -46,31 +60,38 @@ class UserDutyCheckController extends Controller
         if ($userLaborToken && Cache::has('tokenStr_'.$userLaborToken)) {
             $user_id=Cache::get('tokenStr_'.$userLaborToken);
             $userDetail=UserDetail::find($user_id);
-            if (!$userDetail)   return redirect('userDutyCheck/createUserDetail/'.$userDetail->mobile_phone);
+            if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$userDetail->mobile_phone)->with("userWorkGroupID",$userWorkGroupID);
+            if ($userWorkGroupID){
+                $user=UserToken::getUser($userLaborToken);
+                $user->userWorkGroups()->sync([$userWorkGroupID]);
+            }
             $userDutyCheck=$this->dutyCheck($userDetail->user_id);
             if (!$userDutyCheck)return "<h1 style='color: red'>打卡异常,请联系相关人员!</h1>";
-            return response()->view('process/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at]);
+            return response()->view('personnel/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at]);
         }
-        return view("process/checking-in/clock");
+        return view("personnel/checking-in/clock",compact('userWorkGroupID'));
     }
 
     //提交打卡
     public function storeClock(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('userDutyCheck/createUserDetail/'.$mobile_phone);
+        if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$mobile_phone)->with("userWorkGroupID",$userWorkGroupID);
         $user=User::find($userDetail->user_id);
         if (Cache::has('tokenUser_'.$user->id))return "<h1 style='color: red'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
+        if ($userWorkGroupID)$user->userWorkGroups()->sync([$userWorkGroupID]);
         $userDutyCheck=$this->dutyCheck($userDetail->user_id);
         if (!$userDutyCheck)return "<h1 style='color: red'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$user->token(config('users.token_check_in_expire_minutes'));
-        return response()->view('process/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at])
+        return response()->view('personnel/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at])
             ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
     }
     //去往登记资料页面
     public function createUserDetail($mobile_phone){
-        return view('process/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone]);
+        $userWorkGroupID=session("userWorkGroupID");
+        return view('personnel/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone,'userWorkGroupID'=>$userWorkGroupID]);
     }
 
     //提交登记资料
@@ -78,11 +99,13 @@ class UserDutyCheckController extends Controller
         $this->validator($request)->validate();
         $mobile_phone=$request->input('mobile_phone');
         $full_name=$request->input('full_name');
+        $userWorkGroupID=$request->input('userWorkGroupID');
         $user=new User([
             'name'=>$mobile_phone,
             'password'=>Uuid::uuid1(),
         ]);
         $user->save();
+        if ($userWorkGroupID)$user->userWorkGroups()->sync([$userWorkGroupID]);
         $userDetail=new UserDetail([
             'user_id'=>$user->id,
             'full_name'=>$full_name,
@@ -99,7 +122,8 @@ class UserDutyCheckController extends Controller
         $userDutyCheck=$this->dutyCheck($user->id);
         if (!$userDutyCheck)return "<h1 style='color: red'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$user->token(config('users.token_check_in_expire_minutes'));
-        return response()->view('process/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at])
+        $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request));
+        return response()->view('personnel/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at])
             ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
     }
 

+ 101 - 0
app/Http/Controllers/UserWorkGroupController.php

@@ -0,0 +1,101 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Authority;
+use App\UserWorkGroup;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Validator;
+
+class UserWorkGroupController extends Controller
+{
+    public function index()
+    {
+        if(!Gate::allows('工作组-查询')){ return redirect(url('/'));  }
+        $UserWorkGroups=UserWorkGroup::orderBy('id',"DESC")->paginate(50);
+        return view('maintenance.userWorkGroup.index',['userWorkGroups'=>$UserWorkGroups]);
+    }
+
+    public function create()
+    {
+        if(!Gate::allows('工作组-录入')){ return redirect(url('/'));  }
+        return view('maintenance.userWorkGroup.create');
+    }
+
+
+    public function store(Request $request)
+    {
+        if(!Gate::allows('工作组-录入')){ return redirect(url('/'));  }
+        $id=false;
+        $this->validatorUserWorkGroup($request,$id)->validate();
+        $UserWorkGroup=new UserWorkGroup($request->input());
+        $UserWorkGroup->save();
+        $this->storeAuthority($UserWorkGroup['name'],$UserWorkGroup->id);
+        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        return redirect('maintenance/userWorkGroup')->with('successTip','新工作组“'.$request->input('name').'”添加成功');
+    }
+
+    private function storeAuthority($name,$id){
+        Authority::create([
+            "name"=>$name,
+            "alias_name"=>$name,
+            "type"=>"工作组",
+            "relevance"=>$id,
+        ]);
+    }
+
+    public function edit($id)
+    {
+        if(!Gate::allows('工作组-编辑')){ return redirect(url('/'));  }
+        $userWorkGroup=UserWorkGroup::find($id);
+        return view('maintenance.userWorkGroup.edit',['userWorkGroup'=>$userWorkGroup]);
+    }
+
+    public function update(Request $request, $id)
+    {
+        if(!Gate::allows('工作组-编辑')){ return redirect(url('/'));  }
+        $this->validatorUserWorkGroup($request,$id)->validate();
+        $data=$request->input();
+        $userWorkGroup=UserWorkGroup::find($id);
+        if ($data['name']!=$userWorkGroup->name){
+            $authority=Authority::where("name",$userWorkGroup->name)->first();
+            if ($authority){
+                $authority->name=$data['name'];
+                $authority->alias_name=$data['name'];
+                $authority->update();
+            }
+            if (!$authority){
+                $this->storeAuthority($data['name'],$id);
+            }
+            $userWorkGroup->fill($data);
+            $userWorkGroup->save();
+            $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
+        }
+        return redirect('maintenance/userWorkGroup')->with('successTip','工作组“'.$request->input('name').'”修改成功');
+    }
+
+    public function destroy($id)
+    {
+        if(!Gate::allows('工作组-删除')){ return redirect(url('/'));  }
+        $UserWorkGroup=UserWorkGroup::find($id);
+        $this->log(__METHOD__,__FUNCTION__,json_encode($UserWorkGroup),Auth::user()['id']);
+        $result=$UserWorkGroup->delete();
+        return ['success'=>$result];
+    }
+
+    protected function validatorUserWorkGroup(Request $request,$id){
+        if ($id){$name=$id;}
+        $validator=Validator::make($request->input(),[
+            'name'=>['required','max:10',isset($name)?"unique:user_workgroups,name,$name":'unique:user_workgroups,name'],
+        ],[
+            'required'=>':attribute 为必填项',
+            'max'=>':attribute 过长',
+            'unique'=>':attribute 已存在',
+        ],[
+            'name'=>'工作组名称',
+        ]);
+        return $validator;
+    }
+}

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

@@ -224,7 +224,7 @@ class WaybillsController extends Controller
         if ($waybill->save()){
             if ($waybill->type=="直发车"){
                 if ($waybill->charge)$total_receivable=($waybill->charge);
-                elseif ($waybill->collect_fee)$total_receivable=($waybill->collect_fee);
+                elseif ($waybill->collect_fee){$total_receivable=($waybill->collect_fee);}
                 $total_expense=($waybill->fee)+($waybill->other_fee)-($waybill->collect_fee);
             }else if ($waybill->type=="专线"){
                 $waybillPriceModel_id=$request->input('waybillPriceModel');
@@ -245,10 +245,10 @@ class WaybillsController extends Controller
                 }
                 $waybill->save();
                 if ($waybill->charge)$total_receivable=($waybill->charge);
-                elseif ($waybill->collect_fee)$total_receivable=($waybill->collect_fee);
+                elseif ($waybill->collect_fee){$total_receivable=($waybill->collect_fee);}
                 $total_expense=($waybill->pick_up_fee)+($waybill->other_fee)+($waybill->fee);
             }
-            if ($total_receivable&&$total_receivable>0){
+            if (isset($total_receivable)&&$total_receivable>0){
                 $waybillPayoff=WaybillPayoff::where('waybill_id','=',$id)->first();
                 if ($waybillPayoff){
                     $waybillPayoff->waybill_id=$id;

+ 21 - 0
app/User.php

@@ -86,6 +86,9 @@ class User extends Authenticatable
     function carriers(){
         return $this->belongsToMany('App\Carrier','carrier_user','user_id','carrier_id');
     }
+    function userWorkGroups(){
+        return $this->belongsToMany('App\UserWorkGroup','user_workgroup_user','user_id','user_workgroup_id');
+    }
 
     function authorities(){
         $authorities = new Collection([]);
@@ -116,4 +119,22 @@ class User extends Authenticatable
         });
         return array_unique($ownerIds);
     }
+    function getPermittingWorkGroupIdsAttribute(){
+        $workGroupIds=[];
+        $response=[];
+        if ($this->isSuperAdmin()||Gate::allows('人事管理-打卡审核')){
+            $workGroups=UserWorkGroup::all();
+            $workGroups->each(function (UserWorkGroup $workGroup)use(&$workGroupIds){
+                array_push($workGroupIds,$workGroup['id']);
+            });
+            if ($this->isSuperAdmin()){$response['workGroupSign']=true;}
+            else $response['workGroupSign']=false;
+            $response['workGroupIds']=$workGroupIds;
+            return $response;
+        }
+        $this->authorities()->each(function(Authority $authority)use(&$workGroupIds){
+            if($authority->type=="工作组"){array_push($workGroupIds,$authority->relevance);}
+        });
+        return ["workGroupIds"=>$workGroupIds,"workGroupSign"=>true];
+    }
 }

+ 15 - 0
app/UserWorkGroup.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class UserWorkGroup extends Model
+{
+    protected $table="user_workgroups";
+    protected $fillable=['name'];
+
+    public function users(){
+        return $this->belongsToMany('App\User','user_workgroup_user','user_workgroup_id','user_id');
+    }
+}

+ 1 - 1
config/hr.php

@@ -2,6 +2,6 @@
 
 return [
 
-    'qrCode_refresh_everyday' =>true,
+    'qrCode_refresh_everyday' =>false,
 
 ];

+ 40 - 0
database/migrations/2020_05_12_104656_change_authorities_and_user_duty_checks_table.php

@@ -0,0 +1,40 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeAuthoritiesAndUserDutyChecksTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('authorities',function (Blueprint $table){
+            $table->enum('type',['通用','工作组','货主'])->default('通用')->comment('类别');
+            $table->bigInteger('relevance')->nullable()->comment('外键类型关联表');
+        });
+        Schema::table('user_duty_checks',function (Blueprint $table){
+            $table->bigInteger('group_user_id')->nullable()->comment('组长审核');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('authorities',function (Blueprint $table){
+            $table->dropColumn('type');
+            $table->dropColumn('relevance');
+        });
+        Schema::table('user_duty_checks',function (Blueprint $table){
+            $table->dropColumn('group_user_id');
+        });
+    }
+}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateUserWorkgroupsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('user_workgroups', function (Blueprint $table) {
+            $table->id();
+            $table->string('name')->unique()->comment('工作组名');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('user_workgroups');
+    }
+}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateUserWorkgroupUserTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('user_workgroup_user', function (Blueprint $table) {
+            $table->bigInteger('user_id')->unique()->comment('外键用户');
+            $table->bigInteger('user_workgroup_id')->comment('外键工作组');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('user_workgroup_user');
+    }
+}

+ 57 - 0
database/migrations/2020_05_14_091440_add_personnel_authority.php

@@ -0,0 +1,57 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddPersonnelAuthority extends Migration
+{
+    protected  $deleteAuthNames=[
+        '二次加工管理-打卡审核',
+        '二次加工管理-登记工时-审核',
+    ];
+
+    protected $authNames=[
+        '人事管理',
+        '人事管理-打卡审核',
+        '人事管理-任务审核',
+        '人事管理-录入补卡',
+        '人事管理-获取二维码',
+        '工作组',
+        '工作组-查询',
+        '工作组-编辑',
+        '工作组-录入',
+        '工作组-删除',
+    ];
+
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        foreach ($this->deleteAuthNames as $name){
+            Authority::where('name',$name)->delete();
+        }
+        foreach ($this->authNames as $name){
+            if(!Authority::where('name',$name)->first())(new Authority(['name'=>$name,'alias_name'=>$name]))->save();
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        foreach ($this->authNames as $name){
+            Authority::where('name',$name)->delete();
+        }
+        foreach ($this->deleteAuthNames as $name){
+            if(!Authority::where('name',$name)->first())(new Authority(['name'=>$name,'alias_name'=>$name]))->save();
+        }
+    }
+}

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

@@ -13,9 +13,12 @@
         @can('称重管理')
             <li class="nav-item"><a href="{{url("package/")}}" class="nav-link"
                                     :class="{active:isActive('package',1)}">称重管理</a></li> @endcan
-        @can('称重管理')
+        @can('二次加工管理')
             <li class="nav-item"><a href="{{url("process/")}}" class="nav-link"
                                     :class="{active:isActive('process',1)}">二次加工管理</a></li> @endcan
+        @can('人事管理')
+            <li class="nav-item"><a href="{{url("personnel/checking-in/createReplenishClock")}}" class="nav-link"
+                                    :class="{active:isActive('personnel',1)}">人事管理</a></li> @endcan
         @can('基础设置')
         <li class="nav-item"><a href="{{url("maintenance/")}}" class="nav-link"
                                 :class="{active:isActive('maintenance',1)}">基础设置</a></li> @endcan

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

@@ -18,6 +18,7 @@
                         <th>权限名</th>
                         <th>上级</th>
                         <th>注释</th>
+                        <th>类别</th>
                         <th>创建时间</th>
                         <th>操作</th>
                     </tr>
@@ -26,6 +27,7 @@
                         <td>@{{authority.name}}</td>
                         <td></td>
                         <td>@{{authority.remark}}</td>
+                        <td>@{{authority.type}}</td>
                         <td class="text-muted">@{{authority.created_at}}</td>
                         <td>
 {{--                            @can('权限-编辑')--}}
@@ -48,7 +50,7 @@
             data:{
                 authorities:[
                     @foreach( $authorities as $authority )
-                    {id:'{{$authority->id}}',name:'{{$authority->alias_name}}',remark:'{{$authority->remark}}',created_at:'{{$authority->created_at}}'},
+                    {id:'{{$authority->id}}',name:'{{$authority->alias_name}}',type:'{{$authority->type}}',remark:'{{$authority->remark}}',created_at:'{{$authority->created_at}}'},
                     @endforeach
                 ],
             },

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

@@ -14,6 +14,10 @@
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('maintenance/authority')}}" :class="{active:isActive('authority',2)}">权限</a>
                 </li> @endcan
+            @can('工作组')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{url('maintenance/userWorkGroup')}}" :class="{active:isActive('userWorkGroup',2)}">工作组</a>
+                </li> @endcan
             @can('货主')
                 <li class="nav-item">
                     <a class="nav-link text-dark" href="{{url('maintenance/owner')}}" :class="{active:isActive('owner',2)}">货主</a>

+ 16 - 3
resources/views/maintenance/user/create.blade.php

@@ -60,7 +60,6 @@
                                     @enderror
                                 </div>
                             </div>
-
                             <div class="form-group row">
                                 <label for="password-confirm" class="col-md-3 col-form-label text-md-right">重输密码</label>
 
@@ -68,6 +67,16 @@
                                     <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                                 </div>
                             </div>
+                            <div class="form-group row">
+                                <label for="userWorkGroupID" class="col-md-3 col-form-label text-md-right">工作组</label>
+
+                                <div class="col-md-7">
+                                    <select class="form-control" name="userWorkGroupID" id="userWorkGroupID">
+                                        <option></option>
+                                        <option v-for="userWorkGroup in userWorkGroups" :value="userWorkGroup.id">@{{ userWorkGroup.name }}</option>
+                                    </select>
+                                </div>
+                            </div>
                             <div class="form-group row">
                                 <label for="role" class="col-md-3 col-form-label text-md-right">角色</label>
                                 <div class="col-md-7">
@@ -104,7 +113,6 @@
                             <div class="form-group row">
                                 <label class="col-md-3"></label>
                                 <div class="col-md-4">
-                                    <input name="carrier" hidden   v-model="carriers" >
                                     <div class="input-group" style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
                                         <ul class="list-group tooltipTarget" style="width: 100%" onselectstart="return false;">
                                             <li  :data-original-title="carrier.style ? '双击删除承运商' : '双击添加承运商'"    v-for="carrier in carriersAll" :id="carrier.name"
@@ -124,7 +132,7 @@
                                 </div>
                             </div>
 
-                            <input type="hidden" name="headTo" value="{{url('maintenance/user/create')}}">
+                            <input type="hidden" value="{{url('maintenance/user/create')}}">
                             <div class="form-group row mb-0">
                                 <div class="col-md-7 offset-md-4">
                                     <button type="submit" class="btn btn-primary">
@@ -145,6 +153,11 @@
         let vueList=new Vue({
             el:"#editPanel",
             data:{
+                userWorkGroups:[
+                    @foreach($userWorkGroups as $userWorkGroup)
+                    {!! $userWorkGroup !!},
+                    @endforeach
+                ],
                 rolesAll:[
                     @foreach( $rolesAll as $role )
                     {id:'{{$role->id}}',name:'{{$role->name}}',style:false},

+ 17 - 0
resources/views/maintenance/user/edit.blade.php

@@ -44,6 +44,14 @@
                             @enderror
                         </div>
                     </div>
+                    <div class="form-group row">
+                        <label for="userWorkGroup" class="col-2 col-form-label text-right">工作组</label>
+                        <div class="col-8">
+                            <select class="form-control" name="userWorkGroupID" id="userWorkGroupID" v-model="userWorkGroupID">
+                                <option v-for="userWorkGroup in userWorkGroups" :value="userWorkGroup.id">@{{ userWorkGroup.name }}</option>
+                            </select>
+                        </div>
+                    </div>
                     <div class="form-group row">
                         <label for="role" class="col-md-3 col-form-label text-md-right">角色</label>
                         <div class="col-md-7">
@@ -70,6 +78,8 @@
                             </div>
                         </div>
                     </div>
+                    <hr class="col-8 offset-2 border-info">
+                    {{--承运商--}}
                     <div class="form-group row">
                         <label for="carrier" class="col-md-3 col-form-label text-md-right">可见承运商</label>
                         <div class="col-md-7">
@@ -97,6 +107,7 @@
                             </div>
                         </div>
                     </div>
+                    <hr class="col-8 offset-2 border-info">
                     <div class="form-group row">
                         <div class="col-8 offset-2">
                             <input type="submit" class="btn btn-outline-dark form-control">
@@ -114,6 +125,12 @@
         let vueList=new Vue({
             el:"#editPanel",
             data:{
+                userWorkGroupID:'{{old('userWorkGroupID')??($userWorkGroup?$userWorkGroup->id:'')}}',
+                userWorkGroups:[
+                    @foreach($userWorkGroups as $userWorkGroup)
+                    {!! $userWorkGroup !!},
+                    @endforeach
+                ],
                 rolesAll:[
                         @foreach( $rolesAll as $role )
                     {id:'{{$role->id}}',name:'{{$role->name}}',style:false},

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

@@ -17,6 +17,7 @@
                         <th>ID</th>
                         <th>用户名</th>
                         <th>角色</th>
+                        <th>工作组</th>
                         <th>配置承运商</th>
                         <th>邮件地址</th>
                         <th>创建时间</th>
@@ -31,6 +32,7 @@
                                 <li v-for="role in user.roles" style="list-style: none">@{{ role.name }}</li>
                             </ul>
                         </td>
+                        <td><span v-if="user.workGroup&&user.workGroup.length>0">@{{ user.workGroup[0].name }}</span></td>
                         <td>
                             <ul v-if="user.carriers.length>0" class="list-group">
                                 <li v-for="carrier in user.carriers" style="list-style: none">@{{ carrier.name }}</li>
@@ -61,7 +63,7 @@
                     @foreach( $users as $user )
                     {id:'{{$user->id}}',name:'{{$user->name}}',email:'{{$user->email}}',
                         isSuperAdmin:'{{$user->isSuperAdmin}}',
-                        roles:{!! $user->roles !!},carriers:{!! $user->carriers !!},created_at:'{{$user->created_at}}'},
+                        roles:{!! $user->roles !!},carriers:{!! $user->carriers !!},workGroup:{!! $user->userWorkGroups !!},created_at:'{{$user->created_at}}'},
                     @endforeach
                 ],
             },

+ 35 - 0
resources/views/maintenance/userWorkGroup/create.blade.php

@@ -0,0 +1,35 @@
+@extends('layouts.app')
+@section('title')新建工作组@endsection
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.userWorkGroup.menu')@endcomponent
+    </div>
+    <div class="container-fluid mt-3">
+        <div class="card col-md-8 offset-md-2">
+            <div class="card-body">
+                <form method="POST" action="{{ url('maintenance/userWorkGroup') }}">
+                    @csrf
+                    <div class="form-group row">
+                        <label for="name" class="col-2 col-form-label text-right">工作组名称</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('name') is-invalid @enderror"
+                                   name="name" autocomplete="off" value="{{ old('name') }}" required>
+                            @error('name')
+                            <span class="invalid-feedback" role="alert">
+                                        <strong>{{ $message }}</strong>
+                                    </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-success form-control">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection

+ 40 - 0
resources/views/maintenance/userWorkGroup/edit.blade.php

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

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

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

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

@@ -0,0 +1,16 @@
+
+<div class="container-fluid">
+    <div class="card" style="background: #f9f0f0;transform: scale(0.95)">
+        <ul class="nav nav-pills">
+            @can('工作组-查询')
+            <li class="nav-item">
+                <a class="nav-link" href="{{url('maintenance/userWorkGroup')}}" :class="{active:isActive('',3)}">查询</a>
+            </li> @endcan
+            @can('工作组-录入')
+            <li class="nav-item">
+                <a class="nav-link" href="{{url('maintenance/userWorkGroup/create')}}" :class="{active:isActive('create',3)}">录入</a>
+            </li> @endcan
+            {{$slot}}
+        </ul>
+    </div>
+</div>

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

@@ -8,12 +8,13 @@
     <body>
         <div class="card col-md-8 offset-md-2 mt-5">
             <div class="card-body">
-                <form method="post" action="{{url('userDutyCheck/storeClock')}}">
+                <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 hidden name="userWorkGroupID" value="{{$userWorkGroupID}}">
                     <div class="form-group row pt-3">
                         <button type="submit" class="col-7 offset-2 btn btn-success">提交</button>
                     </div>

+ 49 - 10
resources/views/process/checking-in/clockAudit.blade.php → resources/views/personnel/checking-in/clockAudit.blade.php

@@ -2,8 +2,8 @@
 @section('title')打卡审核@endsection
 @section('content')
     <div id="nav2">
-        @component('process.menu')@endcomponent
-        @component('process.checking-in.menuChecking-in')@endcomponent
+        @component('personnel.menu')@endcomponent
+        @component('personnel.checking-in.menuChecking-in')@endcomponent
     </div>
     <div class="container-fluid mt-3" id="list">
         <div class="card col-md-10 offset-md-1">
@@ -17,7 +17,8 @@
                         <td>劳务所</td>
                         <td>打卡时间</td>
                         <td>打卡类型</td>
-                        <td>操作</td>
+                        @can('人事管理-打卡审核')<td>操作</td>@endcan
+                        <td v-if="workGroupSign">组长审核</td>
                         <td>异常</td>
                         <td>合计工时</td>
                     </tr>
@@ -36,9 +37,13 @@
                                 <option value="登出">登出</option>
                             </select>
                         </td>
-                        <td>
+                        @can('人事管理-打卡审核')<td>
                             <b v-if="userDutyCheck.verify_user_id" class="text-success">已审核</b>
                             <button v-else @click="storeClockAudit(userDutyCheck.id,userDutyCheck.type)" class="btn btn-primary w-80">审核</button>
+                        </td>@endcan
+                        <td v-if="workGroupSign">
+                            <b v-if="userDutyCheck.group_user_id" class="text-success">已审核</b>
+                            <button v-else @click="storeGroupAudit(userDutyCheck.id,userDutyCheck.type)" class="btn btn-primary w-80">组长审核</button>
                         </td>
                         <td>@{{ userDutyCheck.exception }}</td>
                         <td>@{{ userDutyCheck.duration_man_hour }}</td>
@@ -58,20 +63,30 @@
                 userDutyChecks:[
                     @foreach($userDutyChecks as $userDutyCheck)
                     {id:'{{$userDutyCheck->id}}',user_id:'{{$userDutyCheck->user_id}}',checked_at:'{{$userDutyCheck->checked_at}}',
-                    type:'{{$userDutyCheck->type}}',verify_user_id:'{{$userDutyCheck->verify_user_id}}',
+                    type:'{{$userDutyCheck->type}}',verify_user_id:'{{$userDutyCheck->verify_user_id}}',group_user_id:'{{$userDutyCheck->group_user_id}}',
                     exception:'',duration_man_hour:'',@if($userDutyCheck->userDetail)user_detail:{!! $userDutyCheck->userDetail !!} @endif },
                     @endforeach
                 ],
+                workGroupSign:'{{$workGroupSign}}',
             },
             methods:{
+                store(id,type,url){
+
+                },
                 storeClockAudit(id,type){
+                    let url='{{url("personnel/checking-in/storeClockAudit")}}';
                     let _this=this;
-                    axios.post('{{url("process/storeClockAudit")}}',{id:id,type:type})
+                    axios.post(url,{id:id,type:type})
                         .then(function (response) {
+                            if (!response.data.success){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
                             _this.userDutyChecks.every(function (userDutyCheck) {
                                 if (userDutyCheck.id==id){
-                                    userDutyCheck.verify_user_id=response.data;
-                                    tempTip.setDuration(4000);
+                                    userDutyCheck.verify_user_id=response.data.data;
+                                    tempTip.setDuration(3000);
                                     tempTip.showSuccess('审核通过!');
                                     return false
                                 }
@@ -80,11 +95,35 @@
                         }).catch(function (err) {
                         tempTip.setDuration(4000);
                         tempTip.show('审核失败!网络错误:'+err);
-                        });
+                    });
+                },
+                storeGroupAudit(id,type){
+                    let url='{{url("personnel/checking-in/storeGroupAudit")}}';
+                    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.userDutyChecks.every(function (userDutyCheck) {
+                                if (userDutyCheck.id==id){
+                                    userDutyCheck.group_user_id=response.data.data;
+                                    tempTip.setDuration(3000);
+                                    tempTip.showSuccess('审核通过!');
+                                    return false
+                                }
+                                return true;
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('审核失败!网络错误:'+err);
+                    });
                 },
                 isException(id,user_id,checked_at,type){
                     let _this=this;
-                    axios.post('{{url("process/isException")}}',{id:id,user_id:user_id,checked_at:checked_at,type:type})
+                    axios.post('{{url("personnel/checking-in/isException")}}',{id:id,user_id:user_id,checked_at:checked_at,type:type})
                         .then(function (response) {
                             _this.userDutyChecks.every(function (userDutyCheck) {
                                 if (userDutyCheck.id==id){

+ 4 - 4
resources/views/process/checking-in/createReplenishClock.blade.php → resources/views/personnel/checking-in/createReplenishClock.blade.php

@@ -2,8 +2,8 @@
 @section('title')录入补卡@endsection
 @section('content')
     <div id="nav2">
-        @component('process.menu')@endcomponent
-        @component('process.checking-in.menuChecking-in')@endcomponent
+        @component('personnel.menu')@endcomponent
+        @component('personnel.checking-in.menuChecking-in')@endcomponent
     </div>
     <div class="container-fluid mt-3" id="list">
         <div class="card col-md-10 offset-md-1">
@@ -73,7 +73,7 @@
                         tempTip.show('请输入临时工全名进行搜索!');
                         return;
                     }
-                    axios.post("{{url('process/checkUserLabors')}}",{full_name:full_name})
+                    axios.post("{{url('personnel/checking-in/checkUserLabors')}}",{full_name:full_name})
                         .then(function (response) {
                             if (response.data.success){
                                 if (response.data.data.length<1){
@@ -100,7 +100,7 @@
                     let user_id=userLabor.user_id;
                     let type=userLabor.userDutyCheck_type;
                     let _this=this;
-                    axios.post("{{url('process/storeReplenishClock')}}",{user_id:user_id,checked_at:checked_at,type:type})
+                    axios.post("{{url('personnel/checking-in/storeReplenishClock')}}",{user_id:user_id,checked_at:checked_at,type:type})
                         .then(function (response) {
                             if (response.data.success){
                                 _this.userLabors.every(function (userLabor) {

+ 2 - 1
resources/views/process/checking-in/createUserDetail.blade.php → resources/views/personnel/checking-in/createUserDetail.blade.php

@@ -8,7 +8,7 @@
 <body>
 <div class="card col-md-8 offset-md-2 mt-5">
     <div class="card-body">
-        <form method="POST" action="{{url('userDutyCheck/storeUserDetail')}}">
+        <form method="POST" action="{{url('personnel/checking-in/userDutyCheck/storeUserDetail')}}">
             @csrf
             <div class="form-group row pb-0 m-auto">
                 <h6 class="col-6 offset-4 text-danger">未查询到您的信息,请登记您的资料!</h6>
@@ -36,6 +36,7 @@
                 <label for="company" class="form-check-label col-3 pull-left">劳务所:</label>
                 <input name="company" id="company" class="col-7 form-control" type="text">
             </div>
+            <input hidden name="userWorkGroupID" value="{{$userWorkGroupID}}">
             <div class="form-group row pt-3">
                 <button type="submit" class="col-7 offset-2 btn btn-success">登记</button>
             </div>

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

@@ -0,0 +1,60 @@
+@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 p-0 m-0">
+                <div class="container pull-left m-0 p-0 dontprint" style="width: 20%;">
+                    <div class="btn-group-vertical ml-0 mt-5" >
+                        <button type="button" @click="getQRCode(userWorkGroup.id)" :class="userWorkGroup.id==checkedUserWorkGroup ? 'btn-primary' : 'btn-outline-primary'"
+                                class="btn" v-for="userWorkGroup in userWorkGroups">@{{ userWorkGroup.name }}</button>
+                    </div>
+                </div>
+                <div class="col m-0 pull-right mt-5" style="width: 80%">
+                    <img id="img" class="col-6 pull-left m-auto" style="max-height: 300px;max-width: 300px;"  src="{{url('personnel/checking-in/userDutyCheck/getQRCode')}}" />
+                    <div class="pull-right col-6" style="margin-top: 5%">
+                        <h3 class="text-center text-dark">首次扫描后将与设备绑定,之后扫描需使用原设备与原软件!</h3><br>
+                        <h4 class="text-center text-danger">如更换设备请联系管理人员解除设备绑定!</h4>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <style type="text/css" media="print">
+        .dontprint
+        { display: none; }
+    </style>
+    <script>
+        new Vue({
+            el:"#page",
+            data:{
+                userWorkGroups:[
+                    @foreach($userWorkGroups as $userWorkGroup)
+                    {!! $userWorkGroup !!},
+                    @endforeach
+                ],
+                checkedUserWorkGroup:'',
+            },
+            methods:{
+                getQRCode(userWorkGroup_id){
+                    let _this=this;
+                    axios.get('{{url("personnel/checking-in/userDutyCheck/getQRCode?userWorkGroup_id=")}}'+userWorkGroup_id)
+                        .then(function (response) {
+                            $("#img").attr('src',response.data);
+                            _this.checkedUserWorkGroup=userWorkGroup_id;
+                        }).catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('获取二维码失败!网络错误:'+err);
+                        });
+                }
+            },
+        });
+    </script>
+@endsection

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

@@ -0,0 +1,22 @@
+<div class="container-fluid">
+    <div class="card menu-third" style="background: #f9f0f0;transform: scale(0.95)">
+        <ul class="nav nav-pills">
+                @can('人事管理-录入补卡')
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('personnel/checking-in/createReplenishClock')}}" :class="{active:isActive('createReplenishClock',3)}">录入补卡</a>
+                </li>@endcan
+                @can('人事管理-获取二维码')
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('personnel/checking-in/userDutyCheck/goGetQRCode')}}" :class="{active:isActive('goGetQRCode',4)}">获取二维码</a>
+                </li>@endcan
+                @can('人事管理')
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('personnel/checking-in/clockAudit')}}" :class="{active:isActive('clockAudit',3)}">打卡审核</a>
+                </li>@endcan
+                @can('人事管理-任务审核')
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('personnel/checking-in/missionAudit')}}" :class="{active:isActive('missionAudit',3)}">任务审核</a>
+                </li>@endcan
+        </ul>
+    </div>
+</div>

+ 4 - 4
resources/views/process/checking-in/missionAudit.blade.php → resources/views/personnel/checking-in/missionAudit.blade.php

@@ -2,8 +2,8 @@
 @section('title')任务审核@endsection
 @section('content')
     <div id="nav2">
-        @component('process.menu')@endcomponent
-        @component('process.checking-in.menuChecking-in')@endcomponent
+        @component('personnel.menu')@endcomponent
+        @component('personnel.checking-in.menuChecking-in')@endcomponent
     </div>
 
     <div class="container-fluid card" id="list">
@@ -14,7 +14,7 @@
                     <tr v-if="isBeingFilterConditions">
                         <td colspan="4">
                             <div class="col" style="padding:0">
-                                <a  href="{{url('process/checking-in/missionAudit')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
+                                <a  href="{{url('personnel/checking-in/missionAudit')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
                             </div></td>
                         <td></td>
                     </tr>
@@ -154,7 +154,7 @@
             //提交审核
             storeMissionAudit(id){
                 let _this=this;
-                axios.post('{{url("process/storeMissionAudit")}}',{id:id})
+                axios.post('{{url("personnel/checking-in/storeMissionAudit")}}',{id:id})
                     .then(function (response) {
                         if (response.data.error){
                             tempTip.setDuration(3000);

+ 0 - 0
resources/views/process/checking-in/success.blade.php → resources/views/personnel/checking-in/success.blade.php


+ 14 - 0
resources/views/personnel/menu.blade.php

@@ -0,0 +1,14 @@
+
+<div class="container-fluid mt-3" id="nav2">
+    <div class="card">
+        <ul class="nav nav-pills">
+            @can('人事管理')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{url('personnel/checking-in/createReplenishClock')}}" :class="{active:isActive('checking-in',2)}">考勤</a>
+                </li> @endcan
+            <li class="nav-item">
+                <a class="nav-link text-dark" href="{{url('personnel/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>
+            </li>
+        </ul>
+    </div>
+</div>

+ 18 - 0
resources/views/personnel/menuPersonnel.blade.php

@@ -0,0 +1,18 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('personnel.menu')
+        @endcomponent
+        <div class="container-fluid">
+            <div class="card menu-third" style="background: #f9f0f0;transform: scale(0.95)">
+                <ul class="nav nav-pills">
+                    @can('工作组')
+                    <li class="nav-item">
+                        <a class="nav-link text-dark" href="{{url('maintenance/userWorkGroup')}}" :class="{active:isActive('userWorkGroup',2)}">工作组</a>
+                    </li> @endcan
+                </ul>
+            </div>
+        </div>
+    </div>
+@endsection

+ 0 - 19
resources/views/process/checking-in/getQRcode.blade.php

@@ -1,19 +0,0 @@
-@extends('layouts.app')
-@section('title')获取二维码@endsection
-@section('content')
-    <div id="nav2">
-        @component('process.menu')@endcomponent
-        @component('process.checking-in.menuChecking-in')@endcomponent
-    </div>
-    <div class="container-fluid mt-3" id="list">
-        <div class="card col-md-10 offset-md-1">
-            <div class="card-body col">
-                <img class="pull-left col-6" src="{{url('userDutyCheck/getQRCode')}}" />
-                <div class="pull-right col-6" style="margin-top: 10%">
-                    <h3 class="text-center text-primary">首次扫描后将与设备绑定,之后扫描需使用原设备与原软件!</h3><br>
-                    <h4 class="text-center text-info">如更换设备请联系管理人员解除设备绑定!</h4>
-                </div>
-            </div>
-        </div>
-    </div>
-@endsection

+ 0 - 19
resources/views/process/checking-in/menuChecking-in.blade.php

@@ -1,19 +0,0 @@
-<div class="container-fluid">
-    <div class="card menu-third" style="background: #f9f0f0;transform: scale(0.95)">
-        <ul class="nav nav-pills">
-            @can('二次加工管理')
-                <li class="nav-item">
-                    <a class="nav-link text-dark" href="{{url('process/checking-in/createReplenishClock')}}" :class="{active:isActive('createReplenishClock',3)}">录入补卡</a>
-                </li>
-                <li class="nav-item">
-                    <a class="nav-link text-dark" href="{{url('userDutyCheck/goGetQRCode')}}" :class="{active:isActive('goGetQRCode',2)}">获取二维码</a>
-                </li>
-                <li class="nav-item">
-                    <a class="nav-link text-dark" href="{{url('process/checking-in/clockAudit')}}" :class="{active:isActive('clockAudit',3)}">打卡审核</a>
-                </li>
-                <li class="nav-item">
-                    <a class="nav-link text-dark" href="{{url('process/checking-in/missionAudit')}}" :class="{active:isActive('missionAudit',3)}">任务审核</a>
-                </li>@endcan
-        </ul>
-    </div>
-</div>

+ 2 - 2
resources/views/process/index.blade.php

@@ -268,7 +268,7 @@
                         <input class="checkItem" type="checkbox" :value="processOne.id" v-model="checkData">
                     </td>
                     <td :rowspan="processOne.rowspan" v-if="processOne.id" class="text-muted">@{{ i+1 }}</td>
-                    <td :rowspan="processOne.rowspan" v-if="processOne.id">
+                    <td :rowspan="processOne.rowspan" v-if="processOne.id" style="min-width:150px" >
                         <p v-if="!processOne.openProcessHour && processOne.status=='驳回'" class="text-muted">已驳回</p>
                         <p v-if="!processOne.openProcessHour && processOne.status=='已完成'" class="text-success">已完成</p>
                         @can("二次加工管理-接单与驳回")
@@ -418,7 +418,7 @@
                                 <td class="text-danger">@{{ processDailyParticipant.diff }}</td>
                                 <td class="text-danger">@{{ processDailyParticipant.billingHour }}</td>
                                 <td class="text-danger">
-                                    @can("二次加工管理-登记工时-审核")<button @click="processDailyParticipantAudit(processDailyParticipant.id)" v-if="processDailyParticipant.status=='未审核'" class="btn btn-sm btn-outline-success">审核</button>@endcan
+                                    @can("人事管理-任务审核")<button @click="processDailyParticipantAudit(processDailyParticipant.id)" v-if="processDailyParticipant.status=='未审核'" class="btn btn-sm btn-outline-success">审核</button>@endcan
                                     <b v-else class="text-success">@{{ processDailyParticipant.status }}</b>
                                 </td>
                                 @can("二次加工管理-临时工资料管理")<td class="text-info"><u v-if="processDailyParticipant.user_detail_full_name" style="cursor:pointer" @click="showUserDetail(processDailyParticipant.user_id)">详情</u></td>@endcan

+ 0 - 4
resources/views/process/menu.blade.php

@@ -15,10 +15,6 @@
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('process/statistic')}}" :class="{active:isActive('statistic',2)}">统计</a>
                 </li> @endcan
-            @can('二次加工管理-查询')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{url('process/checking-in/createReplenishClock')}}" :class="{active:isActive('checking-in',2)}">考勤</a>
-                </li> @endcan
             <li class="nav-item">
                 <a class="nav-link text-dark" href="{{url('process/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>
             </li>

+ 29 - 88
routes/web.php

@@ -39,6 +39,7 @@ Route::resource('maintenance/province','ProvincesController');
 Route::resource('maintenance/city','CitiesController');
 Route::resource('maintenance/commodity', 'CommodityController');
 Route::resource('maintenance/measuringMachine', 'MeasuringMachineController');
+Route::resource('maintenance/userWorkGroup', 'UserWorkGroupController');
 //教程管理
 Route::resource('maintenance/tutorial', 'TutorialController');
 //教程展示
@@ -119,68 +120,12 @@ Route::get('store','StoreController@index');
 Route::resource('store/fast','StoreController');
 Route::resource('store/storeItem','StoreItemsController');
 
-/**
- * 二次加工单
- */
-Route::group(['prefix'=>'process'],function(){
-    //相关设置
-    Route::get('relating',function (){return view('process.menuProcess');});
-    //统计页面
-    Route::get('statistic','ProcessStatisticController@index');
-    //获取每日参与人
-    Route::post('getDailyParticipant','ProcessController@getDailyParticipant');
-    //驳回
-    Route::post('reject/{id}','ProcessController@reject');
-    //接单
-    Route::post('receive/{id}','ProcessController@receive');
-    //完成
-    Route::post('accomplish/{id}','ProcessController@accomplish');
-    //修改每日产量
-    Route::post('updateDailyOutput','ProcessController@updateDailyOutput');
-    //添加参与人
-    Route::post('shortProcessDailyParticipant','ProcessController@shortProcessDailyParticipant');
-    //验证参与人
-    Route::post('verifyUserName','ProcessController@verifyUserName');
-    //修改参与人
-    Route::post('updateProcessDailyParticipant','ProcessController@updateProcessDailyParticipant');
-    //参与人审核
-    Route::post('processDailyParticipantAudit/{id}','ProcessController@processDailyParticipantAudit');
-    //临时工详情
-    //Route::post('showUserDetail','ProcessController@showUserDetail');
-    //获取全部教程
-    Route::post('getTutorials/{id}','ProcessController@getTutorials');
-    //添加教程关联
-    Route::post('selectedTutorial','ProcessController@selectedTutorial');
-    //删除教程关联
-    Route::post('deleteTutorial','ProcessController@deleteTutorial');
-    //根据货主获取教程
-    Route::post('ownerGetTutorials/{owner_id}','ProcessController@ownerGetTutorials');
-    //录入补卡
-    Route::get('checking-in/createReplenishClock','ProcessController@createReplenishClock');
-    //搜索临时工下打卡信息
-    Route::post('checkUserLabors','ProcessController@checkUserLabors');
-    //录入补卡
-    Route::post('storeReplenishClock','ProcessController@storeReplenishClock');
-    //去往打卡审核
-    Route::get('checking-in/clockAudit','ProcessController@clockAudit');
-    //去往任务审核
-    Route::get('checking-in/missionAudit','ProcessController@missionAudit');
-    //打卡审核
-    Route::post('storeClockAudit','ProcessController@storeClockAudit');
-    //打卡审核登出类型判断异常
-    Route::post('isException','ProcessController@isException');
-    //任务审核
-    Route::post('storeMissionAudit','ProcessController@storeMissionAudit');
-    //删除二次加工内容单
-    Route::post('deleteProcessContent/{id}','ProcessController@deleteProcessContent');
-});
-//process主方法 restful
-Route::resource('process','ProcessController');
+
 /**
  *  用户打卡
  */
-Route::group(['prefix'=>'userDutyCheck'],function(){
-    //进入获取二维码页面
+Route::group(['prefix'=>'personnel/checking-in/userDutyCheck'],function(){
+    //进入获取当日二维码
     Route::get('goGetQRCode','UserDutyCheckController@goGetQRCode');
     //获取当日二维码
     Route::get('getQRCode','UserDutyCheckController@getQRCode');
@@ -226,39 +171,35 @@ Route::group(['prefix'=>'process'],function(){
     Route::post('deleteTutorial','ProcessController@deleteTutorial');
     //根据货主获取教程
     Route::post('ownerGetTutorials/{owner_id}','ProcessController@ownerGetTutorials');
-    //录入补卡
-    Route::get('checking-in/createReplenishClock','ProcessController@createReplenishClock');
-    //搜索临时工下打卡信息
-    Route::post('checkUserLabors','ProcessController@checkUserLabors');
-    //录入补卡
-    Route::post('storeReplenishClock','ProcessController@storeReplenishClock');
-    //去往打卡审核
-    Route::get('checking-in/clockAudit','ProcessController@clockAudit');
-    //去往任务审核
-    Route::get('checking-in/missionAudit','ProcessController@missionAudit');
-    //打卡审核
-    Route::post('storeClockAudit','ProcessController@storeClockAudit');
-    //打卡审核登出类型判断异常
-    Route::post('isException','ProcessController@isException');
-    //任务审核
-    Route::post('storeMissionAudit','ProcessController@storeMissionAudit');
     //删除二次加工内容单
     Route::post('deleteProcessContent/{id}','ProcessController@deleteProcessContent');
 });
 //process主方法 restful
 Route::resource('process','ProcessController');
+
+
 /**
- *  用户打卡
+ * 人事
  */
-Route::group(['prefix'=>'userDutyCheck'],function(){
-    //获取当日二维码
-    Route::get('getQRCode','UserDutyCheckController@getQRCode');
-    //进入打卡接口
-    Route::get('clock','UserDutyCheckController@clock');
-    //提交打卡
-    Route::post('storeClock','UserDutyCheckController@storeClock');
-    //去往登记资料页面
-    Route::get('createUserDetail/{mobile_phone}','UserDutyCheckController@createUserDetail');
-    //提交登记资料
-    Route::post('storeUserDetail','UserDutyCheckController@storeUserDetail');
-});
+Route::group(['prefix'=>'personnel'],function(){
+    //去往录入补卡
+    Route::get('checking-in/createReplenishClock','PersonnelController@createReplenishClock');
+    //搜索临时工下打卡信息
+    Route::post('checking-in/checkUserLabors','PersonnelController@checkUserLabors');
+    //录入补卡
+    Route::post('checking-in/storeReplenishClock','PersonnelController@storeReplenishClock');
+    //去往打卡审核
+    Route::get('checking-in/clockAudit','PersonnelController@clockAudit');
+    //去往任务审核
+    Route::get('checking-in/missionAudit','PersonnelController@missionAudit');
+    //打卡审核
+    Route::post('checking-in/storeClockAudit','PersonnelController@storeClockAudit');
+    //打卡组长审核
+    Route::post('checking-in/storeGroupAudit','PersonnelController@storeGroupAudit');
+    //打卡审核登出类型判断异常
+    Route::post('checking-in/isException','PersonnelController@isException');
+    //任务审核
+    Route::post('checking-in/storeMissionAudit','PersonnelController@storeMissionAudit');
+    //相关设置
+    Route::get('relating',function (){return view('personnel/menuPersonnel');});
+});