TicketJob.php 16 KB

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