* @version : HUOSDK 8.0 */ namespace huomp\logic\game; use huo\controller\wap\Option; use huo\model\agent\AgentGameModel; use huo\model\member\MemberModel; use huo\model\member\MemGameModel; use huo\model\order\OrderModel; use huo\model\user\UserModel; use huolib\constant\CacheConst; use huolib\constant\CommonConst; use huolib\constant\GameConst; use huolib\constant\OptionConst; use huolib\constant\OrderConst; use huolib\status\CommonStatus; use huolib\tool\Time; use huomp\model\common\CommonModel; use huomp\model\fill\MemFakerModel; use think\Cache; use think\db\exception\DataNotFoundException; use think\db\exception\ModelNotFoundException; use think\exception\DbException; class MemGameLogic extends CommonModel { protected function getWhere($where = []) { $_map = []; if (!empty($param['start_time']) && !empty($param['end_time'])) { $_map['create_time'] = ['between', [$param['start_time'], $param['end_time']]]; } elseif (!empty($param['start_time'])) { $_map['create_time'] = ['egt', $param['start_time']]; } elseif (!empty($param['end_time'])) { $_map['create_time'] = ['elt', $param['end_time']]; } if (!empty($where['app_id'])) { $_map['app_id'] = $where['app_id']; } if (!empty($where['agent_id'])) { $_map['guided_agent_id'] = $where['agent_id']; if ('-1' == $where['agent_id']) { $_map['guided_agent_id'] = 0; } // 数组类型官方渠道筛选 if (is_array($where['agent_id']) && !empty($where['agent_id'][1]) && is_array($where['agent_id'][1]) && in_array('-1', $where['agent_id'][1])) { $_map['guided_agent_id'] = 0; } } if (!empty($where['start_time']) && !empty($where['end_time'])) { $_map['create_time'] = [ 'between', [ strtotime($where['start_time']), CommonConst::CONST_DAY_SECONDS + strtotime($where['end_time']) ] ]; } elseif (!empty($where['start_time'])) { $_map['create_time'] = ['egt', strtotime($where['start_time'])]; } elseif (!empty($where['end_time'])) { $_map['create_time'] = ['elt', CommonConst::CONST_DAY_SECONDS + strtotime($where['end_time'])]; } if (!empty($where['mem_id'])) { $_map['mem_id'] = $where['mem_id']; } if (!empty($where['username'])) { $_map['mem_id'] = (new MemberModel())->getIdByUsername($where['username']); } if (!empty($where['is_recharged'])) { if ($where['is_recharged'] == CommonConst::STATUS_YES) { $_map['sum_money'] = ['>', 0]; } else { $_map['sum_money'] = ['=', 0]; } } return $_map; } /** * 获取玩家游戏列表 * * @param int $mem_id * @param array $where * @param string $page * @param string $order * * @return array|int */ public function getMemGames($mem_id = 0, $where = [], $page = '1,10', $order = 'create_time desc') { $_rdata = ['count' => 0, 'list' => []]; if (!empty($mem_id)) { $_map['mem_id'] = $mem_id; } $_map = $this->getWhere($where); $_mem_game_model = new MemGameModel(); $_count = $_mem_game_model->with('game2,guidedagent')->where($_map)->count('id'); if (empty($_count)) { return $_rdata; } $_app_arr = $_mem_game_model->with('game2,guidedagent') ->where($_map) ->page($page) ->order($order) ->select(); if (is_object($_app_arr)) { $_app_arr = $_app_arr->toArray(); } if (empty($_app_arr)) { return $_rdata; } $_lis = []; foreach ($_app_arr as $_k => $_v) { $data = []; $data['id'] = $_v['id']; $data['mem_id'] = $_v['mem_id']; $data['app_id'] = $_v['app_id']; $data['nickname'] = $_v['nickname']; $data['create_time'] = $_v['create_time']; $data['update_time'] = $_v['update_time']; $data['name'] = empty($_v['game2']['name']) ? '' : $_v['game2']['name']; $data['icon'] = empty($_v['game2']['icon']) ? '' : $_v['game2']['icon']; $data['guided_agent_id'] = $_v['guided_agent_id']; $data['guided_agent_name'] = $_v['guidedagent']['user_login'] ?? ''; $data['guided_agent_nicename'] = $_v['guidedagent']['user_nicename'] ?? ''; $data['sum_money'] = $_v['sum_money'] ?? 0; $_lis[] = $data; } $_rdata = ['count' => $_count, 'list' => $_lis]; return $_rdata; } /** * 获取玩家游戏列表 * * @param int $mem_id * * @return array|int */ public function getMemGamesIdName($mem_id = 0) { $_rdata = []; if (empty($mem_id)) { return $_rdata; } $_map['mem_id'] = $mem_id; try { $_app_arr = (new MemGameModel())->with('game2') ->field('app_id') ->where($_map) ->select(); } catch (DataNotFoundException $e) { return CommonStatus::DATA_NOT_FOUND_EXCEPTION; } catch (ModelNotFoundException $e) { return CommonStatus::MODEL_NOT_FOUND_EXCEPTION; } catch (DbException $e) { return CommonStatus::DB_EXCEPTION; } if (is_object($_app_arr)) { $_app_arr = $_app_arr->toArray(); } if (empty($_app_arr)) { $_rdata = []; } foreach ($_app_arr as $_k => $_v) { if (!empty($_v['game2'])) { $_rdata[$_v['app_id']] = $_v['game2']['name']; } } return $_rdata; } /** * 获取玩家游戏列表 * * @param int $mem_id * @param array $where * @param string $page * @param string $order * * @return array|int */ public function getApiMemGame($mem_id = 0, $where = [], $page = '1,10', $order = 'update_time desc') { $_rdata = ['count' => 0, 'list' => []]; if (empty($mem_id)) { return $_rdata; } $_map = $this->getWhere($where); $_map['mem_id'] = $mem_id; $_map['classify'] = GameConst::GAME_MP; $_map['game.status'] = GameConst::GAME_STATUS_ON; $_mem_game_model = new MemGameModel(); $_count = $_mem_game_model->with('game')->where($_map)->count('distinct(app_id)'); if (empty($_count)) { return $_rdata; } $_app_arr = $_mem_game_model->with('game,gamemini,gameext,gv') ->where($_map) ->page($page) ->order($order) ->select(); if (is_object($_app_arr)) { $_app_arr = $_app_arr->toArray(); } if (empty($_app_arr)) { return $_rdata; } $_list = []; $_agent_id = (new UserModel())->getIdByMemId($mem_id); $_agent_game_model = new AgentGameModel(); foreach ($_app_arr as $_k => $_v) { $data = []; $data['is_add'] = CommonConst::CONST_FALSE; if (!empty($_agent_id)) { $_agent_game_info = $_agent_game_model->getInfoByAgentIdAppId($_agent_id, $_v['app_id']); } if (!empty($_agent_game_info) && $_agent_game_info['is_delete'] == CommonConst::CONST_NOT_DELETE) { $data['is_add'] = CommonConst::CONST_TRUE; } $_need_popup = empty($_v['gamemini']['need_popup']) ? GameConst::RATE_MP_NEED_POPUP_NOT : $_v['gamemini']['need_popup']; $_entrance_image = ''; if (GameConst::RATE_MP_NEED_POPUP == $_need_popup) { $_entrance_image = empty($_v['gamemini']['entrance_image']) ? '' : cmf_get_image_url( $_v['gamemini']['entrance_image'] ); } $data['ag_id'] = $_v['id']; $data['game_id'] = $_v['app_id']; $data['mini_app_id'] = empty($_v['gamemini']['mini_app_id']) ? '' : $_v['gamemini']['mini_app_id']; $data['gamename'] = empty($_v['game']['name']) ? '' : $_v['game']['name']; $data['icon'] = empty($_v['game']['icon']) ? '' : $_v['game']['icon']; $data['oneword'] = empty($_v['game']['oneword']) ? '' : $_v['game']['oneword']; $data['down_cnt'] = empty($_v['gameext']['down_cnt']) ? 0 : $_v['gameext']['down_cnt']; $data['url'] = empty($_v['gv']) ? '' : $_v['gv'][0]['package_url']; $data['mem_agent_reward'] = 0;// TODO: wuyonghong 2018/8/23 附加奖励 $data['need_popup'] = $_need_popup; $data['entrance_image'] = $_entrance_image; $data['player'] = $this->getPlayer($mem_id, $_v['app_id']); $_list[] = $data; } $_rdata = ['count' => $_count, 'list' => $_list]; return $_rdata; } /** * 获取该游戏,该玩家的亲友团信息 * * @param $mem_id * @param $game_id * * @return array */ public function getPlayer($mem_id, $game_id) { $_avatar_cnt = $this->getMemPlayerCfg(OptionConst::SETTING_MEM_PLAYER_AC); $_rdata = $this->getFakerPlayer(); //虚假数据,作为原始返回 /* 获取玩家的亲友团 */ $_sub_mem_ids = (new MemberModel())->getIdsByParentMemId($mem_id); if (empty($_sub_mem_ids)) { return $_rdata; } $_game_mems = $this->getGameMem($mem_id, $game_id, $_sub_mem_ids); //真实数据 if (empty($_game_mems['count'])) { return $_rdata; } $_rdata['count'] += $_game_mems['count']; $_rdata['avatar'] = array_merge($_game_mems['avatar'], $_rdata['avatar']); if (count($_rdata['avatar']) > $_avatar_cnt) { //多余去除 $_avatar = []; $_k = 0; foreach ($_rdata['avatar'] as $_v) { if ($_k >= $_avatar_cnt) { continue; } $_avatar[] = $_v; $_k++; } $_rdata['avatar'] = $_avatar; } return $_rdata; } /** * 获取虚拟的玩家数据 */ public function getFakerPlayer() { $_avatar_cnt = $this->getMemPlayerCfg(OptionConst::SETTING_MEM_PLAYER_AC); $_faker_cnt = $this->getMemPlayerCfg(OptionConst::SETTING_MEM_PLAYER_FC); $_rdata = ['count' => 0, 'avatar' => []]; $_avatar = (new MemFakerModel())->getAvatars(); if (empty($_avatar)) { return $_rdata; } $_rdata['count'] = $_faker_cnt; if (count($_avatar) > $_avatar_cnt) { $_key = array_rand($_avatar, $_avatar_cnt); foreach ($_key as $_v) { $_rdata['avatar'][] = cmf_get_image_preview_url($_avatar[$_v]); } } return $_rdata; } /** * 获取游戏玩家数据 * * @param $mem_id * @param $game_id * @param $sub_mem_ids * * @return mixed */ public function getGameMem($mem_id, $game_id, $sub_mem_ids) { $_tag = CacheConst::TAG_GAME_MEMS; $_avatar_cnt = $this->getMemPlayerCfg(OptionConst::SETTING_MEM_PLAYER_AC); $_rdata = ['count' => 0, 'avatar' => []]; $_cache_key = CacheConst::CACHE_GAME_MEMS.json_encode([$mem_id, $game_id]); $_data = Cache::get($_cache_key); if (!empty($_data)) { return json_decode($_data, true); } $_map = [ 'app_id' => $game_id, 'mem_id' => ['in', $sub_mem_ids] ]; $_mem_ids = (new MemGameModel())->where($_map)->column('mem_id'); list($_start_time, $_end_time) = Time::today(); $_diff_time = $_end_time - time(); if (empty($_mem_ids)) { Cache::tag($_tag, $_cache_key)->set($_cache_key, json_encode($_rdata), $_diff_time); return $_rdata; } $_rdata['count'] = count($_mem_ids); if ($_rdata['count'] > $_avatar_cnt) { $_key = array_rand($_mem_ids, $_avatar_cnt); $_mems = []; foreach ($_key as $_v) { $_mems[] = $_mem_ids[$_v]; } $_mem_ids = $_mems; } $_avatar = (new MemberModel())->where(['id' => ['in', $_mem_ids]])->column('avatar'); $_rdata['avatar'] = $_avatar; Cache::tag($_tag, $_cache_key)->set($_cache_key, json_encode($_rdata), $_diff_time); return $_rdata; } /** * 获取后台配置好友玩信息 * * @param string $field * * @return int */ public function getMemPlayerCfg($field = OptionConst::SETTING_MEM_PLAYER_FC) { $_setting_name = OptionConst::SETTING_MEM_PLAYER; $_m = new Option(); $_item = $_m->getOptionData($_setting_name, 1, true); if (!empty($_item['option_value'])) { $_option_value = json_decode($_item['option_value'], true); } if (!empty($_option_value[$field])) { return $_option_value[$field]; } return 0; } }