get('/stats-members', function($request, $response){ if(!is_admin_login_simple()){ $temp_key = isset($_GET['temp_key']) ? $_GET['temp_key'] : ''; $now = now('Y-m-d'); if(!$temp_key or _get_stats_temp_key($now)!==$temp_key){ die('The temp_key is expired. For now, if you are website staff, you can login then refresh this page to view this page.'); } } $type = isset($_GET['type']) ? $_GET['type'] : ''; if(!in_array($type, ['RESUME', 'JD'])){ die('invalid type'); } $IS_TYPE_RESUME = $type=='RESUME'; $IS_TYPE_JD = $type=='JD'; $z = isset($_GET['z']) ? $_GET['z'] : ''; $ary_user_id = array(); foreach(explode(',',$z) as$v){ if((int)$v){ $ary_user_id[] = (int)$v; } } $tbl = array('RESUME'=>'{tbody}
投遞履歷時間姓名學號
', 'JD'=>'{tbody}
發佈職缺時間職缺ID職缺標題姓名學號
'); $sql = array('RESUME'=>'SELECT send_time,users.`name`,users.school_no FROM application INNER JOIN users ON users.id=application.apply_user_id WHERE apply_user_id IN ('.implode(',',$ary_user_id).') ORDER BY send_time DESC', 'JD'=>'SELECT date_post,jobs.id, job_title,company,users.name,users.school_no FROM jobs INNER JOIN users ON users.id=jobs.owener_id WHERE owener_id IN ('.implode(',',$ary_user_id).') ORDER BY date_post DESC'); $tbl = $tbl[$type]; $sql = $sql[$type]; $q = $this->get(PDO::class)->query($sql); $tbody = ''; while($row = $q->fetch()){ if($IS_TYPE_JD){ $row['job_title'] = ''.$row['job_title'].''; } $tbody.=''.implode('',$row).''; } echo''; echo str_replace('{tbody}',$tbody,$tbl); return $response; }); $app->get('/stats', function($request, $response){ access_internal_page_validation(); $s = ''; $staff_user_id = '28,30,32,38,163,164,170,171,256,257,258,423,427,431,466,586,590,594,613 , 421,422,450, 574'; $sql_total_member = 'SELECT * FROM `users` WHERE `id` NOT IN ('.$staff_user_id.')'; $q = $this->get(PDO::class)->query($sql_total_member); $total_member_count = $q->rowCount(); $sql_valid_member = $sql_total_member . ' AND `status`=1'; $q = $this->get(PDO::class)->query($sql_valid_member); $valid_member_count = $q->rowCount(); $sql_valid_school_member = $sql_valid_member . ' AND (`school_no`<>"" AND `school_no` IS NOT NULL)'; $q = $this->get(PDO::class)->query($sql_valid_school_member); $valid_school_member_count = $q->rowCount(); $valid_not_school_member_count = $valid_member_count - $valid_school_member_count; $valid_school_member_count_percent = round(100*$valid_school_member_count/$valid_member_count,2); $valid_not_school_member_count_percent = round(100*$valid_not_school_member_count/$valid_member_count,2); $s.='

會員統計:

'; $s.='1. 會員總數: '.$total_member_count.'
2. 有效會員總數 (排除註冊未完成): '.$valid_member_count.' (100%)
3. 學員數: '.$valid_school_member_count.' ('.$valid_school_member_count_percent.'%)
4. 非學員數: '.$valid_not_school_member_count.' ('.$valid_not_school_member_count_percent.'%)
'; $now = now(); $now_timestamp = strtotime($now); $datetime_before_24hours = date("Y-m-d H:i:s", strtotime('-24 hour', $now_timestamp)); $datetime_before_168hours = date("Y-m-d H:i:s", strtotime('-168 hour', $now_timestamp)); $sql = $sql_total_member . ' AND last_login_time>="'.$datetime_before_24hours.'"'; $q = $this->get(PDO::class)->query($sql); $login_count_within_24hours = $q->rowCount(); $sql = $sql_total_member . ' AND last_login_time>="'.$datetime_before_168hours.'"'; $q = $this->get(PDO::class)->query($sql); $login_count_within_168hours = $q->rowCount(); $s.='會員登入人數統計(今日): '.$login_count_within_24hours.'
' .'會員登入人數統計(過去七日): '.$login_count_within_168hours.'
'; $sql_total_job = 'SELECT * FROM `jobs` WHERE `owener_id` NOT IN ('.$staff_user_id.')'; $q = $this->get(PDO::class)->query($sql_total_job); $job_count = $q->rowCount(); $sql_visible_job = $sql_total_job . ' AND `visible`=1'; $q = $this->get(PDO::class)->query($sql_visible_job); $visible_job_count = $q->rowCount(); $sql_wait4verify_job = $sql_total_job . ' AND `verify`=0 AND is_trash=0'; $q = $this->get(PDO::class)->query($sql_wait4verify_job); $wait4verify_job_count = $q->rowCount(); $wait4verify_job_list = ''; while($row = $q->fetch()) { $wait4verify_job_list .= '
  • '.$row['company'] . ' - ' .$row['job_title'].'
  • '; } //201902 by SWC idea $s.='5. members who have submitted resumes / posted JD
    '; $tbl_members_who_have_submitted_resume_posted_jd = '{tbody}
    班別應徵過工作的人次應徵過工作的人數刊登過職缺的人次刊登過職缺的人數
    '; $date_before24hour = date('Y-m-d', strtotime('-24 hour', $now_timestamp)); $date_before168hour = date('Y-m-d', strtotime('-168 hour', $now_timestamp)); $ary_tbl = array( array(), # <-- $START_SEND_TIME_IDX array(), # <-- $START_SEND_TIME_IDX array(), # <-- $START_SEND_TIME_IDX ); $NO_SCHOOL_NUM_KEY = 'ZZZ'; $sqlwhere_invalid_school_class = ' AND (school_no IS NULL OR school_no="" OR (school_no<>"" AND school_no NOT LIKE ("AM070%")))'; foreach(array($date_before24hour, $date_before168hour, '2000-01-01') as $_IDX=>$START_SEND_TIME){ /*SELECT apply_user_id, school_no, SUBSTRING(school_no, 1,5) AS school_class FROM application INNER JOIN ( SELECT * FROM `users` WHERE `id` NOT IN (28,30,32,38,163,164,170,171,256,257,258,423,427,431,466,586,590,594,613 , 421,422,450, 574) ) u ON u.id=application.apply_user_id WHERE send_time>='1900-01-01'*/ $sql = 'SELECT application.id, apply_user_id, school_no, SUBSTRING(school_no, 1,5) AS school_class FROM application INNER JOIN ('.$sql_total_member.') u ON u.id=application.apply_user_id WHERE send_time>="'.$START_SEND_TIME.'"'.$sqlwhere_invalid_school_class; #echo$sql;echo'
    '; $q = $this->get(PDO::class)->query($sql); # submiited resumes while($row = $q->fetch()){ $school_class = $row['school_class']??""; #print_r($row);echo'
    '; $SCHOOL_NUM_KEY = 1===preg_match(SCHOOL_NO_PREFIX_REGEXP, $school_class) ? $school_class : $NO_SCHOOL_NUM_KEY; if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY])){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY] = array(); } if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'])){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'] = array(); } if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_resume'])){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_resume'] = 0; } $user_id = $row['apply_user_id']; if($user_id>0){ // valid user_id if(!in_array($user_id, $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'] )){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_resume']+=1; } $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'][] = $user_id; } #print_r($ary_tbl);echo'
    '; } /* SELECT * FROM jobs INNER JOIN ( SELECT * FROM `users` WHERE `id` NOT IN (28,30,32,38,163,164,170,171,256,257,258,423,427,431,466,586,590,594,613 , 421,422,450, 574) ) u ON u.id=jobs.owener_id WHERE date_post>='1900-01-01' */ $sql = 'SELECT jobs.id, owener_id, school_no, SUBSTRING(school_no, 1,5) AS school_class FROM jobs INNER JOIN ('.$sql_total_member.') u ON u.id=jobs.owener_id WHERE date_post>="'.$START_SEND_TIME.'"'.$sqlwhere_invalid_school_class; #echo$sql;echo'
    '; $q = $this->get(PDO::class)->query($sql); # posted JD while($row = $q->fetch()){ $school_class = $row['school_class']??""; $SCHOOL_NUM_KEY = 1===preg_match(SCHOOL_NO_PREFIX_REGEXP, $school_class) ? $school_class : $NO_SCHOOL_NUM_KEY; if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY])){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY] = array(); } if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'])){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'] = array(); } if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_jd'])){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_jd'] = 0; } $user_id = $row['owener_id']; if($user_id>0){ // valid user_id if(!in_array($user_id, $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'] )){ $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_jd']+=1; } $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'][] = $user_id; } } } // starting sort AND default $tbody foreach($ary_tbl as$idx=>$all_school_class_results){ ksort($ary_tbl[$idx]); } $tbody = array(); $tr_members_who_have_submitted_resume_posted_jd = '{td_first}{count_resume}{ppl_resume}{count_jd}{ppl_jd}'; $ary_tmp = ['{td_first}', '{count_resume}', '{ppl_resume}', '{count_jd}', '{ppl_jd}']; $TEMP_KEY = _get_stats_temp_key(); foreach($ary_tbl as$idx=>$all_school_class_results){ $tbody[$idx] = ''; $total_count_ppl = array('count_resume'=>0, 'ppl_resume'=>0, 'count_jd'=>0, 'ppl_jd'=>0); foreach($all_school_class_results as $_school_class=>$_result){ $count_resume = isset($_result['count_resume']) ? count($_result['count_resume']) : 0; $count_resume_link = $count_resume ? ''.$count_resume.'' : $count_resume; $ppl_resume = isset($_result['ppl_resume']) ? $_result['ppl_resume'] : 0; $count_jd = isset($_result['count_jd']) ? count($_result['count_jd']) : 0; $count_jd_link = $count_jd ? ''.$count_jd.'' : $count_jd; $ppl_jd = isset($_result['ppl_jd']) ? $_result['ppl_jd'] : 0; $td_first = $_school_class===$NO_SCHOOL_NUM_KEY ? '非學員' : $_school_class; $tbody[$idx].=str_replace($ary_tmp, [$td_first, $count_resume_link, $ppl_resume, $count_jd_link, $ppl_jd], $tr_members_who_have_submitted_resume_posted_jd ); $total_count_ppl['count_resume'] += $count_resume; $total_count_ppl['ppl_resume'] += $ppl_resume; $total_count_ppl['count_jd'] += $count_jd; $total_count_ppl['ppl_jd'] += $ppl_jd; } $tbody[$idx] = str_replace( '{tbody}', $tbody[$idx] . str_replace( $ary_tmp, ['合計', $total_count_ppl['count_resume'], $total_count_ppl['ppl_resume'], $total_count_ppl['count_jd'], $total_count_ppl['ppl_jd']], $tr_members_who_have_submitted_resume_posted_jd ), $tbl_members_who_have_submitted_resume_posted_jd); if(!$tbody[$idx]){ $tbody[$idx] = 'No data in this date range...'; } } #echo'
    ';print_r($ary_tbl);exit; #debug
      $s.='[==== 今日以來(過去24小時) ====]'
      .$tbody[0]
      .'[==== 七日內(過去168小時) ====]'
      .$tbody[1]
      .'[==== 上架以來 ====]'
      .$tbody[2]
      ;
    
    
      $s.='

    職缺統計:

    1. 職缺總數: '.$job_count.'
    2. 上架職缺總數: '.$visible_job_count.'
    3. 待審職缺數: '.$wait4verify_job_count.'
    '.($wait4verify_job_list ? '' : ''); $expired_list = ''; /* foreach(array( #30,60, 90 #,120,150, ,180 #,210,240,270,300,330,360 )as$i=>$x){ ${'date_after_'.$x.'days'} = date("Y-m-d", strtotime('+'.$x.' day', $now_timestamp)); $q = $this->get(PDO::class)->query( $sql_visible_job . ' AND `date_expired`<"'.${'date_after_'.$x.'days'}.'"'); ${'expired_job_count_after_'.$x.'days'} = $q->rowCount(); $expired_list.='
  • '.(($i+1)*3).'個月內到期之職缺總數: '.${'expired_job_count_after_'.$x.'days'}.'
  • '; }*/ $date_after_90days = date('Y-m-d', strtotime('+90 day', $now_timestamp)); $date_after_180days = date('Y-m-d', strtotime('+180 day', $now_timestamp)); $q = $this->get(PDO::class)->query($sql_visible_job . ' AND `date_expired`<"'.$date_after_90days.'"'); $expired_job_count_within_90days = $q->rowCount(); $expired_list.='
  • 3個月內到期之職缺總數: '.$expired_job_count_within_90days.'
  • '; $q = $this->get(PDO::class)->query($sql_visible_job . ' AND `date_expired`>="'.$date_after_90days.'" AND `date_expired`<"'.$date_after_180days.'"'); $expired_job_count_between_90day_and_180day = $q->rowCount(); $expired_list.='
  • 3 ~ 6個月內到期之職缺總數: '.$expired_job_count_between_90day_and_180day.'
  • '; $q = $this->get(PDO::class)->query($sql_visible_job . ' AND `date_expired`>="'.$date_after_180days.'"'); $expired_job_count_after_180days = $q->rowCount(); $expired_list.='
  • 超過6個月到期之職缺總數: '.$expired_job_count_after_180days.'
  • '; $s.='4. 職缺到期統計:
    '.($expired_list ? '' : ''); $q = $this->get(PDO::class)->query(str_replace('*','COUNT(`id`) AS c, `company`',$sql_visible_job).' GROUP BY `company` ORDER BY c DESC LIMIT 5'); $top_company_list = ''; while($row = $q->fetch()) { $top_company_list.='
  • '.$row['company'].' ('.$row['c'].')
  • '; } $s .= '5. 職缺數前五名公司(上架中):
    '; # [==== 當日 ====]
    # [==== 七日內 ====]
    $q = $this->get(PDO::class)->query($sql_visible_job . ' ORDER BY browse_count DESC LIMIT 10'); $topview_job_list = ''; while($row = $q->fetch()) { $topview_job_list .= '
  • '.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['browse_count'].'
  • '; } $sql_visible_job_innerjoin_jobbrowse = str_replace('`jobs`', '`jobs` INNER JOIN `job_browse` ON job_browse.job_id=jobs.id ', $sql_visible_job); foreach(array(168, 24)as$hour){ ${'date_before_'.$hour.'hour'} = date('Y-m-d', strtotime('-'.$hour.' hour', $now_timestamp)); } foreach(array(168,24)as$hour){ $sql = str_replace('SELECT * ', 'SELECT COUNT(job_id) browse_count,job_id,company,job_title ', $sql_visible_job_innerjoin_jobbrowse) .' AND `datetime`>="'.${'date_before_'.$hour.'hour'}.'" GROUP BY job_id ORDER BY browse_count DESC LIMIT 10'; $q = $this->get(PDO::class)->query($sql); ${'topview_job_list_in_'.$hour.'hr'} = ''; while($row = $q->fetch()) { ${'topview_job_list_in_'.$hour.'hr'} .= '
  • '.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['browse_count'].'
  • '; } } # $q = $this->get(PDO::class)->query($sql_visible_job . ' ORDER BY submit_count DESC LIMIT 5'); $topapply_job_list = ''; while($row = $q->fetch()) { $topapply_job_list .= '
  • '.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['submit_count'].'
  • '; } $sql_visible_job_innerjoin_application = str_replace('`jobs`', '`jobs` INNER JOIN `application` ON application.job_id=jobs.id ', $sql_visible_job); foreach(array(168,24)as$hour){ $sql = str_replace('SELECT * ', 'SELECT COUNT(job_id) submit_count,job_id,company,job_title ', $sql_visible_job_innerjoin_application) .' AND `send_time`>="'.${'date_before_'.$hour.'hour'}.'" GROUP BY job_id ORDER BY submit_count DESC LIMIT 5'; $q = $this->get(PDO::class)->query($sql); ${'topapply_job_list_in_'.$hour.'hr'} = ''; while($row = $q->fetch()) { ${'topapply_job_list_in_'.$hour.'hr'} .= '
  • '.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['submit_count'].'
  • '; } } $s.='6. 上架中(不含已過期或下架中)的職缺瀏覽人數前十名
    (公司名稱) (職缺名稱) (瀏覽人數)
    [==== 今日以來(過去24小時) ====]
    '.($topview_job_list_in_24hr ? '' : ''). '[==== 七日內(過去168小時) ====]
    '.($topview_job_list_in_168hr ? '' : ''). '[==== 上架以來 ====]
    '.($topview_job_list ? '' : ''). '7. 上架中(不含已過期或下架中)的職缺履歷投送前五名
    (公司名稱) (職缺名稱) (瀏覽人數)
    [==== 今日以來(過去24小時) ====]
    '.($topapply_job_list_in_24hr ? '' : ''). '[==== 七日內(過去168小時) ====]
    '.($topapply_job_list_in_168hr ? '' : ''). '[==== 上架以來 ====]
    '.($topapply_job_list ? '' : ''); // sending email if(isset($_GET['debug_stats']) and IS_DEVELOPER){ echo$s; die('debugging...'); }else{ $ary_emails = IS_DEV ? array('wei@sted.tw') : array( 'richie.tsai@sted.tw', 'ben.wang@sted.tw', ); $subj = '[JOBS.AIA] 每日統計 @ '.date('Y-m-d'); if($valid_member_count>=1000){ $_ = '【達成:有效會員數破1000】'; $subj .= $_; $s = $_ .'
    ' . $s; } if($visible_job_count>=100){ $_ = '【達成:目前上架中職缺數破100】'; $subj .= $_; $s = $_ . '
    ' . $s; } send_mail_base($ary_emails, $subj, $s); } return $response; });