123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873 |
- <?php
- namespace app\api\controller;
- use app\model\TrainChapterCourse;
- use app\model\TrainClass;
- use app\model\TrainClassChapter;
- use app\model\TrainClassView;
- use app\model\TrainCourse;
- use app\model\TrainDoneLog;
- use app\model\TrainSumup;
- use app\model\TrainThumbLog;
- use app\model\Employee;
- use think\facade\Db;
- use app\model\Org;
- use app\model\Company;
- use app\model\User;
- use think\facade\Console;
- use app\model\TrainCourseView;
- use app\model\TrainClassCate;
- use app\model\TrainCouresStudytime;
- use app\model\CreditsSetting;
- use app\model\TrainCredits;
- use app\model\TrainStudylog;
- use app\model\CustomerVisitLog;
- use app\model\PreformanceTasks;
- use app\model\PreformanceTasksOrg;
- class Train extends Base
- {
- /**
- * 新课程推荐
- */
- public function new()
- {
- $condition = [
- 'root_id' => $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]);
- }
- }
|