EIOS/rabprog/inc/class_StatPUR.php

492 lines
22 KiB
PHP
Raw Permalink Normal View History

2023-12-28 15:39:22 +03:00
<?php
class class_StatPUR{
private $DB;
private $URLS;
private $fakultet;
private $kafedra;
private $tip;
private $TFile='';
private $TUchebplans='';
function __construct($data=array()){
GLOBAL $DB,$ST,$WorkDIR;
$this->DB = $DB;
if(isset($data['cron'])&&$data['cron']==1){
}else {
$CHPU = new class_CHPU($WorkDIR);
$this->URLS = $CHPU->uri();
}
if(isset($data['fakultet'])) $this->fakultet = $data['fakultet'];
if(isset($data['kafedra'])) $this->kafedra = $data['kafedra'];
//echo '<pre>'.print_r($data,1).'</pre>';exit();
$this->tip = 'prorektor'; if(isset($data['tip'])) $this->tip = $data['tip'];
$this->TFile = $ST['dbpf'].'_fshp_file';
$this->TUchebplans = $ST['dbpf'].'_fshp_uchebplans';
}
public function HTML(){
GLOBAL $WorkDIR;
$out = array();
$smartyC = new class_smarty();
$smarty = $smartyC->config(__DIR__.'\..\tpl');
$urls = $this->URLS;
//echo '<pre>'.print_r($urls,1).'</pre>';Array([0]=statpur [1]=pdf01)
if(isset($urls[1])){
if($urls[1]=='pdf01'&&isset($urls[2])){
$id_fak = (int)$urls[2];
if($this->tip=='prorektor') {
$data = $this->get_facultets($id_fak);
}
if($this->tip=='dekan') {
$data = $this->get_facultets($this->get_facultet_by_name($this->fakultet));
}
if($this->tip=='zavkaf') {
$facultets = $this->get_facultets($this->get_facultet_by_name($this->fakultet));
foreach ($facultets as $key1 => $schools){
foreach ($schools as $key2 => $school){
foreach ($school['kafedras'] as $key3 => $kafedra){
if($kafedra['name']!=$this->kafedra){
unset($facultets[$key1][$key2]['kafedras'][$key3]);
}
}
}
}
$data = $facultets;
//echo '<pre>'.print_r($data,1).'</pre>'; exit();
}
$smarty->assign('TPL',$WorkDIR);
$smarty->assign('facultets', $data);
$smarty->display('page_statpur_pdf.html');
exit();
}
}else {
$des='view';
if(isset($_POST['fio_search'])){
$des='search';
$fio = $this->DB->rescape($_POST['fio']);
$itogs=array(); $itogsPrep=array(); $itogsPrep2=array();
$sql = 'SELECT id,fio FROM acs_users WHERE fio LIKE "%'.$fio.'%"';
$rez = $this->DB->QUR_SEL($sql);
if(!$rez['err']&&$rez['kol']){
foreach($rez['rez'] as $key => $val){
$sql1 = 'SELECT dp.id_uchebplans,up.id,up.index1,up.name,up.kaf_kod,up.kaf_name FROM acs_fshp_disciplin_prepod as dp, acs_fshp_uchebplans as up WHERE dp.id_prepod = '.$val['id'].' AND up.id=dp.id_uchebplans';
$rez1 = $this->DB->QUR_SEL($sql1);
//echo '<pre>'.print_r($rez1,1).'</pre>';exit();
if(!$rez1['err']&&$rez1['kol']) {
foreach ($rez1['rez'] as $key1 => $val1) {
$itog['kaf_kod'] = $val1['kaf_kod'];
$itog['kaf_name'] = $val1['kaf_name'];
$itog['index1'] = $val1['index1'];
$itog['name'] = $val1['name'];
$itog['save'] = array();
$sql2 = 'SELECT sv.* FROM acs_fshp_rpd_save as sv WHERE sv.id_discip='.$val1['id'];
$rez2 = $this->DB->QUR_SEL($sql2);
//echo '<pre>'.print_r($rez2,1).'</pre>';//exit();
if(!$rez2['err']&&$rez2['kol']){
foreach($rez2['rez'] as $key2 => $val2){
$rpdsave=array(); $rpdsave[] = $val2;
$itog['save'] = $this->save_calcul($rpdsave);
$itogsPrep[$val['fio']][]=round($itog['save']['proc']/100,2);
}
}else{
$itogsPrep[$val['fio']][]=0;
}
$itogs[$val['fio']][]=$itog;
$itogsPrep2[$val['fio']]['all'] = count($itogsPrep[$val['fio']]);
$sums = 0; foreach($itogsPrep[$val['fio']] as $k => $v) $sums+=$v;
$itogsPrep2[$val['fio']]['proc'] = round(($sums/count($itogsPrep[$val['fio']]))*100,2);
}
}
}
}
$smarty->assign('itogs', $itogs);
$smarty->assign('itogsPrep2', $itogsPrep2);
}else {
if ($this->tip == 'prorektor') {
$out = array('name' => 'Статистика проректора', 'body' => '');
$smarty->assign('facultets', $this->get_facultets());
}
if ($this->tip == 'dekan') {
$out = array('name' => 'Статистика "' . $this->fakultet . '"', 'body' => '');
$smarty->assign('facultets', $this->get_facultets($this->get_facultet_by_name($this->fakultet)));
}
if ($this->tip == 'zavkaf') {
$out = array('name' => 'Статистика "' . $this->kafedra . '"', 'body' => '');
$facultets = $this->get_facultets($this->get_facultet_by_name($this->fakultet));
/*Array([tip] => zavkaf[fakultet] => Факультет экономики и управления[kafedra] => Маркетинга, сервиса и туризма)*/
//echo '<pre>'.print_r($facultets,1).'</pre>'; exit();
foreach ($facultets as $key1 => $schools) {
foreach ($schools as $key2 => $school) {
foreach ($school['kafedras'] as $key3 => $kafedra) {
if ($kafedra['name'] != $this->kafedra) {
unset($facultets[$key1][$key2]['kafedras'][$key3]);
}
}
}
}
$smarty->assign('facultets', $facultets);
$otherRPD = $this->get_other_naznach($this->kafedra);
$smarty->assign('otherRPD', $otherRPD);
}
$smarty->assign('fakultet', $this->fakultet);
$smarty->assign('kafedra', $this->kafedra);
$smarty->assign('tip', $this->tip);
}
$smarty->assign('des', $des);
$out['body'] = $smarty->fetch('page_statpur.html');
//$out['body'] .= '<pre>'.print_r($_SESSION,1).'</pre>'.'----------------'.$this->fakultet;
}
return $out;
}
/**
* Получение назначений на РПД для не своей кафедры, зав.кафы могут назначать и другим кафедрам!
* @param $kafname
* @return array
*/
function get_other_naznach($kafname){
$sql = 'SELECT
up.id,up.index1,up.name, t.kafedra
FROM
'.$this->TUchebplans.' as up,
'.$this->TFile.' as t
WHERE
up.kaf_name="'.$kafname.'" AND
t.kafedra != "'.$kafname.'" AND
up.id_file=t.id_file
ORDER BY
t.shifr,t.god_nach_podgot,t.fo';
$rez = $this->DB->QUR_SEL($sql);
//echo $sql.'<pre>'.print_r($rez,1).'</pre>'; exit();
if(!$rez['err']&&$rez['kol']){
foreach($rez['rez'] as $key => $val){
$prepods = $this->get_statUchebPlanDiscipsPrepod($val['id']);
if(count($prepods)) {
$val['prepods'] = $this->get_statUchebPlanDiscipsPrepod($val['id']);
$out[] = $val;
}
}
}
//echo $sql.'<pre>'.print_r($out,1).'</pre>'; exit();
return $out;
}
function get_facultet_by_name($name){
$out = 0;
$sql = 'SELECT id FROM acs_faculties WHERE name="'.$this->fakultet.'"';
$rez = $this->DB->QUR_SEL($sql);
if(!$rez['err']&&$rez['kol']){
$out = $rez['rez'][0]['id'];
}
return $out;
}
function get_facultets($id_fak=0){
$out = array();
if($id_fak==0) {
$sql = 'SELECT
school.name as school_name,
facultie.id as facultie_id,
facultie.name as facultie_name
FROM
acs_schools as school,
acs_faculties as facultie
WHERE
school.id=facultie.id_school
ORDER BY school.name,facultie.name';
}else{
$sql = 'SELECT
school.name as school_name,
facultie.id as facultie_id,
facultie.name as facultie_name
FROM
acs_schools as school,
acs_faculties as facultie
WHERE
school.id=facultie.id_school AND
facultie.id='.$id_fak.'
ORDER BY school.name,facultie.name';
}
$rez = $this->DB->QUR_SEL($sql);
//echo $sql.'<pre>'.print_r($rez,1).'</pre>';exit();
if(!$rez['err']&&$rez['kol']){
foreach($rez['rez'] as $key => $val){
$val['kafedras'] = $this->get_kafedras($val['facultie_id']);
$out[$val['school_name']][] = $val;
}
}
//echo $sql.'<pre>'.print_r($rez,1).print_r($out,1).'</pre>';exit();
return $out;
}
function get_kafedras($id_fakultet){
$out = array();
$cache = $this->cache_check('kafedras',$id_fakultet);
if(count($cache)){
$out = $cache;
}else {
$sql = 'SELECT id,name,code FROM acs_kafedres WHERE id_facult = ' . $id_fakultet . ' ORDER BY code,name';
$rez = $this->DB->QUR_SEL($sql);
//echo $sql.'<pre>'.print_r($rez,1).'</pre>';
if (!$rez['err'] && $rez['kol']) {
foreach ($rez['rez'] as $key => $val) {
$tmp['id'] = $val['id'];
$tmp['name'] = $val['name'];
$tmp['code'] = $val['code'];
$tmp['up'] = $this->get_statUchebPlan($tmp['name']);
$out[] = $tmp;
}
$this->cache_check('kafedras',$id_fakultet,$out);
}
}
return $out;
}
function get_statUchebPlan($kafedra){
$out = array();
if($kafedra=='Кафедра госпитальной хирургии и последипломного образования') $kafedra = 'Госпитальной хирургии и последипломного образования';
if($kafedra=='Кафедра госпитальной терапии и последипломного образования') $kafedra = 'Госпитальной терапии и последипломного образования';
$cache = $this->cache_check('statUchebPlan',$kafedra);
if(count($cache)){
$out = $cache;
}else {
$sql = 'SELECT id,data_c,id_file,program,shifr,naprav,profil,kvalif,god_nach_podgot,fo,srok_poluch_obr FROM acs_fshp_file WHERE kafedra = "' . $kafedra . '" AND god_nach_podgot='.$_SESSION['year_cur'].' ORDER BY naprav';
$rez = $this->DB->QUR_SEL($sql);
//echo $sql.'<pre>'.print_r($rez,1).'</pre>'; //exit();
if (!$rez['err'] && $rez['kol']) {
foreach ($rez['rez'] as $key => $val) {
$val['discips'] = $this->get_statUchebPlanDiscips($val['id_file']);
$out[] = $val;
}
$this->cache_check('statUchebPlan',$kafedra,$out);
}
}
return $out;
}
function get_statUchebPlanDiscips($id_file){
$out = array();
$cache = $this->cache_check('statUchebPlanDiscips',$id_file);
if(count($cache)){
$out = $cache;
}else {
$sql = 'SELECT id,index1,name FROM acs_fshp_uchebplans WHERE id_file = ' . $id_file . ' ORDER BY index1';
//echo $sql.'<br>';
$rez = $this->DB->QUR_SEL($sql);
if (!$rez['err'] && $rez['kol']) {
foreach ($rez['rez'] as $key => $val) {
$prepods = $this->get_statUchebPlanDiscipsPrepod($val['id']);
//echo '<pre>'.print_r($prepods,1).'</pre>';
if (count($prepods)) {
$val['prepods'] = $prepods;//$this->get_statUchebPlanDiscipsPrepod($val['id']);
$out[] = $val;
}
}
$this->cache_check('statUchebPlanDiscips',$id_file,$out);
}
}
//echo 'get_statUchebPlanDiscips: <pre>'.print_r($out,1).'</pre>';
return $out;
}
/**
* Кэширование SQL запросов
* @param $sql1
* @param $key
* @return array|mixed|null
*/
function cache_sess($sql1,$key='StatPUR_Cache',$des='add'){
if($des=='del'){
if(isset($_SESSION[$key][md5($sql1)]))
unset($_SESSION[$key][md5($sql1)]);
}else {
if (!isset($_SESSION[$key][md5($sql1)])) {
$rez1 = $this->DB->QUR_SEL($sql1);
$_SESSION[$key][md5($sql1)] = $rez1;
} else {
$rez1 = $_SESSION[$key][md5($sql1)];
}
}
return $rez1;
}
function get_statUchebPlanDiscipsPrepod($id_uchebplan){
$out = array();
$cache = $this->cache_check('statUchebPlanDiscipsPrepod',$id_uchebplan);
if(count($cache)){
$out = $cache;
}else {
$sql = 'SELECT u.id,u.fio,fdp.data_c,fdp.descrip,fdp.status FROM acs_fshp_disciplin_prepod as fdp, acs_users as u WHERE fdp.id_uchebplans = ' . $id_uchebplan . ' AND u.id=fdp.id_prepod';
//echo $sql.'<br>';
//$rez = $this->DB->QUR_SEL($sql);
$rez = $this->cache_sess($sql);
if (!$rez['err'] && $rez['kol']) {
foreach ($rez['rez'] as $key => $val) {
$val['saves'] = $this->get_statUchebPlanDiscipsSaves($id_uchebplan, $val['id']);
$out[] = $val;
}
$this->cache_check('statUchebPlanDiscipsPrepod',$id_uchebplan,$out);
}
}
return $out;
}
function get_statUchebPlanDiscipsSaves($id_discip,$id_prepod){
$out = array();
$cache = $this->cache_check('statUchebPlanDiscipsSaves',$id_discip.'_'.$id_prepod);
if(count($cache)){
$out = $cache;
}else {
$sql = 'SELECT * FROM acs_fshp_rpd_save WHERE id_discip = ' . $id_discip . ' AND id_prepod = ' . $id_prepod . ' ORDER BY data_c';
//echo $sql.'<br>';
$rez = $this->DB->QUR_SEL($sql);
$all_save = 16;
$out = array('all' => $all_save, 'kol_save' => 0, 'proc' => 0);
if (!$rez['err'] && $rez['kol']) {
$out = $this->save_calcul($rez['rez']);
//foreach ($rez['rez'] as $key => $val) {
// $kol_save = 0;
// if (trim($val['razdel1']) !== '') $kol_save++;
// if (trim($val['razdel2']) !== '') $kol_save++;
// if (trim($val['razdel3']) !== '') $kol_save++;
// if (trim($val['razdel4']) !== '') $kol_save++;
// if (trim($val['razdel5']) !== '') $kol_save++;
// if (trim($val['razdel5_4']) !== '') $kol_save++;
// if (trim($val['razdel5_5']) !== '') $kol_save++;
// if (trim($val['razdel5_6']) !== '') $kol_save++;
// if (trim($val['razdel5_7']) !== '') $kol_save++;
// if (trim($val['razdel5_8']) !== '') $kol_save++;
// if (trim($val['razdel5_9']) !== '') $kol_save++;
// if (trim($val['razdel6_1']) !== '') $kol_save++;
// if (trim($val['razdel6_2']) !== '') $kol_save++;
// if (trim($val['razdel7']) !== '') $kol_save++;
// if (trim($val['razdel7_2']) !== '') $kol_save++;
// if (trim($val['razdel7_3']) !== '') $kol_save++;
// $out = array('all' => $all_save, 'kol_save' => $kol_save, 'proc' => round((($kol_save / $all_save) * 100), 2));
//}
$this->cache_check('statUchebPlanDiscipsSaves',$id_discip.'_'.$id_prepod,$out);
}
}
return $out;
}
/**
* Подсчет сохранений
* @param $save
* @return array
*/
function save_calcul($save){
$all_save = 16;
$nullvals = array('{"0":[{"sem":"null"}]}','null');
foreach ($save as $key => $val) {
$kol_save = 0;
if (trim($val['razdel1']) !== '') {
if (!in_array($val['razdel1'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel2']) !== '') {
if (!in_array($val['razdel2'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel3']) !== '') {
if (!in_array($val['razdel3'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel4']) !== '') {
if (!in_array($val['razdel4'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel5']) !== '') {
if (!in_array($val['razdel5'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel5_4']) !== '') {
if (!in_array($val['razdel5_4'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel5_5']) !== '') {
if (!in_array($val['razdel5_5'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel5_6']) !== '') {
if (!in_array($val['razdel5_6'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel5_7']) !== '') {
if (!in_array($val['razdel5_7'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel5_8']) !== '') {
if (!in_array($val['razdel5_8'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel5_9']) !== '') {
if (!in_array($val['razdel5_9'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel6_1']) !== '') {
if (!in_array($val['razdel6_1'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel6_2']) !== '') {
if (!in_array($val['razdel6_2'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel7']) !== '') {
if (!in_array($val['razdel7'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel7_2']) !== '') {
if (!in_array($val['razdel7_2'], $nullvals)) $kol_save++;
else $all_save--;
}
if (trim($val['razdel7_3']) !== '') {
if (!in_array($val['razdel7_3'], $nullvals)) $kol_save++;
else $all_save--;
}
}
$out = array('all' => $all_save, 'kol_save' => $kol_save, 'proc' => round((($kol_save / $all_save) * 100), 2));
return $out;
}
/**
* Проверка кэша для $what и его параметров $param
* если передали массив $data то сохраняем данные в кэш
* @param $what
* @param $param
* @param $data
* @return array|mixed
*/
function cache_check($what,$param,$data=array()){
$dir = 'tmp/statrpd/';
if(!file_exists($dir)) mkdir($dir,0777,1);
$file = $dir.$what.'_'.$_SESSION['year_cur'].'_'.$param.'.json';
if(count($data)){//создадим файл кэша
file_put_contents($file,json_encode($data));
$arr = $data;
}else {//получим данные файла кэша
if (file_exists($file)) {
$times = 60*60*24; // 3 часа
if($what=='statUchebPlanDiscipsSaves') $times = 60*60*12; // 1 час
if((filectime($file)+$times)>=time()){//если файл изменился в течении последних 3 часов
$arr = json_decode(file_get_contents($file), 1);
}else{
$arr = array();
}
} else {
$arr = array();
}
}
return $arr;
}
function prepods_get($fakultet,$kafedra){
$out = array();
//$sql = 'SELECT id,data_c,data_u,id_user,zvanie,dolgnost,stepen FROM acs_teachers WHERE fakultet="'.$fakultet.'" AND kafedra="'.$kafedra.'"';
$sql = 'SELECT t.id,t.id_user,t.zvanie,t.dolgnost,t.stepen,u.data_c,u.data_u,u.fio FROM acs_teachers as t, acs_users as u WHERE t.fakultet="'.$fakultet.'" AND t.kafedra="'.$kafedra.'" AND t.id_user=u.id ORDER BY u.fio';
$rez = $this->DB->QUR_SEL($sql);
if(!$rez['err']&&$rez['kol']){
$out = $rez['rez'];
}
return $out;
}
}