$this->request->token['root_org'], 'del' => 0, 'publish' => 1, 'from_type' => 0 ]; $cate = input('cate', ''); if ($cate) $condition['cate'] = $cate; $eid = $this->request->token['employee_id']; $data = TrainClass::field('id,title,cover,view')->whereRaw("FIND_IN_SET(" . $eid . " , train_employee)")->where($condition)->order('view desc')->limit(4)->select()->toArray(); return json(['code' => 0, 'data' => $data]); } /** * 培训课程列表from_type=3查询0,2 * from_type:0自建,1集团指派,2店面共享 */ public function trainClassList($page, $from_type = 0) { $condition = [ ['root_id', '=', $this->request->token['root_org']], ['del', '=', 0], ['publish', '=', 1] ]; $condition[] = $from_type == 3 ? ['from_type', 'in', [0, 2]] : ['from_type', '=', $from_type]; $cate = input('cate', ''); if ($cate) $condition[] = ['cate', '=', $cate]; $label = input('label', ''); if ($label) $condition[] = ['label', '=', $label]; $keyword = input('keyword', ''); if ($keyword) $condition[] = ['title', 'like', '%' . trim($keyword) . '%']; $eid = $this->request->token['employee_id']; $sql = TrainClass::field('id,title,cover,course_id,category,view,train_employee,addtime,type'); //集团指派课程全员展示 if ($from_type != 1) { $sql->where(function ($query) use ($eid) { $query->whereRaw("FIND_IN_SET(" . $eid . " , train_employee)") ->whereOr('train_employee', '=', ''); }); } $data = $sql->where($condition)->page($page, 10)->order('addtime desc')->select()->toArray(); $column_class_id = array_column($data, 'id'); $doneLog = TrainDoneLog::where([['from', '=', 0], ['class_id', 'in', $column_class_id], ['root_id', '=', $this->request->token['root_org']], ['done_percent', '>', 0]])->group('class_id')->column('count(class_id)', 'class_id'); //查询最近完成人的头像取6个 $res = TrainDoneLog::with(['employee'])->where([['from', '=', 0], ['class_id', 'in', $column_class_id], ['root_id', '=', $this->request->token['root_org']], ['done_percent', '=', 100]])->order('addtime desc')->select()->toArray(); $uid = array_column($res, 'uid'); $user = User::where('id', 'in', $uid)->column('headimgurl', 'id'); $headimgurl = []; foreach ($res as &$r) { $headimgurl[$r['class_id']][] = isset($user[$r['uid']]) ? $user[$r['uid']] : ''; } // 查询课程多少人参与,课程章节数 foreach ($data as &$item) { $item['train_employee_count'] = count(explode(',', $item['train_employee'])); $item['course_num'] = empty($item['course_id']) ? 0 : count(explode(',', $item['course_id'])); $item['done_log_num'] = isset($doneLog[$item['id']]) ? $doneLog[$item['id']] : 0; $item['done_log_num'] = $item['view'] >= $item['train_employee_count'] ? $item['train_employee_count'] : $item['view']; //学习人数太少先用浏览量展示 $item['headimgurl'] = isset($headimgurl[$item['id']]) ? $headimgurl[$item['id']] : []; } return json(['code' => 0, 'data' => $data]); } /** * 课程内容详情 */ public function classDetail($class_id) { $token = $this->request->token; $from = input('from', 0) ? 1 : 0; $data = TrainClass::where([['id', '=', $class_id], ['root_id', '=', $token['root_org']], ['del', '=', 0], ['publish', '=', 1]])->field('id,title,cover,des,course_id,type,category,train_employee,addtime,from_type,from_root_id')->find(); if (empty($data)) return json(['code' => 0, 'data' => []]); $data['course_num'] = empty($data['course_id']) ? 0 : count(explode(',', $data['course_id'])); $data['done_log_num'] = TrainDoneLog::where([['from', '=', $from], ['class_id', '=', $data['id']], ['root_id', '=', $token['root_org']], ['done_percent', '>', 0]])->count(); //课程是否完成 $myDoneLog = TrainDoneLog::where([['from', '=', $from], ['employee_id', '=', $token['employee_id']], ['class_id', '=', $data['id']], ['root_id', '=', $token['root_org']]])->find(); if ($myDoneLog) { $data['is_success_class'] = $myDoneLog->done_percent == 100 ? true : false; //是否全部完成 $data['is_course_num'] = $myDoneLog->course_id ? count(explode(',', $myDoneLog->course_id)) : 0; //完成课件数量 } else { $data['is_success_class'] = false; //是否全部完成 $data['is_course_num'] = 0; //完成课件数量 } // $data['is_success_class'] = empty($myDoneLog) ? false : true; $data['train_employee_num'] = $data->from_type = 1 ? '全员' : ($data->train_employee ? count(explode(',', $data->train_employee)) : 0); //学习总人数 //全部完成人员信息 $myDoneLog = TrainDoneLog::where([['from', '=', $from], ['class_id', '=', $data['id']], ['root_id', '=', $token['root_org']], ['done_percent', '=', 100]])->column('employee_id'); $tw[] = ['id', 'in', $myDoneLog]; $data['train_employee_info'] = Employee::with('userImg')->where($tw)->visible(['name', 'img'])->select()->toArray(); // $data['train_employee_info_count'] = count($data['train_employee_info']); //课程来源 if ($data['from_type'] == 0) { $data['from'] = '店面发布'; } elseif ($data['from_type'] == 1) { $data['from'] = '集团指派'; } else { $company = Company::where('root_id', $data['from_root_id'])->value('company_name'); $data['from'] = '集团从' . $company . '共享'; } //浏览量+1 // $rand = mt_rand(1,10); $view = input('view', '', 'trim'); if ($view) { TrainClass::where('id', $class_id)->inc('view', 1)->update(); } return json(['code' => 0, 'data' => $data]); } /** * 课程课件列表 */ public function trainCourseList($page, $class_id) { $from = input('from', 0) ? 1 : 0; $class = TrainClass::where(['id' => $class_id, 'root_id' => $this->request->token['root_org'], 'publish' => 1, 'del' => 0])->field('course_id,type')->find(); if (empty($class)) return json(['code' => 0, 'data' => []]); $data = TrainCourse::field('id,title,type')->where([['id', 'in', $class['course_id']], ['root_id', '=', $this->request->token['root_org']]])->page($page, 20)->select()->toArray(); $employee_id = $this->request->token['employee_id']; $doneLog = TrainDoneLog::where(['employee_id' => $employee_id, 'from' => $from, 'class_id' => $class_id, 'root_id' => $this->request->token['root_org']])->value('course_id'); // 查询课件完成情况 foreach ($data as &$item) { $doneLogArr = explode(',', $doneLog); $item['done_state'] = empty($doneLog) ? false : (in_array($item['id'], $doneLogArr) ? true : false); } return json(['code' => 0, 'data' => $data]); } /* * 课程观看感、课件读后感 */ public function watch_feel($page, $class_id, $course_id) { $course_id = empty($course_id) ? 0 : $course_id; $sumup = TrainSumup::with(['employee', 'user'])->where([['course_id', '=', $course_id], ['class_id', '=', $class_id], ['root_id', '=', $this->request->token['root_org']]])->page($page, 10)->order('addtime des')->select()->toArray(); $column_sumup_id = array_column($sumup, 'id'); $employee_id = $this->request->token['employee_id']; $log = TrainThumbLog::where([['sumup_id', 'in', $column_sumup_id], ['employee_id', '=', $employee_id], ['root_id', '=', $this->request->token['root_org']]])->column('id', 'sumup_id'); $class = TrainClass::where('id', $class_id)->field('sumup_keyword,sumup_score')->find(); foreach ($sumup as &$item) { $item['score'] = TrainSumup::sumup_score_num($class['sumup_keyword'], $class['sumup_score'], $item['content']); $item['thumblog'] = isset($log[$item['id']]) ? true : false; $item['addtime'] = $this->date_switch($item['addtime']); } $count = TrainSumup::where([['course_id', '=', $course_id], ['class_id', '=', $class_id], ['root_id', '=', $this->request->token['root_org']]])->count(); return json(['code' => 0, 'data' => $sumup, 'count' => $count]); } /* * 根据时间计算距离现在多久 */ private function date_switch($time) { $now = time(); $old = strtotime(date($time)); $dur = $now - $old; if ($dur <= 0) { return $time; } elseif ($dur < 60) { return $dur . '秒前'; } elseif ($dur < 3600) { return floor($dur / 60) . '分钟前'; } elseif ($dur < 86400) { return floor($dur / 3600) . '小时前'; } elseif ($dur < 2678400) { return floor($dur / 86400) . '天前'; } elseif ($dur < 2678400 * 12) { return floor($dur / 2678400) . '月前'; } else { return floor($dur / 2678400 / 12) . '年前'; } } /** * 课件内容详情 */ public function courseDetail($course_id) { $token = $this->request->token; $class_id = input('class_id', 0); //所属课程id $data = TrainCourse::where(['id' => $course_id, 'root_id' => $token['root_org']])->find()->toArray(); //评论内容 $data['comment'] = 0; $w[] = ['class_id', '=', $class_id]; $w[] = ['course_id', '=', $course_id]; $w[] = ['root_id', '=', $token['root_org']]; $data['comment_count'] = TrainSumup::with('employee')->where($w)->count(); //学习总人数 $tw[] = ['root_id', '=', $token['root_org']]; $tw[] = ['id', '=', $class_id]; //如果是集团指派的课程查询全部人员 $class = TrainClass::where($tw)->whereRaw("FIND_IN_SET(" . $course_id . " , course_id)")->field('train_employee,from_type')->find(); if (empty($class['train_employee'])) { $data['train_count'] = Employee::where([['root_id', '=', $token['root_org']], ['uid', '>', 0], ['state', '=', '在职']])->count(); } else { $data['train_count'] = count(array_filter(array_unique(explode(',', $class['train_employee'])))); } //学习完成人数 $dw = [['from', '=', 0], ['root_id', '=', $token['root_org']], ['class_id', '=', $class_id]]; $data['complete_count'] = TrainDoneLog::where($dw)->whereRaw("FIND_IN_SET(" . $course_id . " , course_id)")->group('employee_id')->count(); //未学习人数 $data['no_count'] = $data['train_count'] - $data['complete_count'] > 0 ? $data['train_count'] - $data['complete_count'] : 0; $data['page_num'] = 0; //pdf 页数 if ($data['type'] == 'pdf') { $data['page_num'] = $data['file'] ? $this->getPageTotal($data['file']) : 0; } return json(['code' => 0, 'data' => $data]); } /** * 获取PDF的页数 */ public function getPageTotal($path) { // 打开文件 if (!$fp = @fopen($path, "r")) { $error = "打开文件{$path}失败"; return 0; } else { $max = 0; while (!feof($fp)) { $line = fgets($fp, 255); if (preg_match('/\/Count [0-9]+/', $line, $matches)) { preg_match('/[0-9]+/', $matches[0], $matches2); if ($max < $matches2[0]) $max = $matches2[0]; } } fclose($fp); // 返回页数 return $max; } } /** * 课件浏览详情+1 */ public function coureseView($course_id, $time = 0) { $token = $this->request->token; $save['con_id'] = $course_id; $save['time'] = $time; $save['root_id'] = $token['root_org']; $save['employee_id'] = $token['employee_id']; $save['uid'] = $token['uid']; $save['org_id'] = $token['org_id']; $save['type'] = 'traincourse'; TrainCourseView::insertGetId($save); TrainCourse::where(['id' => $course_id, 'root_id' => $token['root_org']])->inc('view')->update(); return json(['code' => 0, 'data' => '成功浏览']); } /** * 课程浏览 +1 */ public function classView() { $class_id = input('class_id', '', 'intval'); $course_id = input('course_id', '', 'intval'); $time = input('time', 0, 'intval'); $token = $this->request->token; $save['course_id'] = $course_id; $save['class_id'] = $class_id; $save['time'] = $time; $save['root_id'] = $token['root_org']; $save['employee_id'] = $token['employee_id']; $save['uid'] = $token['uid']; $save['org_id'] = $token['org_id']; $save['type'] = 'traincourse'; TrainClassView::insertGetId($save); TrainCourse::where(['id' => $course_id, 'root_id' => $token['root_org']])->inc('view')->update(); return json(['code' => 0, 'data' => '成功浏览']); } //全部完成课程人员列表 public function all_complete() { $token = $this->request->token; $class_id = input('class_id', 0); //所属课程id $keyword = input('keyword', 0); $org_id = input('org_id', 0); $page = input('page', 1); $limit = input('limit', 10); $start = input('start_date', ''); $end = input('end_date', ''); $w = []; if ($keyword) { $w[] = ['employee.name', 'like', '%' . $keyword . '%']; } if ($org_id) { $org_id = explode(',', $org_id); $w[] = ['employee.org_id', 'in', $org_id]; } if ($start) { $w[] = ['train_done_log.addtime', '>=', $start . ' 00:00:00']; } if ($end) { $w[] = ['train_done_log.addtime', '<=', $end . ' 23:59:59']; } $w[] = ['class_id', '=', $class_id]; $w[] = ['train_done_log.root_id', '=', $token['root_org']]; $w[] = ['done_percent', '=', 100]; $w[] = ['from', '=', 0]; $myDoneLog = TrainDoneLog::withJoin('employee')->where($w)->visible(['employee_id', 'addtime'])->order('id desc')->page($page, $limit)->select()->toArray(); $eids = $myDoneLog ? array_column($myDoneLog, 'employee_id') : []; $ew[] = ['id', 'in', $eids]; $employee = Employee::with(['userImg', 'orgName'])->where($ew)->visible(['name', 'img', 'id', 'org_name', 'org_id'])->select()->toArray(); foreach ($myDoneLog as $k => $v) { $myDoneLog[$k]['addtime'] = $v['addtime'] = $this->date_switch($v['addtime']); foreach ($employee as $k2 => $v2) { if ($v['employee_id'] == $v2['id']) { $myDoneLog[$k] = array_merge($v, $v2); unset($myDoneLog[$k]['employee']); break; } } if (isset($myDoneLog[$k]['employee'])) { $myDoneLog[$k]['name'] = $myDoneLog[$k]['img'] = $myDoneLog[$k]['org_name'] = ''; $myDoneLog[$k]['id'] = $myDoneLog[$k]['org_id'] = 0; } } return json(['code' => 0, 'data' => $myDoneLog]); } //部门列表 public function all_org() { $token = $this->request->token; $res = Org::where([['path', 'like', $token['root_org'] . '-%'], ['status', '=', 1]])->field('id,name,pid')->select()->toArray(); $res = $this->tree($res, 0, []); return json(['code' => 0, 'data' => $res]); } //部门人员树 public function tree($data, $pid = 0, $persons) { $new_arr = []; foreach ($data as $k => $v) { if ($v['pid'] == $pid) { $persions = isset($persons[$v['id']]) ? $persons[$v['id']] : []; $children = $this->tree($data, $v['id'], $persons); $v['children'] = array_merge_recursive($children, $persions); if (empty($v['children'])) $v['disabled'] = true; $new_arr[] = $v; } } return $new_arr; } /* * 员工完成课件 */ public function doneLogging() { $token = $this->request->token; $param = request()->param(['course_id', 'class_id', 'study_time']); $employee_id = $this->request->token['employee_id']; $root_id = $this->request->token['root_org']; $from = input('from', 0); //查询课件是否存在 $class = TrainClass::where(['root_id' => $root_id, 'del' => 0, 'publish' => 1, 'id' => $param['class_id']])->find(); $c = explode(',', $class['course_id']); if (empty($class) || !in_array($param['course_id'], $c)) { return json(['code' => 1, 'msg' => '课件内容不存在']); } //判断是否已完成该课件 $doneLog = TrainDoneLog::where(['employee_id' => $employee_id, 'from' => $from, 'root_id' => $root_id, 'class_id' => $param['class_id']])->find(); $log_course_id = !empty($doneLog['course_id']) ? explode(',', $doneLog['course_id']) : []; if (!empty($doneLog) && !empty($doneLog['done_percent']) && in_array($param['course_id'], $log_course_id)) { return json(['code' => 1, 'msg' => '该课件已完成,无需重复操作']); } //判断是否设置课件评论字数 $comment_word_num = TrainCourse::where(['root_id' => $root_id, 'id' => $param['course_id']])->value('comment_word_num'); if ($comment_word_num > 0) { $where[] = ['employee_id', '=', $employee_id]; $where[] = ['course_id', '=', $param['course_id']]; $where[] = ['class_id', '=', $param['class_id']]; $where[] = ['', 'EXP', Db::raw('char_length(content) >= ' . $comment_word_num . '')]; $sumupcount = TrainSumup::where($where)->count(); if ($sumupcount == 0) return json(['code' => 1, 'msg' => '课件评论字数不达标']); } $course_id = explode(',', $class['course_id']); if (!empty($doneLog)) { $have = explode(',', $doneLog['course_id']); $checkCourse = [$param['course_id']]; $newCourseArr = array_filter(array_merge($have, $checkCourse)); $GDP = floor((count($newCourseArr) / count($course_id)) * 100); $doneLog->done_percent = $GDP; $doneLog->course_id = implode(',', $newCourseArr); if ($doneLog->save()) { if ($GDP == 100) { //累计勋章 Console::call('medal', ['class', (string)$employee_id, (string)$root_id]); //增加课程完成赠送学分 $this->add_studylog($employee_id, $class, $root_id); } //完成单个课件增加学习时长 if (!empty($param['study_time'])) { $this->add_studytime($employee_id, $param['class_id'], $param['course_id'], $param['study_time'], $root_id); } return json(['code' => 0, 'msg' => '完成本节学习']); } else { return json(['code' => 1, 'msg' => '未能完成本节学习']); } } else { $GDP = floor((1 / count($course_id)) * 100); if (TrainDoneLog::insert([ 'employee_id' => $employee_id, 'root_id' => $root_id, 'org_id' => $token['org_id'], 'class_id' => $param['class_id'], 'done_percent' => $GDP, 'course_id' => $param['course_id'], 'from' => $from ])) { if ($GDP == 100) { //累计勋章 Console::call('medal', ['class', (string)$employee_id, (string)$root_id]); //增加课程完成赠送学分 $this->add_studylog($employee_id, $class, $root_id); } //完成单个课件增加学习时长 if (!empty($param['study_time'])) { $this->add_studytime($employee_id, $param['class_id'], $param['course_id'], $param['study_time'], $root_id); } return json(['code' => 0, 'msg' => '完成本节学习']); } else { return json(['code' => 1, 'msg' => '未能完成本节学习']); } } } //增加课程的学习完成记录 public function add_studylog($employee_id, $class, $root_id) { if (empty($class['credit'])) return; //如果没有设置学分直接返回 $maxcredit = $this->sumday_credit($root_id, $employee_id); $you = TrainCredits::where([['employee_id', '=', $employee_id], ['root_id', '=', $root_id]])->order('id desc')->find(); if (empty($maxcredit) || $maxcredit['status'] == 1 || ($maxcredit['status'] == 0 && $maxcredit['yes_course'] > $class['credit'])) { $add = ['employee_id' => $employee_id, 'root_id' => $root_id, 'type' => 2, 'credits' => $class['credit'], 'now_credits' => $class['credit']]; if (!empty($you)) { $add['now_credits'] = $you['now_credits'] + $class['credit']; } } if (!empty($maxcredit) && $maxcredit['status'] != 1 && $maxcredit['yes_course'] != 0 && $maxcredit['yes_course'] < $class['credit']) { $add = ['employee_id' => $employee_id, 'root_id' => $root_id, 'type' => 2, 'credits' => $maxcredit['yes_course'], 'now_credits' => $maxcredit['yes_course'] + (!empty($you['now_credits']) ? $you['now_credits'] : 0)]; } if (!empty($add)) { $this->add_credit($add); } } //增加课程的学习时间 public function add_studytime($employee_id, $class_id, $course_id, $study_time, $root_id) { $where[] = ['code', '=', 'studytime_credit']; $where[] = ['root_id', '=', $root_id]; $time_study = CreditsSetting::where($where)->field('status,value')->find(); if (empty($time_study)) return; //如果没有设置学习时长直接返回; if ($time_study['status'] == 0) { $add = ['empid' => $employee_id, 'classid' => $class_id, 'course_id' => $course_id, 'study_time' => $study_time, 'all_time' => $study_time, 'type' => 1]; $you = TrainCouresStudytime::where([['empid', '=', $employee_id]])->order('id desc')->find(); if (!empty($you)) { $add['all_time'] = $you['all_time'] + $study_time; } TrainCouresStudytime::insert($add); $this->call_studytime($employee_id); //增加完学习时长直接开始计算是否送学分 } } //统计当天获得的总学分 public function sumday_credit($root_id, $employee_id) { $where3[] = ['code', '=', 'studyday_maxcredit']; $where3[] = ['root_id', '=', $root_id]; $maxcredit = CreditsSetting::where($where3)->field('status,value')->find(); //->findOrEmpty(); if (!empty($maxcredit) && $maxcredit['status'] == 0) { $day_course = TrainCredits::where([['employee_id', '=', $employee_id], ['root_id', '=', $root_id], ['addtime', '>=', date('Y-m-d') . ' 00:00:00'], ['addtime', '<=', date('Y-m-d') . ' 23:59:59']])->sum('credits'); $yes_course = $maxcredit['value'] - $day_course; $maxcredit['yes_course'] = $yes_course; } return $maxcredit; } //计算学习时长送学分 public function call_studytime($employee_id) { $token = $this->request->token; $maxcredit = $this->sumday_credit($token['root_org'], $token['employee_id']); $all_time = TrainCouresStudytime::where('empid', $employee_id)->order('id desc')->value('all_time'); $where[] = ['code', '=', 'studytime_credit']; $where[] = ['root_id', '=', $token['root_org']]; $time_study = CreditsSetting::where($where)->field('status,value')->find(); if (empty($time_study)) return; //如果没有设置学习时长直接返回 $time_study['value'] = !empty($time_study['value']) ? json_decode($time_study['value'], true) : ['numtime' => 0, 'time_credit' => 0]; if ($time_study['status'] == 0 && $time_study['value']['numtime'] > 0 && $all_time >= $time_study['value']['numtime'] * 60) { $b = floor($all_time / ($time_study['value']['numtime'] * 60)); $credits = $b * $time_study['value']['time_credit']; $reduce_time = $b * ($time_study['value']['numtime'] * 60); $you = TrainCredits::where([['employee_id', '=', $token['employee_id']], ['root_id', '=', $token['root_org']]])->order('id desc')->find(); //正常情况所得学分不大于当天可获得最高学分 if (empty($maxcredit) || $maxcredit['status'] == 1 || ($maxcredit['status'] == 0 && $maxcredit['yes_course'] > $credits)) { $add = ['employee_id' => $token['employee_id'], 'root_id' => $token['root_org'], 'type' => 1, 'credits' => $credits, 'now_credits' => $credits]; if (!empty($you)) { $add['now_credits'] = $you['now_credits'] + $credits; } $this->add_credit($add); $newadd = ['empid' => $token['employee_id'], 'study_time' => $reduce_time, 'all_time' => $all_time - $reduce_time, 'type' => 2]; $newadd['all_time'] = $newadd['all_time'] > 0 ? $newadd['all_time'] : 0; TrainCouresStudytime::insert($newadd); } //所得学分大于当天剩余可得学分时取差值补满当天最高学分 if (!empty($maxcredit) && $maxcredit['status'] == 0 && $maxcredit['yes_course'] != 0 && $maxcredit['yes_course'] < $credits) { $add = ['employee_id' => $token['employee_id'], 'root_id' => $token['root_org'], 'type' => 1, 'credits' => $maxcredit['yes_course'], 'now_credits' => $maxcredit['yes_course'] + (!empty($you['now_credits']) ? $you['now_credits'] : 0)]; $this->add_credit($add); $newadd = ['empid' => $token['employee_id'], 'study_time' => $reduce_time, 'all_time' => 0, 'type' => 2]; TrainCouresStudytime::insert($newadd); } // if($maxcredit['status']!=1 && $maxcredit['yes_course'] < $credits){ // $newadd=['empid'=>$token['employee_id'],'study_time'=>$reduce_time,'all_time'=>0,'type'=>2]; // TrainCouresStudytime::insert($newadd); // } } } //计算提交感悟送学分 public function feeling_credits($root_id, $employee_id) { $maxcredit = $this->sumday_credit($root_id, $employee_id); $where[] = ['code', '=', 'studyfeeling_credit']; $where[] = ['root_id', '=', $root_id]; $studyfeeling = CreditsSetting::where($where)->field('status,value')->find(); if (empty($studyfeeling)) return; //如果没有设置感悟送学分直接返回 $you = TrainCredits::where([['employee_id', '=', $employee_id], ['root_id', '=', $root_id]])->order('id desc')->find(); if ($studyfeeling['status'] == 0 && $studyfeeling['value'] > 0) { if (empty($maxcredit) || $maxcredit['status'] == 1 || ($maxcredit['status'] != 1 && $maxcredit['yes_course'] > $studyfeeling['value'])) { $add = ['employee_id' => $employee_id, 'root_id' => $root_id, 'type' => 3, 'credits' => $studyfeeling['value'], 'now_credits' => $studyfeeling['value']]; if (!empty($you)) { $add['now_credits'] = $you['now_credits'] + $studyfeeling['value']; } $this->add_credit($add); } if (!empty($maxcredit) && $maxcredit['status'] == 0 && $maxcredit['yes_course'] != 0 && $maxcredit['yes_course'] < $studyfeeling['value']) { $add = ['employee_id' => $employee_id, 'root_id' => $root_id, 'type' => 3, 'credits' => $maxcredit['yes_course'], 'now_credits' => $maxcredit['yes_course'] + (!empty($you['now_credits']) ? $you['now_credits'] : 0)]; $this->add_credit($add); } } } //赠送学分统一方法方便计划任务处理 public function add_credit($add) { $id = TrainCredits::insertGetId($add); $this->preformance_tasks($add['credits'], $id); } /** * 计算业绩任务 */ public function preformance_tasks($credit = 0, $vislog_id) { $token = $this->request->token; //防止后台切换部门 $token['org_id'] = Employee::where('id', $token['employee_id'])->value('org_id'); $time = date('Y-m-d H:i:s'); //查询进行中的指派到所属部门的所有进度 // $w[] = ['org_id','=',$token['org_id']]; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['start_date', '<=', $time]; $w[] = ['end_date', '>=', $time]; $w[] = ['is_credit', '=', 1]; $preformance_tasks = PreformanceTasks::where($w)->column('id'); $w1[] = ['root_id', '=', $token['root_org']]; $w1[] = ['org_id', '=', $token['org_id']]; $w1[] = ['performance_tasks_id', 'in', $preformance_tasks]; $w1[] = ['is_credit', '=', 1]; //指派到自己部门 $pid = PreformanceTasksOrg::where($w1)->group('performance_tasks_id')->column('*'); $w4[] = ['id', 'in', array_column($pid, 'performance_tasks_id')]; $model = PreformanceTasks::where($w4)->column('*'); foreach ($model as $k => $v) { $u = []; $u['ok_credit'] = $v['ok_credit'] + $credit; $u['customer_visit_log_id'] = $v['customer_visit_log_id'] ? $v['customer_visit_log_id'] . ',' . $vislog_id : $vislog_id; PreformanceTasks::where('id', $v['id'])->update($u); unset($u); } PreformanceTasksOrg::where($w1)->inc('ok_credit', (int)$credit)->update(); return 1; } /* * 课件完成操作 */ private function course_finish($trainClassCourseId, $doneLog, $paramCourseId, $paramClassId, $from = 0, $study_time = 0) { //课程绑定的课件 $course_id = explode(',', $trainClassCourseId); $class = TrainClass::find($paramClassId); if (!empty($doneLog)) { $have = explode(',', $doneLog['course_id']); $checkCourse = [$paramCourseId]; $newCourseArr = array_merge($have, $checkCourse); $GDP = floor((count($newCourseArr) / count($course_id)) * 100); $update = [ 'done_percent' => $GDP, 'course_id' => implode(',', $newCourseArr) ]; $res = TrainDoneLog::where([ 'from' => $from, 'employee_id' => $this->request->token['employee_id'], 'root_id' => $this->request->token['root_org'], 'class_id' => $paramClassId ])->update($update); if ($res) { if ($GDP == 100) { //累计勋章 $employee_id = $this->request->token['employee_id']; $root_id = $this->request->token['root_org']; Console::call('medal', ['class', (string)$employee_id, (string)$root_id]); //完成课程增加学分 $this->add_studylog($employee_id, $class, $root_id); } //完成单个课件增加学习时长 $this->add_studytime($this->request->token['employee_id'], $paramClassId, $paramCourseId, $study_time, $this->request->token['root_org']); return true; } else { return false; } } else { $GDP = floor((1 / count($course_id)) * 100); //第一次完成课件直接添加 if (TrainDoneLog::insert([ 'employee_id' => $this->request->token['employee_id'], 'root_id' => $this->request->token['root_org'], 'org_id' => $this->request->token['org_id'], 'class_id' => $paramClassId, 'done_percent' => $GDP, 'course_id' => $paramCourseId, 'from' => $from ])) { if ($GDP == 100) { //累计勋章 $employee_id = $this->request->token['employee_id']; $root_id = $this->request->token['root_org']; Console::call('medal', ['class', (string)$employee_id, (string)$root_id]); //完成课程增加学分 $this->add_studylog($employee_id, $class, $root_id); } //完成单个课件增加学习时长 $this->add_studytime($this->request->token['employee_id'], $paramClassId, $paramCourseId, $study_time, $this->request->token['root_org']); return true; } else { return false; } } } /* * 评论 */ public function commentAdd() { $param = request()->param(['class_id', 'course_id', 'content', 'read_status', 'from' => 0, 'study_time' => 0]); $data = [ 'user_id' => $this->request->token['uid'], 'root_id' => $this->request->token['root_org'], 'employee_id' => $this->request->token['employee_id'], 'org_id' => $this->request->token['org_id'], 'class_id' => $param['class_id'], 'course_id' => empty($param['course_id']) ? 0 : $param['course_id'], 'content' => $param['content'] ]; $TrainClass = TrainClass::where('id', $param['class_id'])->field('sumup_num,course_id')->find(); if (empty($param['course_id'])) { //课程评论验证字数是否达标 if (mb_strlen($param['content']) < $TrainClass['sumup_num']) return json(['code' => 1, 'msg' => '课程感悟不低于' . $TrainClass['sumup_num'] . '字数']); } if (!empty($param['course_id'])) { //查询课件评论字数限制 $comment_word_num = TrainCourse::where(['root_id' => $this->request->token['root_org'], 'id' => $param['course_id']])->value('comment_word_num'); if ($comment_word_num && mb_strlen($data['content']) < $comment_word_num) return json(['code' => 1, 'msg' => '课件评论不低于' . $comment_word_num . '字数']); //课件评论验证完成情况 if (isset($param['read_status']) && $param['read_status'] == true) { $doneLog = TrainDoneLog::where(['from' => $param['from'], 'employee_id' => $this->request->token['employee_id'], 'root_id' => $this->request->token['root_org'], 'class_id' => $param['class_id']])->find(); $log_course_id = !$doneLog ? [] : explode(',', $doneLog['course_id']); if (!in_array($param['course_id'], $log_course_id)) { //完成课件操作 $this->course_finish($TrainClass['course_id'], $doneLog, $param['course_id'], $param['class_id'], $param['from'], $param['study_time']); } } } if (TrainSumup::insert($data)) { //增加提交感悟送学分 if ($param['course_id'] == 0) { $this->feeling_credits($this->request->token['root_org'], $this->request->token['employee_id']); } return json(['code' => 0, 'msg' => '提交成功']); } else { return json(['code' => 1, 'msg' => '提交失败']); } } /** * 点赞 */ public function thumbing($sumup_id) { if (isset($sumup_id)) { $root_id = $this->request->token['root_org']; $employee_id = $this->request->token['employee_id']; $sumup = TrainSumup::where(['root_id' => $root_id, 'id' => $sumup_id])->find(); if (empty($sumup)) return json(['code' => 1, 'msg' => '内容不存在']); $log = TrainThumbLog::where([ ['sumup_id', '=', $sumup_id], ['employee_id', '=', $employee_id], ['root_id', '=', $root_id] ])->find(); if ($log) { TrainThumbLog::where(['sumup_id' => $sumup_id, 'employee_id' => $employee_id, 'root_id' => $root_id])->delete(); TrainSumup::where(['root_id' => $root_id, 'id' => $sumup_id])->dec('thumb')->update(); return json(['code' => 0, 'msg' => '取消点赞']); } else { TrainThumbLog::insert(['sumup_id' => $sumup_id, 'employee_id' => $employee_id, 'root_id' => $root_id]); TrainSumup::where(['root_id' => $root_id, 'id' => $sumup_id])->inc('thumb')->update(); return json(['code' => 0, 'msg' => '成功点赞']); } } else { return json(['code' => 1, 'msg' => '点赞失败']); } } /** * 获取课程培训分类 */ public function get_train_class_cate() { $token = $this->request->token; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['pid', '=', 0]; $list = TrainClassCate::where($w)->field('id,name')->order(['order' => 'asc', 'id' => 'desc'])->select(); return json(['code' => 0, 'data' => $list]); } /** * 获取课程培训标签 */ public function get_train_class_label() { $token = $this->request->token; $pid = input('pid', 0); $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['pid', '=', $pid]; $list = TrainClassCate::where($w)->field('id,name')->order('id asc')->select(); return json(['code' => 0, 'data' => $list]); } /* * 贡献值积分详情 */ public function credits_info() { $param = $this->request->only(['page', 'limit']); $token = $this->request->token; $where[] = ['root_id', '=', $token['root_org']]; $where[] = ['employee_id', '=', $token['employee_id']]; //当前学分 $val = TrainCredits::where($where) ->order('id desc')->value('now_credits'); $res['my_value'] = $val ? $val : 0; //贡献值排名 $ranking = TrainCredits::where([['root_id', '=', $token['root_org']]]) ->group('employee_id')->order('sum desc,id desc')->column('sum(credits) sum', 'employee_id'); if ($ranking) { $found_arr = array_keys($ranking); $key = array_search($token['employee_id'], $found_arr); $res['my_ranking'] = $key === false ? 0 : $key + 1; } else { $res['my_ranking'] = 0; } //详情0积分,1贡献值 $credits = TrainCredits::where($where)->order('id desc')->page($param['page'], $param['limit'])->select()->toArray(); foreach ($credits as $k => $v) { $val = []; if ($v['type'] == 1) { $credits[$k]['remark'] = '您学习到时规定时长,学分+' . $v['credits'] . '学分,当前学分总数:' . $v['now_credits']; } elseif ($v['type'] == 2) { $credits[$k]['remark'] = '课程学习完成+' . $v['credits'] . '学分,当前学分总数:' . $v['now_credits']; } elseif ($v['type'] == 3) { $credits[$k]['remark'] = '你评论一个感悟+' . $v['credits'] . '学分,当前学分总数:' . $v['now_credits']; } } $res['info'] = $credits; $res['info_count'] = TrainCredits::where($where)->count(); return json(['code' => 0, 'msg' => '获取成功', 'data' => $res]); } }