mode_knowtraimAction.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <?php
  2. /**
  3. * 此文件是流程模块【knowtraim.考试培训】对应接口文件。
  4. * 可在页面上创建更多方法如:public funciton testactAjax(),用js.getajaxurl('testact','mode_knowtraim|input','flow')调用到对应方法
  5. */
  6. class mode_knowtraimClassAction extends inputAction{
  7. protected function savebefore($table, $arr, $id, $addbo){
  8. $dsshu = abs((int)$arr['dsshu']);
  9. $dxshu = abs((int)$arr['dxshu']);
  10. $pdshu = abs((int)$arr['pdshu']);
  11. $state = 0;
  12. if($arr['startdt']>=$arr['enddt'])return '开始时间不能大于截止时间';
  13. $where = $this->flow->gettikuwhere($arr['tikuid']);
  14. $darr = $this->db->getall('SELECT `type`,count(1)stotal FROM `[Q]knowtiku` where `status`=1 '.$where.' group by `type`');
  15. $darrs = array(0,0,0);
  16. foreach($darr as $k=>$rs)$darrs[$rs['type']] = (int)$rs['stotal'];
  17. if($dsshu>$darrs[0])return '单选数量太多,题库里只有'.$darrs[0].'题';
  18. if($dxshu>$darrs[1])return '多选数量太多,题库里只有'.$darrs[1].'题';
  19. if($pdshu>$darrs[2])return '判断数量太多,题库里只有'.$darrs[2].'题';
  20. if($dsshu+$dxshu+$pdshu==0)return '至少要一个题目数';
  21. $now = $this->rock->now;
  22. if($arr['enddt']<$now){
  23. $state = 2;
  24. }else if($arr['startdt']<$now){
  25. $state = 1;
  26. }
  27. $rows['dsshu'] = $dsshu;
  28. $rows['dxshu'] = $dxshu;
  29. $rows['pdshu'] = $pdshu;
  30. $rows['state'] = $state;
  31. return array(
  32. 'rows' => $rows
  33. );
  34. }
  35. protected function saveafter($table, $arr, $id, $addbo){
  36. $receid = $arr['receid'];
  37. $ustrs = m('admin')->gjoin($arr['receid'],'ud');
  38. $ustrsa = explode(',', repempt($ustrs));
  39. $dbs = m('knowtrais');
  40. $mrs = m('knowtraim')->getone($id);
  41. $ids = '0';
  42. $reshu = 0;
  43. foreach($ustrsa as $uid){
  44. $where = '`mid`='.$id.' and `uid`='.$uid.'';
  45. $sid = (int)$dbs->getmou('id', $where);
  46. if($sid==0){
  47. $where = '';
  48. }
  49. $uarr = array(
  50. 'mid' => $id,
  51. 'uid' => $uid,
  52. 'comid' => $mrs['comid']
  53. );
  54. $sids = $dbs->record($uarr, $where);
  55. if($sid==0)$sid = $this->db->insert_id();
  56. $ids .= ','.$sid.'';
  57. $reshu++;
  58. }
  59. $dbs->delete('`mid`='.$id.' and `id` not in('.$ids.')');
  60. m($table)->update('`reshu`='.$reshu.'', $id);
  61. }
  62. public function kstimelist()
  63. {
  64. $arrs = explode(',','10,20,30,45,60,70,80,90,100,110,120,130,140,150,160,170,180');
  65. $rows = array();
  66. foreach($arrs as $sj){
  67. $rows[] = array(
  68. 'value' => $sj,
  69. 'name' => $sj.'分钟',
  70. );
  71. }
  72. return $rows;
  73. }
  74. public function knowtraimuserbefore($table)
  75. {
  76. $atype = $this->post('atype');
  77. $key = $this->post('key');
  78. $mid = (int)$this->post('mid','0');
  79. $where = '';
  80. if($atype=='my'){
  81. $where=' and a.`uid`='.$this->adminid.' ';
  82. }else{
  83. if($mid==0 && ISMORECOM){
  84. $where=" and a.`comid`=".m('admin')->getcompanyid()."";
  85. }
  86. }
  87. if($mid!=0)$where.=' and a.`mid`='.$mid.'';
  88. if($key!='')$where.=m('admin')->getkeywhere($key,'c.',"or b.`title` like '%$key%'");
  89. m('flow:knowtraim')->reloadstate();
  90. return array(
  91. 'table' => '`[Q]'.$table.'` a left join `[Q]knowtraim` b on a.mid=b.id left join `[Q]admin` c on c.id=a.`uid`',
  92. 'where' => $where,
  93. 'order' => 'a.id desc',
  94. 'fields'=> 'a.*,b.title,b.state,b.startdt,b.enddt,c.`name`,c.deptname'
  95. );
  96. }
  97. public function knowtraimuserafter($table, $rows)
  98. {
  99. $mdos = m('flow:knowtraim');
  100. foreach($rows as $k=>$rs){
  101. $zt = $mdos->getstatestr($rs['state']);
  102. $rows[$k]['startdt'] = ''.substr($rs['startdt'],5,11).'至'.substr($rs['enddt'],5,11).'('.$zt.')';
  103. if($rs['fenshu']=='0' && $rs['isks']==0)$rows[$k]['fenshu']='';
  104. if(!isempt($rs['ksedt']))$rows[$k]['ksedt'] = ''.substr($rs['kssdt'],5,11).'至'.substr($rs['ksedt'],5,11).'';
  105. $strs = ($rs['isks']=='1') ? '<font color=green>已考试</font>' : '<font color=red>未考试</font>';
  106. if($rs['state']=='0')$strs='<font color="#888888">未开始</font>';
  107. $rows[$k]['isks'] = $strs;
  108. $rows[$k]['iskszt'] = $rs['isks'];
  109. }
  110. return array(
  111. 'rows' => $rows
  112. );
  113. }
  114. //初始化考试
  115. public function initkaoshiAjax()
  116. {
  117. $sid = (int)$this->get('sid');
  118. $uid = $this->adminid;
  119. $dbs = m('knowtrais');
  120. $ors = $dbs->getone("`id`='$sid' and `uid`='$uid'");
  121. if(!$ors)return '记录不存在';
  122. if($ors['isks']=='1')return '你已经考试过了';
  123. $dbss = m('flow')->initflow('knowtraim');
  124. $dbss->reloadstate($ors['mid']);//更新状态
  125. $mrs = m('knowtraim')->getone($ors['mid']);
  126. if(!$mrs)return '记录不存在';
  127. if($mrs['state']!='1')return '培训考试题目可能还未开始或已结束了';
  128. $dxshu = (int)$mrs['dxshu'];//多选
  129. $dsshu = (int)$mrs['dsshu']; //单选
  130. $pdshu = (int)$mrs['pdshu']; //单选
  131. $ids = '';
  132. $wheress= $dbss->gettikuwhere($mrs['tikuid'], arrvalue($mrs,'comid','0'));
  133. $itros = m('knowtiku')->getall('`status`=1 '.$wheress.'','id,`type`','`type`,`id`');
  134. $dxarr = $dsarr = $pdarr = array();
  135. foreach($itros as $k=>$rs){
  136. if($rs['type']=='0')$dsarr[] = $rs;
  137. if($rs['type']=='1')$dxarr[] = $rs;
  138. if($rs['type']=='2')$pdarr[] = $rs;
  139. }
  140. for($i=1;$i<=$dsshu; $i++){
  141. $idarr = $this->getrandts($dsarr);
  142. $dsarr = $idarr['rows'];
  143. $idss = $idarr['id'];
  144. if($idss=='0')return '单选的题库不够';
  145. $ids .= ','.$idss.'';
  146. }
  147. for($i=1;$i<=$dxshu; $i++){
  148. $idarr = $this->getrandts($dxarr);
  149. $dxarr = $idarr['rows'];
  150. $idss = $idarr['id'];
  151. if($idss=='0')return '多选的题库不够';
  152. $ids .= ','.$idss.'';
  153. }
  154. for($i=1;$i<=$pdshu; $i++){
  155. $idarr = $this->getrandts($pdarr);
  156. $pdarr = $idarr['rows'];
  157. $idss = $idarr['id'];
  158. if($idss=='0')return '判断的题库不够';
  159. $ids .= ','.$idss.'';
  160. }
  161. if($ids!='')$ids = substr($ids,1);
  162. $uarr['tkids'] = $ids;
  163. $uarr['kssdt'] = $this->rock->now;
  164. $dbs->update($uarr, $sid);
  165. return 'ok';
  166. }
  167. //随机获取题目
  168. private function getrandts($arr)
  169. {
  170. $id = '0';
  171. $nearr = array();
  172. if($arr){
  173. $len= count($arr);
  174. $rnd= rand(0, $len-1);
  175. $id = arrvalue($arr[$rnd],'id');
  176. for($i=0;$i<$len;$i++)if($i!=$rnd)$nearr[]=$arr[$i];
  177. }
  178. return array(
  179. 'rows' => $nearr,
  180. 'id' => $id
  181. );
  182. }
  183. //提交答案
  184. public function datitijAjax()
  185. {
  186. $oi = (int)$this->get('oi');
  187. $sid = (int)$this->get('sid');
  188. $tid = (int)$this->get('tid');
  189. $dy = strtoupper($this->get('dy'));
  190. $uid = $this->adminid;
  191. $dbs = m('knowtrais');
  192. $ors = $dbs->getone("`id`='$sid' and `uid`='$uid'");
  193. if(!$ors)return '记录不存在';
  194. $trs = m('knowtiku')->getone($tid);
  195. $answer = strtoupper($trs['answer']);
  196. $mid = $ors['mid'];
  197. $mrs = m('knowtraim')->getone($mid);
  198. $tkids = $ors['tkids'];
  199. $dyids = $ors['dyids'];
  200. $dyidsa= explode(',', repempt($dyids));
  201. $tkidsa= explode(',', repempt($tkids));
  202. $dyjgsa= explode(',', repempt($ors['dyjgs']));
  203. $danva = $jgarr = array();
  204. $zfenshu = floatval($mrs['zfenshu']); //总分
  205. $hgfen = floatval($mrs['hgfen']); //合格的分数
  206. $tmshu = count($tkidsa);//题目数
  207. $dfen = 0;
  208. $meifen = $zfenshu/$tmshu;
  209. $jg = '0';
  210. foreach($tkidsa as $k=>$xu){
  211. if($k!=$oi){
  212. $danva[$k] = arrvalue($dyidsa, $k);
  213. $jgarr[$k] = arrvalue($dyjgsa, $k,'0');
  214. }else{
  215. $danva[$k] = $dy;
  216. $jg = '2';
  217. if($answer == $dy)$jg='1';
  218. $jgarr[$k] = $jg;
  219. }
  220. }
  221. $days = $jgs = '';
  222. foreach($danva as $k=>$v)$days.=','.$v.'';
  223. $days = substr($days, 1);
  224. foreach($jgarr as $k=>$v){
  225. $jgs.=','.$v.'';
  226. if($v=='1')$dfen+=$meifen;
  227. }
  228. $jgs = substr($jgs, 1);
  229. $barr= array(
  230. 'dyids' => $days,
  231. 'dyjgs' => $jgs,
  232. 'ksedt' => $this->rock->now,
  233. 'kstime'=> $this->get('sj'),
  234. 'isks' => 1,
  235. 'fenshu'=> $dfen
  236. );
  237. $dbs->update($barr, $sid);
  238. if($oi==0)m('flow:knowtraim')->reloadstate($mid);
  239. if($jg=='2')return '错了,正确是:'.$answer.'';
  240. return 'ok';
  241. }
  242. public function finfishAjax()
  243. {
  244. $sid = (int)$this->get('sid');
  245. $dbs = m('knowtrais');
  246. $barr= array(
  247. 'ksedt' => $this->rock->now,
  248. 'kstime'=> $this->get('sj'),
  249. 'isks' => 1
  250. );
  251. $dbs->update($barr, $sid); //更新
  252. m('flow:knowtraim')->reloadstate();
  253. return $dbs->getmou('fenshu', $sid);
  254. }
  255. //标识可重新考试
  256. public function biaoshiAjax()
  257. {
  258. $fid = c('check')->onlynumber($this->post('fid','0'));
  259. m('knowtrais')->update(array(
  260. 'kssdt' => '',
  261. 'ksedt' => '',
  262. 'fenshu' => '0',
  263. 'kstime' => '0',
  264. 'isks' => '0',
  265. 'tkids' => '',
  266. 'dyids' => '',
  267. 'dyjgs' => '',
  268. ),"`id` in($fid) and `mid` in(select `id` from `[Q]knowtraim` where `state`<>2)");
  269. }
  270. public function tongjiAjax()
  271. {
  272. $mid = (int)$this->post('mid');
  273. $arows = m('knowtrais')->getall('`mid`='.$mid.'');
  274. $mrs = m('knowtraim')->getone($mid);
  275. $hgfen = floatval($mrs['hgfen']); //合格的分数
  276. $hgshu = $wks = $bhg =0;
  277. $zshu = 0;
  278. foreach($arows as $k=>$rs){
  279. if($rs['isks']=='0'){
  280. $wks++;
  281. }else{
  282. $fs = floatval($rs['fenshu']);
  283. if($fs>=$hgfen){
  284. $hgshu++;
  285. }else{
  286. $bhg++;
  287. }
  288. }
  289. $zshu++;
  290. }
  291. $rows[] = array(
  292. 'name' => '合格',
  293. 'value'=> $hgshu
  294. );
  295. $rows[] = array(
  296. 'name' => '不合格',
  297. 'value'=> $bhg
  298. );
  299. $rows[] = array(
  300. 'name' => '未考试',
  301. 'value'=> $wks
  302. );
  303. foreach($rows as $k=>$rs){
  304. $bili = $this->rock->number($rs['value']/$zshu*100);
  305. $rows[$k]['bili'] = ''.$bili.'%';
  306. }
  307. $rows[] = array(
  308. 'name' => '合计',
  309. 'value'=> $zshu
  310. );
  311. return array(
  312. 'rows' => $rows
  313. );
  314. }
  315. //读取对应题库
  316. public function tikunamedata()
  317. {
  318. return $this->option->getcnumdata('knowtikutype');
  319. }
  320. }
粤ICP备19079148号