queue = "ticket"; $this->recruit_id = $recruit_id; $this->type = $type; $this->data = $data; } /** * Execute the job. * * @return void */ public function handle() { $recruit = Recruit::where('id',$this->recruit_id)->first(); if(!$recruit->status){ return ; } switch ($this->type){ case 'pen': if(!$recruit->pen_ticket_content){ return; } switch ($this->data['type']){ case '1': //自动生成 //$list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('pen_audit',-1)->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray(); $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id'); $list = $this->data['list'];//array_chunk($list,$this->data['auto_each_number'],true); if($this->data['multiple']){ //队列多任务 foreach ($list as $room => $room_list){ foreach ($room_list as $k => $v){ $seat = ($k%30) + 1; $item = [ 'realname' => $v['realname'], 'ex_number' => date("Y",time()) . '0101201' . sprintf("%02d",($room+1)) . sprintf("%02d",$seat), 'card' => $v['card'], 'post' => $post_data[$v['post_id']], 'ex_room' => sprintf("%02d",($room+1)), 'ex_seat' => sprintf("%02d",$seat), 'avatar' => $v['avatar'] ]; $ticket = [ 'appoint_id' => $v['id'], 'ex_type' => 1, 'ex_number' => $item['ex_number'], 'ex_seat' => $item['ex_seat'], 'ex_room' => $item['ex_room'], 'ex_status' => 0, 'ex_start' => $this->data['ex_start'], 'ex_end' => $this->data['ex_end'] ]; RecruitTicket::create($ticket); $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit); } } }else{ $room = $this->data['room']; foreach ($list as $k => $v){ $seat = ($k%30) + 1; $item = [ 'realname' => $v['realname'], 'ex_number' => date("Y",time()) . '0101101' . sprintf("%02d",($room+1)) . sprintf("%02d",$seat), 'card' => $v['card'], 'post' => $post_data[$v['post_id']], 'ex_room' => sprintf("%02d",($room+1)), 'ex_seat' => sprintf("%02d",$seat), 'avatar' => $v['avatar'] ]; $ticket = [ 'appoint_id' => $v['id'], 'ex_type' => 1, 'ex_number' => $item['ex_number'], 'ex_seat' => $item['ex_seat'], 'ex_room' => $item['ex_room'], 'ex_status' => 0, 'ex_start' => $this->data['ex_start'], 'ex_end' => $this->data['ex_end'] ]; RecruitTicket::create($ticket); $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit); } } //$this->pdf('pen',$recruit); //Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]); break; case '2': $ticket_data_list = $list = $this->data['list']; //$list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('pen_audit',-1)->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray(); $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id')->toArray(); if(empty($recruit->preliminary_start)){ $preliminary_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time())))); $preliminary_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time())))); }else{ $preliminary_start = date("Y-m-d H:i:s",strtotime("-5 days",strtotime($recruit->preliminary_start))); $preliminary_end = date("Y-m-d H:i:s",strtotime("+1 days",strtotime($recruit->preliminary_start))); } foreach ($list as $k => $v){ if(!array_key_exists($v['card'],$ticket_data_list)){ echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n"; continue; } if(!array_key_exists($v->post_id,$post_data)){ echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 取消招聘\r\n"; continue; } if(!$this->word_exist($recruit,'pen', ['realname' => $v['realname'],'card' => $v['card'],'post' => $post_data[$v['post_id']]])){ $item = [ 'realname' => $v['realname'], 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '', 'card' => $v['card'], 'post' => $post_data[$v['post_id']], 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '', 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '', 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '', 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '', 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '', 'ex_place' => array_key_exists('ex_place',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_place'] : '', 'avatar' => $v['avatar'] ]; $ticket = [ 'appoint_id' => $v['id'], 'ex_type' => 1, 'ex_number' => $item['ex_number'], 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '', 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '', 'ex_seat' => $item['ex_seat'], 'ex_room' => $item['ex_room'], 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '', 'ex_place' => array_key_exists('ex_place',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_place'] : '', 'ex_status' => 0, 'ex_start' => $preliminary_start, 'ex_end' => $preliminary_end ]; RecruitTicket::create($ticket); $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit); } } //$this->pdf('pen',$recruit); Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]); break; } break; case 'face': if(!$recruit->face_ticket_content){ return; } if(empty($recruit->interview_start)){ $interview_start = $this->data['ex_start']; $interview_end = $this->data['ex_end']; }else{ $interview_start = $recruit->interview_start; $interview_end = $recruit->interview_end; } switch ($this->data['type']){ case '0'://不需要额外数据 $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('face_audit',-1)->where(function($query){ $query->where('pen_audit',1) ->orWhere('pen_audit',3); })->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray(); $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id'); if($list){ foreach ($list as $k => $v){ $item = [ 'appoint_id' => $v['id'], 'ex_type' => 3, 'realname' => $v['realname'], 'ex_title' => '', 'card' => $v['card'], 'ex_time' => '', 'ex_address' => '', 'post' => $post_data[$v['post_id']], ]; $ticket = [ 'appoint_id' => $v['id'], 'ex_type' => 3, 'ex_status' => 0, 'ex_start' => $interview_start, 'ex_end' => $interview_end ]; RecruitTicket::create($ticket); $this->fetch($item,$recruit->face_ticket_content, 'face', $recruit); } } break; case '2': $ticket_data_list = $this->data['list']; $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id) ->where('audit',3) ->where('face_audit',-1) ->where(function($query){ $query->where('recruit_appoint_info.pen_audit',1) ->orWhere('recruit_appoint_info.pen_audit',3); }) ->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray(); $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id'); foreach ($list as $k => $v){ if(!array_key_exists($v['card'],$ticket_data_list)){ echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n"; continue; } $item = [ 'realname' => $v['realname'], 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '', 'card' => $v['card'], 'post' => $post_data[$v['post_id']], 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '', 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '', 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '', 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '', 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '', 'ex_ready_time' => array_key_exists('ex_ready_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_ready_time'] : '', 'extra1' => array_key_exists('extra1',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra1'] : '', 'extra2' => array_key_exists('extra2',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra2'] : '', 'extra3' => array_key_exists('extra3',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra3'] : '', 'avatar' => $v['avatar'] ]; $ticket = [ 'appoint_id' => $v['id'], 'ex_type' => 3, 'ex_number' => $item['ex_number'], 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '', 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '', 'ex_seat' => $item['ex_seat'], 'ex_room' => $item['ex_room'], 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '', 'ex_status' => 0, 'ex_start' => $interview_start, 'ex_end' => $interview_end ]; RecruitTicket::create($ticket); $this->fetch($item,$recruit->face_ticket_content, 'face', $recruit); } //$this->pdf('pen',$recruit); Recruit::where('id',$this->recruit_id)->update(['face_ticket_status' => 2]); break; } break; case 'reexamine': if(!$recruit->reexamine_ticket_content){ return; } if(empty($recruit->reexamine_start)){ $reexamine_start = $this->data['ex_start']; $reexamine_end = $this->data['ex_end']; }else{ $reexamine_start = $recruit->reexamine_start; $reexamine_end = $recruit->reexamine_end; } switch ($this->data['type']){ case '0'://不需要额外数据 $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('reexamine_audit',-1)->where(function($query){ $query->where('face_audit',1) ->orWhere('face_audit',3); })->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray(); $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id'); if($list){ foreach ($list as $k => $v){ $item = [ 'appoint_id' => $v['id'], 'ex_type' => 3, 'realname' => $v['realname'], 'ex_title' => '', 'card' => $v['card'], 'ex_time' => '', 'ex_address' => '', 'post' => $post_data[$v['post_id']], ]; $ticket = [ 'appoint_id' => $v['id'], 'ex_type' => 3, 'ex_status' => 0, 'ex_start' => $reexamine_start, 'ex_end' => $reexamine_end ]; RecruitTicket::create($ticket); $this->fetch($item,$recruit->reexamine_ticket_content, 'reexamine_audit', $recruit); } } break; case '2': $ticket_data_list = $this->data['list']; $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id) ->where('audit',3) ->where('reexamine_audit',-1) ->where(function($query){ $query->where('recruit_appoint_info.face_audit',1) ->orWhere('recruit_appoint_info.face_audit',3); }) ->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray(); $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id'); foreach ($list as $k => $v){ if(!array_key_exists($v['card'],$ticket_data_list)){ echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n"; continue; } $item = [ 'realname' => $v['realname'], 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '', 'card' => $v['card'], 'post' => $post_data[$v['post_id']], 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '', 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '', 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '', 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '', 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '', 'ex_ready_time' => array_key_exists('ex_ready_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_ready_time'] : '', 'extra1' => array_key_exists('extra1',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra1'] : '', 'extra2' => array_key_exists('extra2',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra2'] : '', 'extra3' => array_key_exists('extra3',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra3'] : '', 'avatar' => $v['avatar'] ]; $ticket = [ 'appoint_id' => $v['id'], 'ex_type' => 3, 'ex_number' => $item['ex_number'], 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '', 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '', 'ex_seat' => $item['ex_seat'], 'ex_room' => $item['ex_room'], 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '', 'ex_status' => 0, 'ex_start' => $reexamine_start, 'ex_end' => $reexamine_end ]; RecruitTicket::create($ticket); $this->fetch($item,$recruit->reexamine_ticket_content, 'reexamine', $recruit); } //$this->pdf('pen',$recruit); Recruit::where('id',$this->recruit_id)->update(['reexamine_ticket_status' => 2]); break; } break; case 'pen_result': $list = $this->data; foreach ($list as $k => $v){ if(!array_key_exists('id',$v) || intval($v['id']) <= 0){ continue; } $appoint_info = RecruitAppointInfo::where('recruit_appoint_info.id',$v['id'])->where('recruit_appoint_info.recruit_id',$this->recruit_id)->join('recruit_ticket', 'recruit_appoint_info.id', '=', 'recruit_ticket.appoint_id')->select('recruit_appoint_info.*','recruit_ticket.ex_number')->first(); if(!$appoint_info){ continue; } if($appoint_info->realname != $v['realname'] || $appoint_info->card != $v['card'] || $appoint_info->ex_number != $v['ex_number']){ //数据污染,路过处理 continue; } if($v['next'] == '是'){ $update['pen_audit'] = 1; $status = -1; }else{ $update['pen_audit'] = 0; $status = 3; } if(!is_numeric($v['record']) && empty($v['record'])){ $update['pen_audit'] = 2; $status = 3; } if(in_array(4,explode(',',$recruit->step))){ $update['computer_audit'] = $status; }else{ $update['face_audit'] = $status; } RecruitAppointInfo::where('id',$v['id'])->update($update); } break; } } protected function fetch($data, $template, $type, $recruit = null){ $templateProcessor = new TemplateProcessor(base_path() . $template); foreach ($data as $k => $v){ if($k == 'avatar'){ if(file_exists(base_path() . '/public/' . $v)){ $templateProcessor->setImageValue('avatar',['path' => base_path() . '/public/' . $v, 'width' => 200, 'height' => 150]); }else{ $templateProcessor->setImageValue('avatar',['path' => 'https://www.jucai.gov.cn/' . $v, 'width' => 200, 'height' => 150]); } }else{ $templateProcessor->setValue($k, $v); } } if($recruit){ $name = $recruit->name_en; $date = date("Y-m-d",strtotime($recruit->created_at)); }else{ $name = uniqid(); $date = date("Y-m-d",time()); } if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}")){ Storage::makeDirectory("public/recruit/ticket/word/{$date}/{$name}/{$type}"); } // if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){ // Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}"); // } $filename = sha1($date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post']); $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx'; $templateProcessor->saveAs($word_url);//另存为 // $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}"; // shell_exec('export DISPLAY=:0.0'); // shell_exec('libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url); } protected function word_exist($recruit,$type,$data) { if($recruit){ $name = $recruit->name_en; $date = date("Y-m-d",strtotime($recruit->created_at)); }else{ $name = uniqid(); $date = date("Y-m-d",time()); } $filename = $date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post']; if(file_exists(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx')){ echo $filename . "跳过\r\n"; return true; }else{ echo $filename . "生成\r\n"; return false; } } protected function pdf($type, $recruit = null){ if($recruit){ $name = $recruit->name_en; $date = date("Y-m-d",strtotime($recruit->created_at)); }else{ $name = uniqid(); $date = date("Y-m-d",time()); } if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){ Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}"); } $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/*.docx"; $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}"; shell_exec('export DISPLAY=:0.0 && export HOME=/data/wwwroot &&libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url); } }