TicketJob.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\RecruitAppointInfo;
  4. use App\Models\RecruitPost;
  5. use Illuminate\Bus\Queueable;
  6. use Illuminate\Queue\SerializesModels;
  7. use Illuminate\Queue\InteractsWithQueue;
  8. use Illuminate\Contracts\Queue\ShouldQueue;
  9. use Illuminate\Foundation\Bus\Dispatchable;
  10. use App\Models\Recruit;
  11. use App\Models\RecruitTicket;
  12. use PhpOffice\PhpWord\TemplateProcessor;
  13. use Illuminate\Support\Facades\Storage;
  14. class TicketJob implements ShouldQueue
  15. {
  16. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  17. private $recruit_id;
  18. private $type;
  19. private $data;
  20. public $timeout = 180;
  21. /**
  22. * Create a new job instance.
  23. *
  24. * @return void
  25. */
  26. public function __construct($recruit_id, $type, $data)
  27. {
  28. $this->recruit_id = $recruit_id;
  29. $this->type = $type;
  30. $this->data = $data;
  31. }
  32. /**
  33. * Execute the job.
  34. *
  35. * @return void
  36. */
  37. public function handle()
  38. {
  39. $recruit = Recruit::where('id',$this->recruit_id)->first();
  40. if(!$recruit->status){
  41. return ;
  42. }
  43. switch ($this->type){
  44. case 'pen':
  45. if(!$recruit->pen_ticket_content){
  46. return;
  47. }
  48. switch ($this->data['type']){
  49. case '1':
  50. //自动生成
  51. //$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();
  52. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  53. $list = $this->data['list'];//array_chunk($list,$this->data['auto_each_number'],true);
  54. foreach ($list as $room => $room_list){
  55. if(is_array($room_list)){
  56. foreach ($room_list as $k => $v){
  57. $seat = $k + 1;
  58. $item = [
  59. 'realname' => $v['realname'],
  60. 'ex_number' => date("Y",time()) . '0101101' . sprintf("%02d",($room+1)) . sprintf("%02d",$seat),
  61. 'card' => $v['card'],
  62. 'post' => $post_data[$v['post_id']],
  63. 'ex_room' => sprintf("%02d",($room+1)),
  64. 'ex_seat' => sprintf("%02d",$seat),
  65. 'avatar' => $v['avatar']
  66. ];
  67. $ticket = [
  68. 'appoint_id' => $v['id'],
  69. 'ex_type' => 1,
  70. 'ex_number' => $item['ex_number'],
  71. 'ex_seat' => $item['ex_seat'],
  72. 'ex_room' => $item['ex_room'],
  73. 'ex_status' => 0,
  74. 'ex_start' => $this->data['ex_start'],
  75. 'ex_end' => $this->data['ex_end']
  76. ];
  77. RecruitTicket::create($ticket);
  78. $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit);
  79. }
  80. }
  81. }
  82. //$this->pdf('pen',$recruit);
  83. //Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]);
  84. break;
  85. case '2':
  86. $ticket_data_list = $this->data['list'];
  87. $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();
  88. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  89. if(empty($recruit->preliminary_start)){
  90. $preliminary_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time()))));
  91. $preliminary_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time()))));
  92. }else{
  93. $preliminary_start = date("Y-m-d H:i:s",strtotime("-5 days",strtotime($recruit->preliminary_start)));
  94. $preliminary_end = date("Y-m-d H:i:s",strtotime("+1 days",strtotime($recruit->preliminary_start)));
  95. }
  96. foreach ($list as $k => $v){
  97. if(!array_key_exists($v['card'],$ticket_data_list)){
  98. echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n";
  99. continue;
  100. }
  101. if(!$this->word_exist($recruit,'pen', ['realname' => $v['realname'],'card' => $v['card'],'post' => $post_data[$v['post_id']]])){
  102. $item = [
  103. 'realname' => $v['realname'],
  104. 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '',
  105. 'card' => $v['card'],
  106. 'post' => $post_data[$v['post_id']],
  107. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  108. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  109. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  110. 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '',
  111. 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '',
  112. 'avatar' => $v['avatar']
  113. ];
  114. $ticket = [
  115. 'appoint_id' => $v['id'],
  116. 'ex_type' => 1,
  117. 'ex_number' => $item['ex_number'],
  118. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  119. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  120. 'ex_seat' => $item['ex_seat'],
  121. 'ex_room' => $item['ex_room'],
  122. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  123. 'ex_status' => 0,
  124. 'ex_start' => $preliminary_start,
  125. 'ex_end' => $preliminary_end
  126. ];
  127. RecruitTicket::create($ticket);
  128. $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit);
  129. }
  130. }
  131. //$this->pdf('pen',$recruit);
  132. Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]);
  133. break;
  134. }
  135. break;
  136. case 'face':
  137. if(!$recruit->face_ticket_content){
  138. return;
  139. }
  140. if(empty($recruit->interview_start)){
  141. $interview_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time()))));
  142. $interview_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time()))));
  143. }else{
  144. $interview_start = date("Y-m-d H:i:s",strtotime("-5 days",strtotime($recruit->interview_start)));
  145. $interview_end = date("Y-m-d H:i:s",strtotime("+1 days",strtotime($recruit->interview_end)));
  146. }
  147. switch ($this->data['type']){
  148. case '0'://不需要额外数据
  149. $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('face_audit',-1)->where(function($query){
  150. $query->where('pen_audit',1)
  151. ->orWhere('pen_audit',3);
  152. })->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
  153. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  154. if($list){
  155. foreach ($list as $k => $v){
  156. $item = [
  157. 'appoint_id' => $v['id'],
  158. 'ex_type' => 3,
  159. 'realname' => $v['realname'],
  160. 'ex_title' => '',
  161. 'card' => $v['card'],
  162. 'ex_time' => '',
  163. 'ex_address' => '',
  164. 'post' => $post_data[$v['post_id']],
  165. ];
  166. $ticket = [
  167. 'appoint_id' => $v['id'],
  168. 'ex_type' => 3,
  169. 'ex_status' => 1,
  170. 'ex_start' => $interview_start,
  171. 'ex_end' => $interview_end
  172. ];
  173. RecruitTicket::create($ticket);
  174. $this->fetch($item,$recruit->face_ticket_content, 'face', $recruit);
  175. }
  176. }
  177. break;
  178. }
  179. break;
  180. case 'pen_result':
  181. $list = $this->data;
  182. foreach ($list as $k => $v){
  183. if(!array_key_exists('id',$v) || intval($v['id']) <= 0){
  184. continue;
  185. }
  186. $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();
  187. if(!$appoint_info){
  188. continue;
  189. }
  190. if($appoint_info->realname != $v['realname'] || $appoint_info->card != $v['card'] || $appoint_info->ex_number != $v['ex_number']){
  191. //数据污染,路过处理
  192. continue;
  193. }
  194. if($v['next'] == '是'){
  195. $update['pen_audit'] = 1;
  196. $status = -1;
  197. }else{
  198. $update['pen_audit'] = 0;
  199. $status = 3;
  200. }
  201. if(!is_numeric($v['record']) && empty($v['record'])){
  202. $update['pen_audit'] = 2;
  203. $status = 3;
  204. }
  205. if(in_array(4,explode(',',$recruit->step))){
  206. $update['computer_audit'] = $status;
  207. }else{
  208. $update['face_audit'] = $status;
  209. }
  210. RecruitAppointInfo::where('id',$v['id'])->update($update);
  211. }
  212. break;
  213. }
  214. }
  215. protected function fetch($data, $template, $type, $recruit = null){
  216. $templateProcessor = new TemplateProcessor(base_path() . $template);
  217. foreach ($data as $k => $v){
  218. if($k == 'avatar'){
  219. $templateProcessor->setImageValue('avatar',['path' => 'http://www.jucai.gov.cn/'.$v, 'width' => 200, 'height' => 150]);
  220. }else{
  221. $templateProcessor->setValue($k, $v);
  222. }
  223. }
  224. if($recruit){
  225. $name = $recruit->name_en;
  226. $date = date("Y-m-d",strtotime($recruit->created_at));
  227. }else{
  228. $name = uniqid();
  229. $date = date("Y-m-d",time());
  230. }
  231. if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}")){
  232. Storage::makeDirectory("public/recruit/ticket/word/{$date}/{$name}/{$type}");
  233. }
  234. // if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){
  235. // Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}");
  236. // }
  237. $filename = $date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post'];
  238. $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx';
  239. $templateProcessor->saveAs($word_url);//另存为
  240. // $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}";
  241. // shell_exec('export DISPLAY=:0.0');
  242. // shell_exec('libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url);
  243. }
  244. protected function word_exist($recruit,$type,$data)
  245. {
  246. if($recruit){
  247. $name = $recruit->name_en;
  248. $date = date("Y-m-d",strtotime($recruit->created_at));
  249. }else{
  250. $name = uniqid();
  251. $date = date("Y-m-d",time());
  252. }
  253. $filename = $date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post'];
  254. if(file_exists(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx')){
  255. echo $filename . "跳过\r\n";
  256. return true;
  257. }else{
  258. echo $filename . "生成\r\n";
  259. return false;
  260. }
  261. }
  262. protected function pdf($type, $recruit = null){
  263. if($recruit){
  264. $name = $recruit->name_en;
  265. $date = date("Y-m-d",strtotime($recruit->created_at));
  266. }else{
  267. $name = uniqid();
  268. $date = date("Y-m-d",time());
  269. }
  270. if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){
  271. Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}");
  272. }
  273. $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/*.docx";
  274. $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}";
  275. shell_exec('export DISPLAY=:0.0 && export HOME=/data/wwwroot &&libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url);
  276. }
  277. }