* @version : HUOSDK 8.0 */ namespace huo\logic\game; use huo\controller\game\GameCache; use huo\model\common\CommonModel; use huo\model\game\CategoryModel; use huo\model\game\GamecategoryModel; use huo\model\game\GameextModel; use huo\model\game\GameModel; use huo\model\game\GameserverModel; use huo\model\game\GameversionModel; use huo\model\game\GiftModel; use huo\model\member\MemGameModel; use huolib\constant\CommonConst; use huolib\constant\GameConst; use huolib\status\GameStatus; use huolib\tool\Time; use think\db\exception\DataNotFoundException; use think\db\exception\ModelNotFoundException; use think\Exception; use think\exception\DbException; use think\Log; class GameLogic extends CommonModel { protected $base_field = [ 'id' => 'game_id', 'name' => 'gamename', 'icon' => 'icon', 'category' => 'type', 'tags' => 'tags', 'package_name' => 'package_name', 'publicity' => 'oneword', 'description' => 'desc', 'run_time' => 'runtime', 'classify' => 'classify', 'promote_switch' => 'promote_switch', 'hot_order' => 'hot_order', ]; /** * @param $app_id * * @return bool|mixed */ public function getCpPaybackUrl($app_id) { $_map['id'] = $app_id; $_cp_payback_url = GameModel::where($_map)->value('cp_url'); if (false === $_cp_payback_url) { return false; } return $_cp_payback_url; } /** * 获取玩家游戏列表 * * @param int $mem_id * @param int $from * @param string $page * * @return int|array */ public function getMemGameIDs($mem_id, $from, $page = '1,10') { $_map['mem_id'] = $mem_id; $_map['classify'] = $from; $_mg_model = new MemGameModel(); $_cnt = $_mg_model->with('game')->where($_map)->count('app_id'); if (empty($_cnt)) { return GameStatus::GAME_CNT_ZERO; } $_data = $_mg_model->with('game')->where($_map)->page($page)->column('app_id'); $_rdata['count'] = $_cnt; $_rdata['list'] = $_data; return $_rdata; } /** * 通过类型获取条件 * * @param int $server_type * * @return array */ public function getServerMapByType($server_type) { $_map = []; $_today_time = Time::today(); switch ($server_type) { case GameConst::GAME_SERVER_TODAY: $_map['start_time'] = ['between', $_today_time]; $_order = 'start_time asc'; break; case GameConst::GAME_SERVER_WILL: $_map['start_time'] = ['gt', time()]; $_order = 'start_time asc'; break; case GameConst::GAME_SERVER_OPENED: $_map['start_time'] = ['lt', time()]; $_order = 'start_time desc'; break; case GameConst::GAME_SERVER_TODAY_WILL: /* 默认今日以后 */ $_map['start_time'] = ['egt', $_today_time[0]]; $_order = 'start_time asc'; break; default: $_order = 'start_time desc'; } return [$_map, $_order]; } /** * 获取当个游戏开服列表 * * @param int $game_id 游戏ID * @param int $server_type 类型 * * @return array|false */ public function getGameServerList($game_id, $server_type) { list($_map, $_order) = $this->getServerMapByType($server_type); $_map['app_id'] = $game_id; $_field = 'id ser_id,app_id,start_time,ser_name,ser_desc,status'; $_datas = (new GameserverModel())->field($_field)->where($_map)->order($_order)->select(); if (is_object($_datas)) { $_datas = $_datas->toArray(); } return $_datas; } /** * @param int $server_type * @param $from * @param string $page * * @param int $game_id * * @return int|array */ public function getServerList($server_type, $from, $page = '1,10', $game_id = 0) { list($_map, $_order) = $this->getServerMapByType($server_type); if (!empty($game_id)) { $_map['app_id'] = $game_id; } if (!empty($from)) { $_map['classify'] = $this->getClassify($from); } $_map['gameserver_model.is_delete'] = CommonConst::CONST_NOT_DELETE; $_gs_model = new GameserverModel(); $_cnt = $_gs_model->with('game')->where($_map)->count('app_id'); if (empty($_cnt)) { return GameStatus::SERVER_CNT_ZERO; } $_field = 'app_id,start_time,ser_name,ser_desc'; $_data = $_gs_model->with('game')->field($_field)->where($_map)->page($page)->order($_order)->select(); if (is_object($_data)) { $_data = $_data->toArray(); } $_list = []; if (!empty($_data)) { foreach ($_data as $_k => $_v) { $_ser_data['ser_id'] = $_v['id']; $_ser_data['app_id'] = $_v['app_id']; $_ser_data['game_id'] = $_v['app_id']; $_ser_data['gamename'] = $_v['game']['name']; $_ser_data['icon'] = $_v['game']['icon']; $_ser_data['type'] = $_v['game']['category']; $_ser_data['tags'] = $_v['game']['tags']; $_ser_data['package_name'] = $_v['game']['package_name']; $_ser_data['oneword'] = $_v['game']['publicity']; $_ser_data['runtime'] = $_v['game']['run_time']; $_ser_data['start_time'] = $_v['start_time']; $_ser_data['ser_name'] = $_v['ser_name']; $_ser_data['ser_desc'] = $_v['ser_desc']; $_list[] = $_ser_data; } } $_rdata['count'] = $_cnt; $_rdata['list'] = $_list; return $_rdata; } /** * @param array $where * @param string $page * @param string $order * * @param array $field * * @return int| array */ public function getList($where = [], $page = '1,10', $order = '', $field = []) { $where['status'] = GameConst::GAME_STATUS_ON; if (isset($where['classify'])) { $where['classify'] = $this->getClassify($where['classify']); } $_game_model = new GameModel(); $_count = $_game_model->with('ext')->with('gv')->where($where)->count(); if (empty($_count)) { $_rdata['count'] = 0; $_rdata['list'] = []; return $_rdata; } $_field = $this->base_field; if (!empty($field)) { $_field = array_merge($_field, $field); } $_field['classify'] = 'classify_label'; $_field['promote_switch'] = 'promote_switch_label'; $_order = $this->orderFilter($order); try { $_games = $_game_model ->with('ext') ->with('gv') ->field($_field) ->where($where) ->order($_order) ->page($page) ->select(); if (is_object($_games)) { $_games = $_games->toArray(); } $_list = []; foreach ($_games as $_k => $_v) { $_data = []; $_data['game_id'] = $_v['game_id']; $_data['gamename'] = $_v['gamename']; $_data['icon'] = $_v['icon']; $_data['size'] = isset($_v['gv'][0]) ? $_v['gv'][0]['size'] : ''; $_data['type'] = $_v['type']; $_data['tags'] = $_v['tags']; $_data['down_cnt'] = $_v['ext']['down_cnt']; $_data['down_url'] = isset($_v['gv'][0]) ? $_v['gv'][0]['package_url'] : ''; $_data['version'] = isset($_v['gv'][0]) ? $_v['gv'][0]['version'] : ''; $_data['gift_cnt'] = 0; $_data['package_name'] = $_v['package_name']; $_data['oneword'] = $_v['oneword']; $_data['runtime'] = $_v['runtime']; $_data['classify'] = $_v['classify']; $_data['classify_label'] = $_v['classify_label']; $_data['promote_switch'] = $_v['promote_switch_label']; $_data['fine_image'] = isset($_v['ext_info']['fine_image']) ? $_v['ext_info']['fine_image'] : ''; /* 2018.08.02 合并字段 */ $_data['rate'] = 1; /* 2018.08.02 默认折扣为1 表示无折扣 */ $_data['is_bt'] = $_v['is_bt']; /* 2018.08.02 添加是否BT */ $_data['single_tag'] = $_v['single_tag']; /* 2018.08.02 BT单个标签 */ if (isset($_v['is_online'])) { $_data['is_online'] = $_v['is_online']; } if (isset($_v['list_order'])) { $_data['list_order'] = $_v['list_order']; } if (isset($_v['hot_order'])) { $_data['hot_order'] = $_v['hot_order']; } if (isset($_v['like_order'])) { $_data['like_order'] = $_v['like_order']; } if (isset($_v['status'])) { $_data['status'] = $_v['status']; } $_list[] = $_data; } if (empty($_games)) { $_list = null; } $_rdata['count'] = $_count; $_rdata['list'] = $_list; return $_rdata; } catch (DataNotFoundException $e) { return GameStatus::DATA_NOT_FOUND_EXCEPTION; } catch (ModelNotFoundException $e) { return GameStatus::MODEL_NOT_FOUND_EXCEPTION; } catch (DbException $e) { return GameStatus::DB_EXCEPTION; } } /** * @param $_cates * @param $page * @param $_order * * @return array|int */ public function getCateList($_cates, $page, $_order) { if (empty($_cates)) { return 2000; } // 设置id,ids if (!empty($_cates)) { $_ids = $this->strToArr($_cates); foreach ($_ids as $_k => $_v) { $_ids[$_k] = intval($_v); } } $_find_category = CategoryModel::whereIn('id', $_ids)->column('id'); if (empty($_find_category)) { return 2000; } $_app_ids = GamecategoryModel::whereIn('cate_id', $_find_category)->column('app_id'); $_map['id'] = ['in', $_app_ids]; $_param['page'] = $page; $_param['order'] = $_order; return $this->getList($_map, $page, $_order); } /** * 获取游戏类别筛选条件 * 3开头为android 4 开头为IOS 5 开头为H5 对应于game_class中的ID * * @param int $classify 传入的值 * * @return array|int */ public function getClassify($classify = 3) { $_classify = $classify; if (3 == substr($_classify, 0, 1)) { $_classify = [ ['eq', 3], ['between', [300, 399]], 'or' ]; } elseif (4 == substr($_classify, 0, 1) && 401 != $_classify) { $_classify = [ ['eq', 4], ['between', [400, 499]], 'or' ]; } return $_classify; } /** * 通过游戏ID 查询游戏信息 * * @param $app_id * * @return array|bool */ public function getInfoByAppId($app_id) { if (empty($app_id)) { return false; } $_map['id'] = $app_id; try { $_game_data = (new GameModel())->with('gv')->where($_map)->find(); if (is_object($_game_data)) { $_game_data = $_game_data->toArray(); } return $_game_data; } catch (DataNotFoundException $_e) { Log::write( "func=".__FUNCTION__."&class=".__CLASS__."&code=".GameStatus::DATA_NOT_FOUND_EXCEPTION."&Exception" .$_e->getMessage(), LOG::ERROR ); return false; } catch (ModelNotFoundException $_e) { Log::write( "func=".__FUNCTION__."&class=".__CLASS__."&code=".GameStatus::MODEL_NOT_FOUND_EXCEPTION."&Exception" .$_e->getMessage(), LOG::ERROR ); return false; } catch (DbException $_e) { Log::write( "func=".__FUNCTION__."&class=".__CLASS__."&code=".GameStatus::DB_EXCEPTION."&Exception" .$_e->getMessage(), LOG::ERROR ); return false; } catch (Exception $_e) { Log::write( "func=".__FUNCTION__."&class=".__CLASS__."&code=".GameStatus::INNER_ERROR."&Exception" .$_e->getMessage(), LOG::ERROR ); return false; } } /** * 获取游戏详情 * * @param array $where * @param string $field * * @return mixed */ public function getDetail($where, $field = '') { $_field = $this->base_field; $_game = (new GameModel())->with('ext')->with('gv')->field($_field)->where($where)->find(); if (empty($_game)) { return GameStatus::GAME_NOT_EXISTS; } $_data['game_id'] = $_game['game_id']; $_data['gamename'] = $_game['gamename']; $_data['icon'] = $_game['icon']; $_data['size'] = $_game['gv'][0]['size']; $_data['type'] = $_game['type']; $_data['tags'] = $_game['tags']; $_data['down_cnt'] = $_game['ext']['down_cnt']; $_data['star_cnt'] = $_game['ext']['star_cnt']; $_data['gift_cnt'] = $_game['ext']['real_gift_cnt']; $_data['down_url'] = $_game['gv'][0]['package_url']; $_data['url'] = $_game['gv'][0]['package_url']; $_data['gift_cnt'] = 0; $_data['package_name'] = $_game['package_name']; $_data['version'] = $_game['gv'][0]['version']; $_data['oneword'] = $_game['oneword']; $_data['desc'] = $_game['description']; $_data['runtime'] = $_game['runtime']; $_data['classify'] = $_game['classify']; $_data['hot_order'] = $_game['hot_order']; $_data['image'] = $this->getImages($_game['image']); /* 2018.08.02 合并字段 */ $_data['rebate_description'] = isset($_game['ext_info']['fine_image']) ? $_game['ext_info']['fine_image'] : ''; /* 2018.08.02 合并字段 */ $_data['vip_description '] = isset($_game['ext_info']['vip_description ']) ? $_game['ext_info']['vip_description '] : ''; return $_data; } public function getImages($value) { $_images = $value; if (!empty($_images)) { foreach ($_images as $_key => $_image) { $_images[$_key] = cmf_get_image_url($_image['url']); } } return $_images; } /** * 获取类型 * * @param array $where * @param string $page * @param string $order * * @return mixed */ public function getCategory($where = [], $page = '1,10', $order = '') { $_cate_model = new CategoryModel(); if (!empty($where['parent_id'])) { $_datas = $_cate_model->getList($where['parent_id'], $order); } else { $_datas = $_cate_model->getList(0, $order); } $_count = count($_datas); if (empty($_count)) { $_rdata['count'] = 0; $_rdata['list'] = []; } else { $_rdata['count'] = $_count; $_rdata['list'] = $_datas; } return $_rdata; } /** * 根据游戏获取礼包数量 * * @param int $app_id * * @return int|string */ public function getGiftCnt($app_id = 0) { $_map['remain_cnt'] = ['gt', 0]; $_map['end_time'] = ['gt', time()]; $_map['app_id'] = $app_id; $_cnt = GiftModel::where($_map)->count(); if (empty($_cnt)) { return 0; } return $_cnt; } /** * 获取游戏下载地址 * * @param int $app_id * * @return int|mixed|string */ public function getDownUrl($app_id = 0) { if (empty($app_id)) { return ''; } $_map['app_id'] = $app_id; $_gv = GameversionModel::get($_map); if (empty($_gv->package_url)) { return ''; } return $_gv->package_url; } /** * 获取游戏下载次数 * * @param int $app_id * * @return int|string */ public function getDownCnt($app_id = 0) { if (empty($app_id)) { return ''; } $_map['app_id'] = $app_id; $_cnt = GameextModel::where($_map)->value('down_cnt'); if (empty($_cnt)) { return 0; } return $_cnt; } /** * 获取版本key * * @param $app_id * @param $client_id * * @return bool */ public function getVersionKey($app_id, $client_id) { if (empty($app_id) || empty($client_id)) { return false; } $_map['app_id'] = $app_id; $_map['id'] = $client_id; $_version_key = (new GameversionModel())->getVersionKey($_map); if (empty($_version_key)) { return false; } return $_version_key; } /** * 获取游戏 id name 键值对 * * @param array $where * int $status 是否上线 * int $is_delete 是否删除 2 删除 * int $is_sdk 是否是SDK * int $classify 游戏平台 * bool $game_flag * bool $add_plat * * @param string $page * * @return array */ public function getIdNames($where = [], $page = '') { $_status = 2; $_is_delete = 2; $_is_sdk = 0; $_classify = 0; $_game_flag = false; $_add_plat = false; if (isset($where['status']) && is_numeric($where['status'])) { $_status = $where['status']; unset($where['status']); } if (isset($where['is_delete']) && is_numeric($where['is_delete'])) { $_is_delete = $where['is_delete']; unset($where['is_delete']); } if (isset($where['is_sdk']) && is_numeric($where['is_sdk'])) { $_is_sdk = $where['is_sdk']; unset($where['is_sdk']); } if (isset($where['classify']) && is_numeric($where['classify'])) { $_classify = $where['classify']; unset($where['classify']); } if (isset($where['game_flag'])) { $_game_flag = $where['game_flag']; unset($where['game_flag']); } if (isset($where['add_plat'])) { $_add_plat = $where['add_plat']; unset($where['add_plat']); } $_map = $where; $_data = (new GameModel())->getIdNames( $_status, $_is_delete, $_is_sdk, $_classify, $_game_flag, $_add_plat, $_map, $page ); return $_data; } /** * 验证游戏是否存在 * * @param $app_id * * @return bool|int */ public function checkGame($app_id) { if (empty($app_id)) { return GameStatus::GAME_ID_EMPTY; } $_game_info = GameCache::ins()->getInfoByAppId($app_id); if (empty($_game_info)) { return GameStatus::GAME_NOT_EXISTS; } return true; } }