1
0

Camp.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. <?php
  2. namespace app\api\controller;
  3. use think\facade\Request;
  4. use app\model\Camp as CampModel;
  5. use app\model\ExamEmpResult;
  6. use app\model\TrainDoneLog;
  7. use app\model\CampPlan;
  8. use app\model\CampEmployee;
  9. use app\model\TrainClass;
  10. use app\model\ExamPaper;
  11. use app\model\UserCollect;
  12. use app\model\Footprints;
  13. use app\model\Customer;
  14. use app\model\CustomerVisitLog;
  15. use app\model\Org;
  16. use app\model\Employee;
  17. class Camp extends Base
  18. {
  19. /*
  20. * 考核进度
  21. */
  22. public function read()
  23. {
  24. $token = $this->request->token;
  25. // $param = Request::only(['id']);
  26. // $token['root_org'] = 23;
  27. // $token['employee_id'] = 87;
  28. $w[] = ['employee_id','=',$token['employee_id']];
  29. $w[] = ['now','=',1];
  30. $w[] = ['root_id','=',$token['root_org']];
  31. $data = CampEmployee::where($w)->find();
  32. $res['code'] = 0;//没有指派训练
  33. if (!$data) return json(['code'=>0 , 'data'=>$res , 'msg'=>'']);
  34. $res['code'] = 1;//通过训练已转正
  35. if ($data->state=='转正') return json(['code'=>0 , 'data'=>$res , 'msg'=>'']);
  36. $cw[] = ['id','=',$data->camp_id];
  37. $cw[] = ['root_id','=',$token['root_org']];
  38. $info = CampModel::where($cw)->find();
  39. $res['start_date'] = $info->start_date . ' 00:00:00';
  40. $res['end_date'] = $info->end_date.' 23:59:59';
  41. $res['code'] = 2;//训练中,未通过等
  42. $res['speed'] = $data['speed'] ?: '0%';
  43. $pw[] = ['root_id','=',$token['root_org']];
  44. $pw[] = ['camp_id','=',$data->camp_id];
  45. $pw[] = ['con_id','>',0];
  46. $pw[] = ['plan_id','>',0];
  47. $pw[] = ['del','=',0];
  48. $plan = CampPlan::where($pw)->order('id asc')->select()->toArray();
  49. $res['count'] = count($plan);//总节数
  50. $w0 = $w1 = [];//0课程,1试卷
  51. foreach ($plan as $k => $v) {
  52. $v['type']==0 ? $w0[]=$v['con_id'] : $w1[]=$v['con_id'];
  53. }
  54. $tw[] = ['class_id','in',$w0];
  55. $tw[] = ['root_id','=',$token['root_org']];
  56. $tw[] = ['from','=',1];
  57. $tw[] = ['employee_id','=',$token['employee_id']];
  58. $tw[] = ['done_percent','=',100];
  59. $train = TrainDoneLog::where($tw)->count();
  60. $ew[] = ['paper_id','in',$w1];
  61. $ew[] = ['root_id','=',$token['root_org']];
  62. $ew[] = ['from','=',1];
  63. $ew[] = ['employee_id','=',$token['employee_id']];
  64. // $paper = ExamEmpResult::where($ew)->count();
  65. $paper = ExamEmpResult::with('paper')->where($ew)->select()->toArray();
  66. $i = 0;
  67. foreach ($paper as $k6 => $v6) {
  68. if ($v6['base_score'] <= $v6['final_score']) {
  69. $i+=1;
  70. }
  71. }
  72. $res['passed_count'] = $train+$i;
  73. $res['no_passed_count'] = $res['count']-$res['passed_count'];
  74. $res['camp_id'] = $data['camp_id'];
  75. $res['speed'] = $res['count'] ? round(($res['passed_count']/$res['count'])*100,2).'%' : '0%';
  76. return json(['code'=>0 , 'data'=>$res , 'msg'=>'获取成功']);
  77. }
  78. /*
  79. * 计划详情
  80. */
  81. public function list()
  82. {
  83. $token = $this->request->token;
  84. $param = Request::only(['plan_id']);
  85. // $token['root_org'] = 23;
  86. // $token['employee_id'] = 87;
  87. $w[] = ['root_id','=',$token['root_org']];
  88. $w[] = ['plan_id','=',$param['plan_id']];
  89. $w[] = ['del','=',0];
  90. $eid = $token['employee_id'];
  91. $row = CampPlan::with(['trainDoneLog'=>function($query) use ($eid){
  92. $query->where([['employee_id','=',$eid],['from','=',1]]);
  93. },'examEmpResult'=>function($query) use ($eid){
  94. $query->where([['employee_id','=',$eid],['from','=',1]]);
  95. }])->where($w)->order('id asc')->select()->toArray();
  96. $data = [];
  97. foreach ($row as $k => $v) {
  98. $s = [];
  99. //课程训练人数
  100. $w1 = [];
  101. $camp_ids = CampPlan::where([['con_id','=',$v['con_id']],['type','=',$v['type']],['del','=',0]])->column('camp_id');
  102. $w1[] = ['camp_id','in',$camp_ids];
  103. $w1[] = ['root_id','=',$token['root_org']];
  104. $w1[] = ['now','=',1];
  105. $s['count'] = CampEmployee::where($w1)->count();//课程训练人数
  106. $s['type'] = $v['type'];
  107. $s['title'] = $v['title'];
  108. $s['con_id'] = $v['con_id'];
  109. if ($v['type']==1) {//试卷\
  110. $s['speed'] = (!$v['examEmpResult']) ? '待考核' : ($v['examEmpResult']['approve_status']==0 ? '待批改' : '已完成');
  111. $s['source'] = 0;
  112. $w = [];
  113. $w[] = ['camp_id','=',$v['camp_id']];
  114. $w[] = ['root_id','=',$token['root_org']];
  115. $w[] = ['now','=',1];
  116. $eids = CampEmployee::where($w)->column('employee_id');
  117. $ew = [];
  118. $ew[] = ['employee_id','in',$eids];
  119. $ew[] = ['root_id','=',$token['root_org']];
  120. $ew[] = ['paper_id','=',$v['con_id']];
  121. $ew[] = ['from','=',1];
  122. $ec = ExamEmpResult::where($ew)->count();
  123. }else{
  124. $s['speed'] = (!$v['trainDoneLog']) ? 0 : $v['trainDoneLog']['done_percent'];
  125. $s['source'] = TrainClass::where([['id','=',$s['con_id']]])->value('course_id');
  126. $s['source'] = $s['source'] ? count(array_filter(explode(',',$s['source']))) : 0;
  127. $w = [];
  128. $w[] = ['camp_id','=',$v['camp_id']];
  129. $w[] = ['root_id','=',$token['root_org']];
  130. $w[] = ['now','=',1];
  131. $eids = CampEmployee::where($w)->column('employee_id');
  132. $tw = [];
  133. $tw[] = ['class_id','=',$v['con_id']];
  134. $tw[] = ['root_id','=',$token['root_org']];
  135. $tw[] = ['from','=',1];
  136. $tw[] = ['employee_id','in',$eids];
  137. $tw[] = ['done_percent','=',100];
  138. $ec = TrainDoneLog::where($tw)->count();
  139. }
  140. $s['passed_count'] = $ec;
  141. $data[] = $s;
  142. }
  143. return json(['code'=>0 , 'data'=>$data , 'msg'=>'获取成功']);
  144. }
  145. //继续
  146. private function date_switch($time)
  147. {
  148. // $now = time();
  149. // // $old = strtotime(date($time));
  150. // $dur = $time - $now;
  151. $dur = $time;
  152. if($dur <= 0){
  153. return $time;
  154. }elseif($dur < 60){
  155. return $dur.'秒后';
  156. }elseif($dur < 3600){
  157. return floor($dur/60).'分钟后';
  158. }elseif($dur < 86400){
  159. return floor($dur/3600).'小时后';
  160. }elseif($dur < 2678400){
  161. return floor($dur/86400).'天后';
  162. }elseif($dur < 2678400*12){
  163. return floor($dur/2678400).'月后';
  164. }else{
  165. return floor($dur/2678400/12).'年后';
  166. }
  167. }
  168. /*
  169. * 训练计划
  170. */
  171. public function plan()
  172. {
  173. $token = $this->request->token;
  174. $param = Request::only(['camp_id']);
  175. // $token['root_org'] = 23;
  176. // $token['employee_id'] = 87;
  177. $eid = $token['employee_id'];
  178. $camp_id = $param['camp_id'];
  179. $w[] = ['id','=',$param['camp_id']];
  180. $w[] = ['root_id','=',$token['root_org']];
  181. $info = CampModel::with(['campPlan'=>function($query){
  182. $query->where([['del','=',0]])->order('id asc');
  183. },'employee'=>function($query) use ($eid,$camp_id){
  184. $query->where([['camp_id','=',$camp_id],['employee_id','=',$eid],['now','=',1]]);
  185. }])->where($w)->find();
  186. if (!$info || !$info->employee) return json(['code'=>1 , 'data'=>'数据不存在' , 'msg'=>'数据不存在']);
  187. $date = $info->employee->addtime;//指派时间
  188. $date = explode(' ',$date);
  189. $day = $info->day;
  190. $time = $info->time;
  191. $start = $date[0].' '.$time;
  192. $unix = strtotime($start);
  193. $plan = [];
  194. foreach ($info->campPlan as $k => $v) {
  195. if ($v['con_id']==0 && $v['plan_id']==0) {
  196. $plan[] = $v;
  197. }
  198. }
  199. $data = [];
  200. //日期模式
  201. if ($info->pattern == 0) {
  202. foreach ($plan as $k2 => $v2) {
  203. $save = [];
  204. $save['title'] = $v2['title'];
  205. $save['id'] = $v2['id'];
  206. $d = $k2*$day*86400+$unix;
  207. if (time() > $d || $k2==0) {
  208. $save['checked'] = true;
  209. $save['remark'] = '已解锁';
  210. }else{
  211. // $d = round((( $d-time())/86400),1);
  212. $d = $d-time();
  213. $d = $this->date_switch($d);
  214. $save['checked'] = false;
  215. $save['remark'] = $d;
  216. }
  217. $data[] = $save;
  218. }
  219. }else{//闯关模式
  220. $a = true;
  221. foreach ($plan as $k3 => $v3) {
  222. $save = [];
  223. $save['title'] = $v3['title'];
  224. $save['result'] = 1;//课程学习通过
  225. $save['checked'] = true;//已解锁
  226. $save['remark'] = '已解锁';
  227. $save['id'] = $v3['id'];
  228. $w0 = $w1 = [];//0课程,1试卷
  229. foreach ($info->campPlan as $k4 => $v4) {
  230. if ($v4['plan_id']==$v3['id']) {
  231. $v4['type']==0 ? $w0[]=$v4['con_id'] : $w1[]=$v4['con_id'];
  232. }
  233. }
  234. $tw = $ew = [];
  235. $tw[] = ['class_id','in',$w0];
  236. $tw[] = ['root_id','=',$token['root_org']];
  237. $tw[] = ['from','=',1];
  238. $tw[] = ['employee_id','=',$token['employee_id']];
  239. $train = TrainDoneLog::where($tw)->column('*');
  240. $ew[] = ['paper_id','in',$w1];
  241. $ew[] = ['root_id','=',$token['root_org']];
  242. $ew[] = ['from','=',1];
  243. $ew[] = ['employee_id','=',$token['employee_id']];
  244. // var_dump($ew);die;
  245. $paper = ExamEmpResult::with('paper')->where($ew)->select()->toArray();
  246. // p($paper);
  247. $result = true;
  248. if ($train) {
  249. foreach ($train as $k5 => $v5) {
  250. if ($v5['done_percent'] != 100) {
  251. $save['checked'] = false;
  252. $save['remark'] = '课程学习未通过';
  253. $save['result'] = 0;
  254. $result = $a = false;
  255. break;
  256. }
  257. }
  258. }
  259. if ($result && $paper) {
  260. foreach ($paper as $k6 => $v6) {
  261. //未批改
  262. if ($v6['approve_status']==0) {
  263. $check = $this->paper($v6);
  264. if ($check==0) {
  265. $save['checked'] = false;
  266. $save['remark'] = '试卷未批改';
  267. $save['result'] = 0;
  268. $result = $a = false;
  269. break;
  270. }elseif ($check==1) {
  271. $save['checked'] = false;
  272. $save['remark'] = '试卷考核不及格';
  273. $save['result'] = 0;
  274. $result = $a = false;
  275. break;
  276. }
  277. }else{
  278. if ($v6['base_score'] > $v6['final_score']) {
  279. $save['checked'] = false;
  280. $save['remark'] = '试卷考核不及格';
  281. $save['result'] = 0;
  282. $result = $a = false;
  283. break;
  284. }
  285. }
  286. }
  287. }
  288. //没作答
  289. if (!$train && !$paper) {
  290. $save['checked'] = false;
  291. $save['result'] = 0;
  292. $save['remark'] = '未开始考核';
  293. }elseif ($result) {
  294. $save['checked'] = true;
  295. $save['result'] = 1;
  296. $save['remark'] = '考核通过';
  297. }
  298. $data[] = $save;
  299. }
  300. foreach ($data as $k7 => $v7) {
  301. if ($k7==0){ $data[$k7]['checked'] = true;$save['result']=1;continue;}
  302. //前一个考核通过下一个自动解锁
  303. if ($data[$k7-1]['checked'] && $data[$k7-1]['result']) {
  304. $data[$k7]['checked'] = true;
  305. }
  306. }
  307. }
  308. return json(['code'=>0 , 'data'=>$data , 'msg'=>'获取成功']);
  309. }
  310. //批改试卷
  311. public function paper($data)
  312. {
  313. $token = $this->request->token;
  314. $token['root_org'] = $data['root_id'];
  315. $token['employee_id'] = $data['employee_id'];
  316. $paperid = $data['paper_id'];
  317. $employee_id = $data['employee_id'];
  318. $time = time() - strtotime($data['addtime']);
  319. //超过一天未批改则系统审批
  320. if ($time>86400) {
  321. }else{
  322. return 0;//考试时间未超过24小时
  323. }
  324. // $token['root_org'] = 23;
  325. // $token['employee_id'] = 58;
  326. // $paperid = input('paperid',0);
  327. // $employee_id = input('employee_id',0);
  328. //权限验证
  329. $paper = ExamPaper::where('id',$paperid)->find();
  330. // if (!$paper) return json(['code' => 1, 'msg' => '试卷错误']);
  331. // if ($paper->checkway == 'employee') return json(['code' => 1, 'msg' => '人工批改试卷,无法系统批改']);
  332. $w = [];
  333. $w[] = ['paper_id','=',$paperid];
  334. $w[] = ['employee_id','=',$employee_id];
  335. $w[] = ['root_id','=',$token['root_org']];
  336. $w[] = ['from','=',1];
  337. $empresult = ExamEmpResult::where($w)->with(['employee'])->find();
  338. // if(!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']);
  339. // // if($empresult->approve_status==2) return json(['code' => 1, 'msg' => '已经批改完成']);
  340. $emp_answer_arr = [];
  341. $emp_answer_json = $empresult->answer;
  342. if ($emp_answer_json) {
  343. $emp_answer_arr = json_decode($emp_answer_json, true);
  344. }
  345. $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray();
  346. $paperInfo['got_total_score'] = 0;
  347. $options = [];
  348. $json = [];
  349. $str = [];
  350. foreach ($paperInfo['questions'] as &$item) {
  351. $item['ask'] = str_replace('\\','',$item['ask']);
  352. //填写的答案
  353. $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : '';
  354. //系统评分
  355. $item['got_score'] = $this->fraction($item['emp_answer'],$item['answer'],$item['type'],(int)$item['pivot']['score'],$empresult->id,$item['id']);
  356. $json[$item['id']] = $item['got_score'];
  357. //1正确,0错误
  358. $item['c_type'] = $item['got_score']>0 ? 1 : 0;
  359. //选择题
  360. if ($item['type']=='单选' || $item['type']=='多选') {
  361. $con = json_decode($item['content'],true);
  362. $op = [];
  363. foreach ($con as $v21) {
  364. $op[$v21['title']] = $v21['content'];
  365. }
  366. $item['content'] = $op;
  367. }
  368. //得分总和
  369. $paperInfo['got_total_score'] += (int)$item['got_score'];
  370. }
  371. $u['final_score'] = $paperInfo['got_total_score'];
  372. $u['approve_status'] = 2;
  373. $u['aprove_time'] = date('Y-m-d H:i:s');
  374. $u['data'] = json_encode($json);
  375. $uw[] = ['id','=',$empresult->id];
  376. $uw[] = ['from','=',1];
  377. ExamEmpResult::where($uw)->update($u);
  378. // return json(['code' => 0, 'data' =>'批改成功','msg' => '批改成功']);
  379. //
  380. //
  381. if ($data['base_score'] > $u['final_score']) {
  382. return 1;//不及格
  383. }else{
  384. return 2;//及格
  385. }
  386. }
  387. //计算分数
  388. public function fraction($emp_answer,$answer,$type,$score=0,$requestid=0,$questionsid=0){
  389. $emp_score = 0;
  390. if (!$emp_answer) return $emp_score;
  391. if ($type=='判断') {
  392. if (trim($answer)==trim($emp_answer)) {
  393. $emp_score = $score;
  394. }
  395. }elseif ($type=='单选') {
  396. if ($answer==$emp_answer) {
  397. $emp_score = $score;
  398. }
  399. }elseif ($type=='多选') {
  400. $answer = explode(',',$answer);
  401. $emp_answer = explode(',',$emp_answer);
  402. sort($answer);
  403. sort($emp_answer);
  404. if (implode(',',$answer)==implode(',',$emp_answer)) {
  405. $emp_score = $score;
  406. }else{
  407. $danf = $score/count($answer);
  408. $i = 0;
  409. foreach ($emp_answer as $k => $v) {
  410. if (in_array($v,$answer)) {
  411. $i+=1;
  412. }else{
  413. $i = 0;
  414. break;
  415. }
  416. }
  417. $emp_score = $i*$danf;
  418. }
  419. }elseif ($type=='简答' || $type=='问答') {
  420. $emp_score = $answer = ExamEmpResult::autoPaperAnswerCheck($emp_answer,$answer,$score);
  421. $emp_score = $emp_score['got_score'];
  422. $emp_answer = $answer['emp_answer'];
  423. if ($requestid && $questionsid) {
  424. $tw[] = ['id','=',$requestid];
  425. $tw[] = ['from','=',0];
  426. $json = ExamEmpResult::where($tw)->value('answer');
  427. $json = json_decode($json,true);
  428. if (isset($json[$questionsid])) {
  429. $json[$questionsid] = $emp_answer;
  430. ExamEmpResult::where($tw)->update(['answer'=>json_encode($json)]);
  431. }
  432. }
  433. }
  434. return $emp_score;
  435. }
  436. //approve
  437. public function approve()
  438. {
  439. $token = $this->request->token;
  440. // $param = Request::only('id');
  441. $w[] = ['employee_id','=',$token['employee_id']];
  442. $w[] = ['root_id','=',$token['root_org']];
  443. $w[] = ['now','=',1];
  444. $info = CampEmployee::where($w)->find();
  445. if (!$info || $info->approve == 1) {
  446. return json(['code'=>1 , 'data'=>'重复申请' , 'msg'=>'重复申请']);
  447. }
  448. $u['approve'] = 1;
  449. $u['approve_time'] = date('Y-m-d H:i:s',time());
  450. $info = CampEmployee::where($w)->update($u);
  451. return json(['code'=>0 , 'data'=>'申请成功' , 'msg'=>'申请成功']);
  452. }
  453. }