// +---------------------------------------------------------------------- declare (strict_types=1); namespace app\api\model; use app\common\library\helper; use app\common\model\Region; use app\common\model\School as SchoolModel; use think\facade\Cache; use think\facade\Db; /** * 学校模型类 * Class School * @package app\api\model */ class School extends SchoolModel { protected $globalScope = ['']; /** * 隐藏字段 * @var array */ protected $hidden = [ 'update_time' ]; /** * logo * @return string */ public function getLogoAttr($value): string { return $value? getPreview($value) : ''; } /** * 获取列表 * @param array $param 查询条件 * @param int $listRows 分页数量 * @return mixed|\think\model\Collection|\think\Paginator * @throws \think\db\exception\DbException */ public function getList(array $param = [], int $listRows = 15) { // 整理查询参数 $params = array_merge($param, ['audit_status' => 1]); // 获取商品列表 $list = parent::getList($params, $listRows); if ($list->isEmpty()) { return $list; } // 隐藏冗余的字段 $list->hidden(array_merge($this->hidden, ['albums'])); // 整理列表数据并返回 return $this->setListDataFromApi($list); } /** * 获取专业同类学校列表 * @param array $param 查询条件 * @param int $listRows 分页数量 * @return mixed|\think\model\Collection|\think\Paginator * @throws \think\db\exception\DbException */ public function getListBySpeciality(array $param = [], int $listRows = 15) { // 整理查询参数 $params = array_merge($param, ['audit_status' => 1]); // 获取商品列表 $list = parent::getList($params, $listRows); if ($list->isEmpty()) { return $list; } // 整理列表数据并返回 return $this->setListDataFromApi($list, $params); } /** * 设置展示的数据 api模块 * @param $info * @return mixed */ private function setListDataFromApi($info, $params=[]) { $specialityModel = new SchoolSpeciality; return $this->setListData($info, function ($data) use($specialityModel,$params) { $specialityName = isset($params['speciality_name'])? $params['speciality_name'] : ''; if($specialityName){ $data['speciality'] = $specialityModel->getDataByName($specialityName); }else{ $data['speciality'] = $specialityModel->getHots($data['id']); } // 整理数据 api模块 $this->setDataFromApi($data); // 隐藏冗余的字段 $this->hidden(array_merge($this->hidden, ['recruit_phone','post_code','index_url','albums','introduce','recruitment','characteristic','book_fields'])); }); } /** * 整理数据 api模块 * @param $info * @return mixed */ private function setDataFromApi($info) { return $this->setData($info, function ($data) { // logo封面 $data['logo'] = $data['logo']? getPreview($data['logo']) : ''; $data['labels'] = $data['labels']? explode(',', $data['labels']) : []; // 图片列表 $data['albums'] = helper::getArrayColumn($data['albums'], 'album_url'); // 地区 $data['province_name'] = $data['province_id']? Region::getNameById($data['province_id']) : ''; $data['city_name'] = $data['city_id']? Region::getNameById($data['city_id']) : ''; $data['region_name'] = $data['region_id']? Region::getNameById($data['region_id']) : ''; // 分类等级 $data['education_levels_text'] = isset($this->levelTypes[$data['education_levels']])? $this->levelTypes[$data['education_levels']] : '无'; // 距离 if(!is_null($data['distance'])){ $data['distance'] = $data['distance']? ($data['distance']<1000? "{$data['distance']}m" : ($data['distance']/1000).'km') :''; } // 浏览数 if(!is_null($data['views'])){ $data['views'] = $data['views']? ($data['views']<10000? "{$data['views']}" : round($data['views']/10000,1).'w') :''; } }); } /** * 获取选项列表 * @param array $param 查询条件 * @param int $listRows 分页数量 * @return mixed|\think\model\Collection|\think\Paginator * @throws \think\db\exception\DbException */ public function getOptionList(array $param = [], string $field='') { return $this->where(['audit_status'=> 1]) ->where(function ($query) use ($param){ $keyword = isset($param['keyword'])? trim($param['keyword']) : ''; if($keyword){ $query->where('school_name','like',"%{$keyword}%"); } }) ->field($field?:'id,school_name,type,level,hot_order') ->order('hot_order desc,views desc') ->select(); } /** * 获取学校信息 * @param $where * @param array $with * @return static|array|false|null */ public static function detail($where, array $with = []) { $filter = []; if (is_array($where)) { $filter = array_merge($filter, $where); } else { $filter['id'] = (int)$where; } $data = static::get($filter, $with); if($data['logo']){ $data['logo'] = getPreview($data['logo']); } if(is_int($where)){ self::setIncViews((int)$where); } return $data; } /** * 获取用户所属招生学校 * @param $userId * @param string $field * @return mixed */ public static function getUserSchool($userId, $field=''){ $model = new SchoolModel; return $model->userSchool($userId, $field??'id, school_name'); } /** * 获取对比学校数据 * @param $ids * @param int $listRows * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getComparisonList($ids, $listRows = 3) { $datas = Cache::get("caches:comparison:".md5(json_encode($ids))); if($datas){ return $datas; } $list = self::whereIn('id',$ids) ->where(['audit_status'=> 1]) ->field('school_name,logo,stablish_time,property,education_levels,type,level,area,students,city_id,region_id,views,labels') ->limit($listRows) ->order(Db::raw("field(id,".implode(',', $ids).")")) ->select(); $datas = []; $list = $list? $list->toArray() : []; if($list){ foreach ($list as $v){ $datas[0]['label'] = '基本信息'; $datas[0]['key'] = 'logo'; $datas[0]['list'][] = $v['logo']? getPreview($v['logo']) : ''; $datas[1]['label'] = '创办时间'; $datas[1]['key'] = 'stablish_time'; $datas[1]['list'][] = $v['stablish_time']; $datas[2]['label'] = '办学性质'; $datas[2]['key'] = 'property'; $datas[2]['list'][] = $v['property']; $datas[3]['label'] = '类型'; $datas[3]['key'] = 'type'; $datas[3]['list'][] = $v['type']; $datas[4]['label'][] = '级别'; $datas[4]['key'][] = 'education_levels'; $datas[4]['list'][] = $v['education_levels']? ($v['education_levels']==1? '中职':'高职'):''; $datas[5]['label'] = '星级'; $datas[5]['key'] = 'level'; $datas[5]['list'][] = $v['level']; $datas[6]['label'] = '占地'; $datas[6]['key'] = 'area'; $datas[6]['list'][] = $v['area']; $datas[7]['label'] = '在校生'; $datas[7]['key'] = 'students'; $datas[7]['list'][] = $v['students']; $cityName = $v['city_id']? Region::getNameById($v['city_id']) : ''; $regionName = $v['region_id']? Region::getNameById($v['region_id']) : ''; $datas[8]['label'] = '所在地'; $datas[8]['key'] = 'address'; $datas[8]['list'][] = "{$cityName}{$regionName}"; $datas[9]['label'] = '人气'; $datas[9]['key'] = 'views'; $datas[9]['list'][] = $v['views']? ($v['views']<10000? "{$v['views']}" : round($v['views']/10000,1).'w') :''; $datas[10]['label'] = '特色标签'; $datas[10]['key'] = 'labels'; $datas[10]['list'][] = $v['labels']? str_replace(',','、', $v['labels']) : ''; } $datas = array_values($datas); Cache::set("caches:comparison:".md5(json_encode($ids)), $datas, rand(10, 30)); } return $datas; } /** * 获取学校字段信息 * @param $schoolId * @param string $field * @return mixed */ public static function getSchoolField($schoolId, $field='school_name') { return self::where(['id'=>$schoolId])->value($field); } /** * 学校数量 * @return int */ public static function getTotal() { return self::where(['audit_status'=> 1])->count('id'); } }