TicketJob.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  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. if($this->data['multiple']){
  56. //队列多任务
  57. foreach ($list as $room => $room_list){
  58. foreach ($room_list as $k => $v){
  59. $seat = ($k%30) + 1;
  60. $item = [
  61. 'realname' => $v['realname'],
  62. 'ex_number' => $this->data['number_prefix'] . 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. }else{
  84. $room = $this->data['room'];
  85. foreach ($list as $k => $v){
  86. $seat = ($k%30) + 1;
  87. $item = [
  88. 'realname' => $v['realname'],
  89. 'ex_number' => $this->data['number_prefix'] . sprintf("%02d",($room+1)) . sprintf("%02d",$seat),
  90. 'card' => $v['card'],
  91. 'post' => $post_data[$v['post_id']],
  92. 'ex_room' => sprintf("%02d",($room+1)),
  93. 'ex_seat' => sprintf("%02d",$seat),
  94. 'avatar' => $v['avatar']
  95. ];
  96. $ticket = [
  97. 'appoint_id' => $v['id'],
  98. 'ex_type' => 1,
  99. 'ex_number' => $item['ex_number'],
  100. 'ex_seat' => $item['ex_seat'],
  101. 'ex_room' => $item['ex_room'],
  102. 'ex_status' => 0,
  103. 'ex_start' => $this->data['ex_start'],
  104. 'ex_end' => $this->data['ex_end']
  105. ];
  106. RecruitTicket::create($ticket);
  107. $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit);
  108. }
  109. }
  110. //$this->pdf('pen',$recruit);
  111. //Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]);
  112. break;
  113. case '2':
  114. $ticket_data_list = $this->data['list'];
  115. $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();
  116. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id')->toArray();
  117. if(!array_key_exists('ex_start',$this->data) || !array_key_exists('ex_end',$this->data) || empty($this->data['ex_start']) || empty($this->data['ex_end'])){
  118. $preliminary_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time()))));
  119. $preliminary_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time()))));
  120. }else{
  121. $preliminary_start = $this->data['ex_start'];
  122. $preliminary_end = $this->data['ex_end'];
  123. }
  124. foreach ($list as $k => $v){
  125. if(!array_key_exists($v['post_id'],$post_data)){
  126. echo "{$v['realname']}_{$v['card']} 取消招聘\r\n";
  127. continue;
  128. }
  129. if(!array_key_exists($v['card'],$ticket_data_list)){
  130. echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n";
  131. continue;
  132. }
  133. if(!$this->word_exist($recruit,'pen', ['realname' => $v['realname'],'card' => $v['card'],'post' => $post_data[$v['post_id']]])){
  134. $item = [
  135. 'realname' => $v['realname'],
  136. 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '',
  137. 'card' => $v['card'],
  138. 'post' => $post_data[$v['post_id']],
  139. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  140. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  141. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  142. 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '',
  143. 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '',
  144. 'ex_place' => array_key_exists('ex_place',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_place'] : '',
  145. 'avatar' => $v['avatar']
  146. ];
  147. $ticket = [
  148. 'appoint_id' => $v['id'],
  149. 'ex_type' => 1,
  150. 'ex_number' => $item['ex_number'],
  151. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  152. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  153. 'ex_seat' => $item['ex_seat'],
  154. 'ex_room' => $item['ex_room'],
  155. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  156. 'ex_place' => array_key_exists('ex_place',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_place'] : '',
  157. 'ex_status' => 0,
  158. 'ex_start' => $preliminary_start,
  159. 'ex_end' => $preliminary_end
  160. ];
  161. RecruitTicket::create($ticket);
  162. $this->fetch($item,$recruit->pen_ticket_content, 'pen', $recruit);
  163. }
  164. }
  165. //$this->pdf('pen',$recruit);
  166. Recruit::where('id',$this->recruit_id)->update(['pen_ticket_status' => 2]);
  167. break;
  168. }
  169. break;
  170. case 'face':
  171. if(!$recruit->face_ticket_content){
  172. return;
  173. }
  174. if(!array_key_exists('ex_start',$this->data) || !array_key_exists('ex_end',$this->data) || empty($this->data['ex_start']) || empty($this->data['ex_end'])){
  175. $interview_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time()))));
  176. $interview_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time()))));
  177. }else{
  178. $interview_start = $this->data['ex_start'];
  179. $interview_end = $this->data['ex_end'];
  180. }
  181. switch ($this->data['type']){
  182. case '0'://不需要额外数据
  183. $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('face_audit',-1)->where(function($query){
  184. $query->where('pen_audit',1)
  185. ->orWhere('pen_audit',3);
  186. })->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
  187. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  188. if($list){
  189. foreach ($list as $k => $v){
  190. $item = [
  191. 'appoint_id' => $v['id'],
  192. 'ex_type' => 3,
  193. 'realname' => $v['realname'],
  194. 'ex_title' => '',
  195. 'card' => $v['card'],
  196. 'ex_time' => '',
  197. 'ex_address' => '',
  198. 'post' => $post_data[$v['post_id']],
  199. ];
  200. $ticket = [
  201. 'appoint_id' => $v['id'],
  202. 'ex_type' => 3,
  203. 'ex_status' => 0,
  204. 'ex_start' => $interview_start,
  205. 'ex_end' => $interview_end
  206. ];
  207. RecruitTicket::create($ticket);
  208. $this->fetch($item,$recruit->face_ticket_content, 'face', $recruit);
  209. }
  210. }
  211. break;
  212. case '2':
  213. $ticket_data_list = $this->data['list'];
  214. $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)
  215. ->where('audit',3)
  216. ->where('face_audit',-1)
  217. ->where(function($query){
  218. $query->where('recruit_appoint_info.pen_audit',1)
  219. ->orWhere('recruit_appoint_info.pen_audit',3);
  220. })
  221. ->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
  222. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  223. foreach ($list as $k => $v){
  224. if(!array_key_exists($v['card'],$ticket_data_list)){
  225. echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n";
  226. continue;
  227. }
  228. $item = [
  229. 'realname' => $v['realname'],
  230. 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '',
  231. 'card' => $v['card'],
  232. 'post' => $post_data[$v['post_id']],
  233. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  234. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  235. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  236. 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '',
  237. 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '',
  238. 'ex_ready_time' => array_key_exists('ex_ready_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_ready_time'] : '',
  239. 'extra1' => array_key_exists('extra1',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra1'] : '',
  240. 'extra2' => array_key_exists('extra2',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra2'] : '',
  241. 'extra3' => array_key_exists('extra3',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra3'] : '',
  242. 'avatar' => $v['avatar']
  243. ];
  244. $ticket = [
  245. 'appoint_id' => $v['id'],
  246. 'ex_type' => 3,
  247. 'ex_number' => $item['ex_number'],
  248. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  249. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  250. 'ex_seat' => $item['ex_seat'],
  251. 'ex_room' => $item['ex_room'],
  252. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  253. 'ex_status' => 0,
  254. 'ex_start' => $interview_start,
  255. 'ex_end' => $interview_end
  256. ];
  257. RecruitTicket::create($ticket);
  258. $this->fetch($item,$recruit->face_ticket_content, 'face', $recruit);
  259. }
  260. //$this->pdf('pen',$recruit);
  261. Recruit::where('id',$this->recruit_id)->update(['face_ticket_status' => 2]);
  262. break;
  263. }
  264. break;
  265. case 'reexamine':
  266. if(!$recruit->reexamine_ticket_content){
  267. return;
  268. }
  269. if(empty($recruit->reexamine_start)){
  270. $reexamine_start = $this->data['ex_start'];
  271. $reexamine_end = $this->data['ex_end'];
  272. }else{
  273. $reexamine_start = $recruit->reexamine_start;
  274. $reexamine_end = $recruit->reexamine_end;
  275. }
  276. switch ($this->data['type']){
  277. case '0'://不需要额外数据
  278. $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('reexamine_audit',-1)->where(function($query){
  279. $query->where('face_audit',1)
  280. ->orWhere('face_audit',3);
  281. })->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
  282. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  283. if($list){
  284. foreach ($list as $k => $v){
  285. $item = [
  286. 'appoint_id' => $v['id'],
  287. 'ex_type' => 4,
  288. 'realname' => $v['realname'],
  289. 'ex_title' => '',
  290. 'card' => $v['card'],
  291. 'ex_time' => '',
  292. 'ex_address' => '',
  293. 'post' => $post_data[$v['post_id']],
  294. ];
  295. $ticket = [
  296. 'appoint_id' => $v['id'],
  297. 'ex_type' => 4,
  298. 'ex_status' => 0,
  299. 'ex_start' => $reexamine_start,
  300. 'ex_end' => $reexamine_end
  301. ];
  302. RecruitTicket::create($ticket);
  303. $this->fetch($item,$recruit->reexamine_ticket_content, 'reexamine_audit', $recruit);
  304. }
  305. }
  306. break;
  307. case '2':
  308. $ticket_data_list = $this->data['list'];
  309. $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)
  310. ->where('audit',3)
  311. ->where('reexamine_audit',-1)
  312. ->where(function($query){
  313. $query->where('recruit_appoint_info.face_audit',1)
  314. ->orWhere('recruit_appoint_info.face_audit',3);
  315. })
  316. ->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
  317. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  318. foreach ($list as $k => $v){
  319. if(!array_key_exists($v['card'],$ticket_data_list)){
  320. echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n";
  321. continue;
  322. }
  323. $item = [
  324. 'realname' => $v['realname'],
  325. 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '',
  326. 'card' => $v['card'],
  327. 'post' => $post_data[$v['post_id']],
  328. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  329. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  330. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  331. 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '',
  332. 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '',
  333. 'ex_ready_time' => array_key_exists('ex_ready_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_ready_time'] : '',
  334. 'extra1' => array_key_exists('extra1',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra1'] : '',
  335. 'extra2' => array_key_exists('extra2',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra2'] : '',
  336. 'extra3' => array_key_exists('extra3',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra3'] : '',
  337. 'avatar' => $v['avatar']
  338. ];
  339. $ticket = [
  340. 'appoint_id' => $v['id'],
  341. 'ex_type' => 4,
  342. 'ex_number' => $item['ex_number'],
  343. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  344. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  345. 'ex_seat' => $item['ex_seat'],
  346. 'ex_room' => $item['ex_room'],
  347. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  348. 'ex_status' => 0,
  349. 'ex_start' => $reexamine_start,
  350. 'ex_end' => $reexamine_end
  351. ];
  352. RecruitTicket::create($ticket);
  353. $this->fetch($item,$recruit->reexamine_ticket_content, 'reexamine', $recruit);
  354. }
  355. //$this->pdf('pen',$recruit);
  356. Recruit::where('id',$this->recruit_id)->update(['reexamine_ticket_status' => 2]);
  357. break;
  358. }
  359. break;
  360. case 'pen_result':
  361. $list = $this->data;
  362. foreach ($list as $k => $v){
  363. if(!array_key_exists('id',$v) || intval($v['id']) <= 0){
  364. continue;
  365. }
  366. $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();
  367. if(!$appoint_info){
  368. continue;
  369. }
  370. if($appoint_info->realname != $v['realname'] || $appoint_info->card != $v['card'] || $appoint_info->ex_number != $v['ex_number']){
  371. //数据污染,路过处理
  372. continue;
  373. }
  374. if($v['next'] == '是'){
  375. $update['pen_audit'] = 1;
  376. $status = -1;
  377. }else{
  378. $update['pen_audit'] = 0;
  379. $status = 3;
  380. }
  381. if(!is_numeric($v['record']) && empty($v['record'])){
  382. $update['pen_audit'] = 2;
  383. $status = 3;
  384. }
  385. if(in_array(4,explode(',',$recruit->step))){
  386. $update['computer_audit'] = $status;
  387. }else{
  388. $update['face_audit'] = $status;
  389. }
  390. RecruitAppointInfo::where('id',$v['id'])->update($update);
  391. }
  392. break;
  393. case 'computer':
  394. if(!$recruit->computer_ticket_content){
  395. return;
  396. }
  397. if(!array_key_exists('ex_start',$this->data) || !array_key_exists('ex_end',$this->data) || empty($this->data['ex_start']) || empty($this->data['ex_end'])){
  398. $computer_start = date("Y-m-d H:i:s",strtotime("+1 days",strtotime(date("Y-m-d",time()))));
  399. $computer_end = date("Y-m-d H:i:s",strtotime("+5 days",strtotime(date("Y-m-d",time()))));
  400. }else{
  401. $computer_start = $this->data['ex_start'];
  402. $computer_end = $this->data['ex_end'];
  403. }
  404. switch ($this->data['type']){
  405. case '0'://不需要额外数据
  406. $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)->where('audit',3)->where('computer_ticket_status',-1)->where(function($query){
  407. $query->where('pen_audit',1)
  408. ->orWhere('pen_audit',3);
  409. })->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
  410. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  411. if($list){
  412. foreach ($list as $k => $v){
  413. $item = [
  414. 'appoint_id' => $v['id'],
  415. 'ex_type' => 2,
  416. 'realname' => $v['realname'],
  417. 'ex_title' => '',
  418. 'card' => $v['card'],
  419. 'ex_time' => '',
  420. 'ex_address' => '',
  421. 'post' => $post_data[$v['post_id']],
  422. ];
  423. $ticket = [
  424. 'appoint_id' => $v['id'],
  425. 'ex_type' => 3,
  426. 'ex_status' => 0,
  427. 'ex_start' => $computer_start,
  428. 'ex_end' => $computer_end
  429. ];
  430. RecruitTicket::create($ticket);
  431. $this->fetch($item,$recruit->computer_ticket_content, 'computer', $recruit);
  432. }
  433. }
  434. break;
  435. case '2':
  436. $ticket_data_list = $this->data['list'];
  437. $list = RecruitAppointInfo::where('recruit_id',$this->recruit_id)
  438. ->where('audit',3)
  439. ->where('computer_audit',-1)
  440. ->where(function($query){
  441. $query->where('recruit_appoint_info.pen_audit',1)
  442. ->orWhere('recruit_appoint_info.pen_audit',3);
  443. })
  444. ->orderBy('post_id','asc')->orderBy('created_at','asc')->get()->toArray();
  445. $post_data = RecruitPost::where('recruit_id',$this->recruit_id)->where('status',1)->selectRaw('id, CONCAT(code," ",name) as post')->pluck('post', 'id');
  446. foreach ($list as $k => $v){
  447. if(!array_key_exists($v['card'],$ticket_data_list)){
  448. echo "{$v['realname']}_{$v['card']}_{$post_data[$v['post_id']]} 不在准考名单内\r\n";
  449. continue;
  450. }
  451. $item = [
  452. 'realname' => $v['realname'],
  453. 'ex_number' => array_key_exists('ex_number',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_number'] : '',
  454. 'card' => $v['card'],
  455. 'post' => $post_data[$v['post_id']],
  456. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  457. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  458. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  459. 'ex_room' => array_key_exists('ex_room',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_room'] : '',
  460. 'ex_seat' => array_key_exists('ex_seat',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_seat'] : '',
  461. 'ex_ready_time' => array_key_exists('ex_ready_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_ready_time'] : '',
  462. 'extra1' => array_key_exists('extra1',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra1'] : '',
  463. 'extra2' => array_key_exists('extra2',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra2'] : '',
  464. 'extra3' => array_key_exists('extra3',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['extra3'] : '',
  465. 'avatar' => $v['avatar']
  466. ];
  467. $ticket = [
  468. 'appoint_id' => $v['id'],
  469. 'ex_type' => 2,
  470. 'ex_number' => $item['ex_number'],
  471. 'ex_address' => array_key_exists('ex_address',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_address'] : '',
  472. 'ex_time' => array_key_exists('ex_time',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_time'] : '',
  473. 'ex_seat' => $item['ex_seat'],
  474. 'ex_room' => $item['ex_room'],
  475. 'ex_subject' => array_key_exists('ex_subject',$ticket_data_list[$v['card']]) ? $ticket_data_list[$v['card']]['ex_subject'] : '',
  476. 'ex_status' => 0,
  477. 'ex_start' => $computer_start,
  478. 'ex_end' => $computer_end
  479. ];
  480. RecruitTicket::create($ticket);
  481. $this->fetch($item,$recruit->computer_ticket_content, 'computer', $recruit);
  482. }
  483. //$this->pdf('pen',$recruit);
  484. Recruit::where('id',$this->recruit_id)->update(['computer_ticket_status' => 2]);
  485. break;
  486. }
  487. break;
  488. }
  489. }
  490. protected function fetch($data, $template, $type, $recruit = null){
  491. $templateProcessor = new TemplateProcessor(base_path() . $template);
  492. foreach ($data as $k => $v){
  493. if($k == 'avatar'){
  494. if(file_exists(base_path() . '/public/' . $v)){
  495. $templateProcessor->setImageValue('avatar',['path' => base_path() . '/public/' . $v, 'width' => 200, 'height' => 150]);
  496. }else{
  497. $templateProcessor->setImageValue('avatar',['path' => 'https://www.jucai.gov.cn/' . $v, 'width' => 200, 'height' => 150]);
  498. }
  499. }else{
  500. $templateProcessor->setValue($k, $v);
  501. }
  502. }
  503. if($recruit){
  504. $name = $recruit->name_en;
  505. $date = date("Y-m-d",strtotime($recruit->created_at));
  506. }else{
  507. $name = uniqid();
  508. $date = date("Y-m-d",time());
  509. }
  510. if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}")){
  511. Storage::makeDirectory("public/recruit/ticket/word/{$date}/{$name}/{$type}");
  512. }
  513. // if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){
  514. // Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}");
  515. // }
  516. $filename = sha1($date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post']);
  517. $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx';
  518. $templateProcessor->saveAs($word_url);//另存为
  519. // $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}";
  520. // shell_exec('export DISPLAY=:0.0');
  521. // shell_exec('libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url);
  522. }
  523. protected function word_exist($recruit,$type,$data)
  524. {
  525. if($recruit){
  526. $name = $recruit->name_en;
  527. $date = date("Y-m-d",strtotime($recruit->created_at));
  528. }else{
  529. $name = uniqid();
  530. $date = date("Y-m-d",time());
  531. }
  532. $filename = $date . '_' . $data['realname'] . '_' . $data['card'] . '_' . $data['post'];
  533. if(file_exists(base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/" . $filename . '.docx')){
  534. echo $filename . "跳过\r\n";
  535. return true;
  536. }else{
  537. echo $filename . "生成\r\n";
  538. return false;
  539. }
  540. }
  541. protected function pdf($type, $recruit = null){
  542. if($recruit){
  543. $name = $recruit->name_en;
  544. $date = date("Y-m-d",strtotime($recruit->created_at));
  545. }else{
  546. $name = uniqid();
  547. $date = date("Y-m-d",time());
  548. }
  549. if(!is_dir(base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}" )){
  550. Storage::makeDirectory("public/recruit/ticket/pdf/{$date}/{$name}/{$type}");
  551. }
  552. $word_url = base_path() . "/storage/app/public/recruit/ticket/word/{$date}/{$name}/{$type}/*.docx";
  553. $pdf_url = base_path() . "/storage/app/public/recruit/ticket/pdf/{$date}/{$name}/{$type}";
  554. shell_exec('export DISPLAY=:0.0 && export HOME=/data/wwwroot &&libreoffice --headless --convert-to pdf:writer_pdf_Export ' . $word_url . ' --outdir ' . $pdf_url);
  555. }
  556. }