| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- <?php
- namespace App\Http\Controllers;
- use App\Events\ClockoutEvent;
- use App\Events\GuardAuditEvent;
- use App\Events\TeamAuditEvent;
- use App\Exports\Export;
- use App\LaborReport;
- use App\LaborReportStatus;
- 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;
- class LaborReportController extends Controller
- {
- //超15天精确查询抽离 cloumn前提:数据库字段名必须与request内字段名一致
- public function preciseQuery(string $column,Request $request,$laborReports){
- $today=Carbon::now()->subDays(15);
- $laborReportsTem=clone $laborReports;
- $laborReportsTem=$laborReportsTem->where($column,'like','%'.$request->input($column).'%')->where('created_at','>',$today->format('Y-m-d'));
- if($laborReportsTem->count()==0
- ||$laborReportsTem->get()[0][$column]==$request->input($column)){
- $laborReports=$laborReports->where($column,$request->input($column));
- }else{
- $laborReports=$laborReportsTem;
- }
- return $laborReports;
- }
- public function conditionQuery(Request $request,$laborReports){
- if ($request->input('enter_number')){
- $laborReports=$this->preciseQuery('enter_number',$request,$laborReports);
- }
- if ($request->input('user_workgroup_id')){
- $laborReports=$this->preciseQuery('user_workgroup_id',$request,$laborReports);
- }
- if ($request->input('created_at_start')){
- $created_at_start=$request->input('created_at_start')." 00:00:00";
- $laborReports=$laborReports->where('created_at','>=',$created_at_start);
- }
- if ($request->input('created_at_end')){
- $created_at_end=$request->input('created_at_end')." 23:59:59";
- $laborReports=$laborReports->where('created_at','<=',$created_at_end);
- }
- if ($request->input('mobile_phone')){
- $laborReports=$laborReports->where('mobile_phone',$request->input('mobile_phone'));
- }
- if ($request->input('identity_number')){
- $laborReports=$this->preciseQuery('identity_number',$request,$laborReports);
- }
- return $laborReports;
- }
- /**
- * Display a listing of the resource.
- *@param \Illuminate\Http\Request $request
- * @return \Illuminate\Http\Response
- * 临时工报表
- */
- public function index(Request $request)
- {
- //if(!Gate::allows('人事管理')){ return redirect(url('/')); }
- if(!Gate::allows('人事管理-临时工报表')){ return redirect(url('/')); }
- $user=Auth::user();
- if (!$user)return redirect('/');
- $userWorkgroupIds=$user->getPermittingWorkgroupIds(Gate::allows('人事管理-临时工报表-可见全部组'));
- $permittingWorkgroups=UserWorkgroup::whereIn('id',$userWorkgroupIds)->get();
- if($permittingWorkgroups->isEmpty())$permittingWorkgroups="[]";
- $laravelEchoPrefix = config('database.redis.options.prefix');
- 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(),'permittingWorkgroups'=>$permittingWorkgroups,'laravelEchoPrefix'=>$laravelEchoPrefix,]);
- }
- $laborReportsBuilder=LaborReport::with(['user','userDutyCheck','userWorkgroup'])->whereIn('user_workgroup_id',$userWorkgroupIds);
- if(Gate::allows('人事管理-临时工报表-可见全部组')||Gate::allows('人事管理-门卫审核')){
- $laborReportsBuilder->orWhereNull('user_workgroup_id');
- }
- $laborReports=$laborReportsBuilder->orderBy('id','DESC')->paginate(50);
- $laborReports=$laborReports->sortBy('name');
- $laborReports->values()->all();
- foreach ($laborReports as $laborReport){
- // if (!$laborReport->group_user_id){
- // //三十分钟之内组长未审核实行软删除
- // $tenMinutesLater=Carbon::parse($laborReport->created_at)->subMinutes(-30)->format('Y-m-d H:i:s');
- // if (Carbon::now()->format('Y-m-d H:i:s')>$tenMinutesLater){
- // $laborReport->delete();
- // $this->log(__METHOD__,"组长未审核该条记录将在10分钟后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
- // }
- // }
- $addOneHourCheckedAt=Carbon::parse($laborReport->userDutyCheck['checked_at'])->subHours(-1)->format('Y-m-d H:i:s');
- if (!$laborReport->userDutyCheck['verify_user_id']&&Carbon::now()->format('Y-m-d H:i:s')>$addOneHourCheckedAt){
- $laborReport->delete();
- $this->log(__METHOD__,"进场门卫未审核该条记录将在一小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
- }
- }
- $userWorkGroups=UserWorkgroup::select('id','name')->get();
- return view('personnel/laborReport/index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,'laravelEchoPrefix'=>$laravelEchoPrefix,'permittingWorkgroups'=>$permittingWorkgroups]);
- }
- public function export($id,Request $request){
- if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
- ini_set('max_execution_time',3500);
- ini_set('memory_limit','3526M');
- if ($id==-1){
- $id=[];
- $laborReports=LaborReport::select('id');
- $laborReports=$this->conditionQuery($request,$laborReports);
- $laborReports=$laborReports->get();
- foreach ($laborReports as $laborReports){
- array_push($id,$laborReports->id);
- }
- }else $id = explode( ',',$id);
- if (!$id)return ;
- $row=[[
- 'id'=>'ID',
- 'enter_at'=>'进场时间',
- 'exit_at'=>'退场时间',
- 'enter_number'=>'进厂编号',
- 'user_workgroup_name'=>'小组',
- 'name'=>'临时工',
- 'mobile_phone'=>'电话',
- 'identity_number'=>'身份证号',
- 'labor_company'=>'劳务所',
- 'check_in_at'=>'进组时间',
- 'check_out_at'=>'退组时间',
- 'verify_at'=>'审核时间',
- 'group_user_id'=>'审核人',
- 'relax_time'=>'晚饭时间(分)',
- 'online_duration'=>'在线时长',
- 'working_duration'=>'本次工作时长',
- 'remark'=>'备注',
- ]];
- $list=[];
- for ($i=0; $i<count($id);$i++){
- $laborReport=LaborReport::with(['userWorkgroup','user'])->find($id[$i]);
- $w=[
- 'id'=>isset($laborReport->id)?$laborReport->id:'',
- 'enter_at'=>isset($laborReport->enter_at)?$laborReport->enter_at:'',
- 'exit_at'=>isset($laborReport->exit_at)?$laborReport->exit_at:'',
- 'enter_number'=>isset($laborReport->enter_number)?$laborReport->enter_number:'',
- 'user_workgroup_name'=>isset($laborReport->userWorkgroup->name)?$laborReport->userWorkgroup->name:'',
- 'name'=>isset($laborReport->name)?$laborReport->name:'',
- 'mobile_phone'=>isset($laborReport->mobile_phone)?$laborReport->mobile_phone:'',
- 'identity_number'=>isset($laborReport->identity_number)?$laborReport->identity_number:'',
- 'labor_company'=>isset($laborReport->labor_company)?$laborReport->labor_company:'',
- 'check_in_at'=>isset($laborReport->check_in_at)?$laborReport->check_in_at:'',
- 'check_out_at'=>isset($laborReport->check_out_at)?$laborReport->check_out_at:'',
- 'verify_at'=>isset($laborReport->verify_at)?$laborReport->verify_at:'',
- 'group_user_id'=>isset($laborReport->user->name)?$laborReport->user->name:'',
- '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:'',
- 'remark'=>isset($laborReport->remark)?$laborReport->remark:'',
- ];
- $list[$i]=$w;
- }
- 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');
- $userDutyCheckId=$request->input('userDutyCheckId');
- $laborReportStatus=new LaborReportStatus([
- 'labor_report_id'=>$id,
- 'status'=>'已入场',
- ]);
- $laborReportStatus->save();
- $this->log(__METHOD__,"门卫打卡审核创建当前临时工报表状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
- $userDutyCheck=UserDutyCheck::find($userDutyCheckId);
- $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);
- $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 addRemarkAndGroupClock(Request $request){
- if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
- $id=$request->input('id');
- $remark=$request->input('remark');
- if(!$remark){ return ["success"=>false,"data"=>"您还未添加任何备注,请返回添加备注!"]; }
- $laborReport=LaborReport::find($id);
- $laborReport->group_user_id=Auth::user()['id'];
- $laborReport->verify_at=date('Y-m-d H:i:s');
- $laborReport->update();
- $laborReport->setRemarkAttribute($remark,$id);
- $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);
- $laborReportStatus=new LaborReportStatus([
- 'labor_report_id'=>$id,
- 'status'=>'已退组',
- ]);
- $laborReportStatus->save();
- $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
- $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->working_duration=$this->minusLunchTime($laborReport,$online_duration);
- if ($laborReport['enter_at']){
- $enter_at=$laborReport['enter_at'];
- $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
- }else{
- $laborReport->online_duration=$online_duration;
- }
- $laborReport->update();
- $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
- $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
- event(new ClockoutEvent($laborReport));
- 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);
- $laborReportStatus=new LaborReportStatus([
- 'labor_report_id'=>$id,
- 'status'=>'已退组',
- ]);
- $laborReportStatus->save();
- $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
- $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);
- 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);
- }
- if ($laborReport->enter_at){
- $enter_at=$laborReport['enter_at'];
- $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
- }else{
- $laborReport->online_duration=$online_duration;
- }
- $laborReport->update();
- $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
- $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
- event(new ClockoutEvent($laborReport));
- return ["success"=>true,"data"=>$laborReport];
- }
- //工作时长减午饭休息时间
- public function minusLunchTime($laborReport,$hour){
- $checkInTime=$laborReport->check_in_at;
- $checkOutTime=$laborReport->check_out_at;
- $checkOutTime=Carbon::parse($checkOutTime)->format('H');
- $checkInTime=Carbon::parse($checkInTime)->format('H');
- if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
- $hour=$hour-1;
- }
- return $hour;
- }
- }
|