* @version : HuoMp 1.0 */ namespace huomp\logic\finance; use huo\controller\common\CommonFunc; use huo\model\common\CommonModel; use huo\model\integral\MemItgLogModel; use huo\model\member\MemberExtModel; use huo\model\member\MemberModel; use huo\model\user\UserModel; use huolib\constant\CacheConst; use huolib\constant\CommonConst; use huolib\constant\DataConst; use huolib\constant\MemItgConst; use huolib\constant\WalletConst; use huolib\tool\StrUtils; use huomp\logic\agent\AgentExtLogic; use huomp\model\fill\MemFakerModel; use think\Cache; class IncomeListLogic extends CommonModel { /** * @param array $param * * @return array|mixed */ protected function getWhere($param = []) { $_map = []; if (!empty($param['mem_id'])) { $_map['mem_id'] = $param['mem_id']; } if (!empty($param['itg_type'])) { $_map['itg_type'] = $param['itg_type']; } else { $_map['itg_type'] = MemItgConst::MEM_ITG_ADD; } if (!empty($param['start_time']) && !empty($param['start_time'])) { $_map['create_time'] = ['between', [strtotime($param['start_time']), CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])]]; } else if (!empty($param['start_time'])) { $_map['create_time'] = ['gt', strtotime($param['start_time'])]; } else if (!empty($param['end_time'])) { $_map['create_time'] = ['lt', CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])]; } return $_map; } /** * 收益列表 * * @param array $where * @param string $page * @param string $order * * @return array */ public function incomeList($where = [], $page = '1,10', $order = '-create_time') { $_map = $this->getWhere($where); $_map['app_id'] = get_val($where, 'app_id', 0); $_field = []; return $this->getList($_field, $_map, $page, $order); } /** * @param $field * @param $where * @param string $page * @param string $order * * @return array */ public function getList($field, $where, $page = '1,10', $order = '-create_time') { unset($where['app_id']); $_gold_rmb_rate = CommonFunc::getGoldRmbRate(); $_map = $where; $_map['is_delete'] = CommonConst::CONST_NOT_DELETE; $_model = new MemItgLogModel(); $_count = $_model->where($_map)->count(); if (empty($_count)) { return [ 'count' => 0, 'list' => [] ]; } $_order = $_model->orderFilter($order); $_datas = $_model->with('member') ->with('submem') ->where($_map) ->order($_order) ->page($page) ->select(); if (is_object($_datas)) { $_datas = $_datas->toArray(); } if (empty($_datas)) { return [ 'count' => $_count, 'list' => [] ]; } $_data = []; foreach ($_datas as $_v) { $_nickname = !empty($_v['member']) ? $_v['member']['nickname'] : ''; $_avatar = !empty($_v['member']) ? $_v['member']['avatar'] : ''; if ('member' == $_v['link_table']) { $_nickname = !empty($_v['submem']) ? $_v['submem']['nickname'] : $_nickname; $_avatar = !empty($_v['submem']) ? $_v['submem']['avatar'] : $_avatar; } $_data[] = [ 'id' => $_v['id'], 'title' => $_nickname, 'icon' => $_avatar, 'desc' => $_v['ia_name'], 'integral' => intval($_v['integral']), 'amount' => StrUtils::formatNumber($_v['integral'] / $_gold_rmb_rate), 'create_time' => $_v['create_time'], ]; } return [ 'count' => $_count, 'list' => $_data ]; } /** * 收益排行列表 * * @param $agent_id * @param array $param * @param string $page * * @return array */ public function incomeRankList($agent_id, $param = [], $page = '1,10') { if (!isset($param['range'])) { $_range = DataConst::RANK_RANGE_WEEK; } else { $_range = $param['range']; } switch ($_range) { case DataConst::RANK_RANGE_WEEK: // unset($param['range']); // $_start_time = strtotime('-7 days'); // $_end_time = time(); // $param['start_time'] = date('Y-m-d', $_start_time); // $param['end_time'] = date('Y-m-d', $_end_time); // unset($param['range']); // $_data = (new DayAgentLogic())->getRankList($agent_id, $param, $page); // break; case DataConst::RANK_RANGE_MONTH: // unset($param['range']); // $_start_time = strtotime('-30 days'); // $_end_time = time(); // $param['start_time'] = date('Y-m-d', $_start_time); // $param['end_time'] = date('Y-m-d', $_end_time); // $_data = (new DayAgentLogic())->getRankList($agent_id, $param, $page); // break; case DataConst::RANK_RANGE_ALL: default: unset($param['range']); $_type = get_val($param, 'type', WalletConst::WALLET_RP); unset($param['type']); if (WalletConst::WALLET_RP == $_type) { $_data = (new AgentExtLogic())->getRankList($agent_id, $param, $page); } elseif (WalletConst::WALLET_ITG == $_type) { unset($param['role_id']); $_mem_id = (new UserModel())->getMemIdById($agent_id); if (empty($_mem_id)) { return null; } $_data = $this->getItgRankList($_mem_id, $param, $page); } else { $_data = null; } break; } return $_data; } /** * 获取积分排行版 * * @param int $mem_id * @param $where * @param string $page * * @return array */ public function getItgRankList($mem_id, $where = [], $page = '1,10') { $_map = $where; $_rdata = $this->getItgList($mem_id, $_map, $page); return $_rdata; } /** * @param int $mem_id * @param array $where * @param string $page * * @return array|mixed */ public function getItgList($mem_id, $where, $page = '1,10') { $_data = $this->getItgData($mem_id, $where, $page); if (empty($_data['list'])) { return $_data; } $_page_data = explode(',', $page); $_start = ($_page_data[0] - 1) * $_page_data[1]; $_data['list'] = array_slice($_data['list'], $_start, $_page_data[1]); return $_data; } /** * @param int $mem_id * @param array $where * * @return array|mixed */ public function getItgData($mem_id, $where, $page = '1,10') { $_cache_key = CacheConst::CACHE_MONEY_RANK_PREFIX.'itg'.md5(json_encode(array($where))); $_rdata = json_decode(Cache::get($_cache_key), true); if (!empty($_rdata)) { return $_rdata; } $_map = $where; if (empty($_map)) { $_map = ' 1 '; } $_model = new MemberExtModel(); $_order = 'integral_total desc'; $_data_list = $_model ->with('member') ->where($_map) ->whereOr('mem_id='.$mem_id) ->order($_order) ->limit(CommonConst::CONST_MAX_SHOW_CNT) ->select(); if (is_object($_data_list)) { $_data_list = $_data_list->toArray(); } $_merge_data = []; $_gold_rmb_rate = CommonFunc::getGoldRmbRate(); $_mem_model = new MemberModel(); foreach ($_data_list as $_item) { $_integral_total = $_item['integral_total']; $_merge_data[] = [ 'avatar' => empty($_item['member']) ? '' : $_item['member']['avatar'], 'nickname' => empty($_item['member']) ? '' : $_item['member']['nickname'], 'mem_id' => $_item['mem_id'], 'agent_id' => 0,// TODO: wuyonghong 2018/9/28 未获取agent_id 'reg_cnt' => $_mem_model->where(['parent_mem_id' => $_item['mem_id']])->count(), 'share_total' => StrUtils::formatNumber($_integral_total / $_gold_rmb_rate), 'amount' => StrUtils::formatNumber($_integral_total / $_gold_rmb_rate), 'share_total_integral' => $_integral_total, 'integral_total' => $_integral_total ]; } if (empty($where['parent_mem_id'])) { /* 获取虚拟数据 */ $_order = 'sub_amount desc'; $_faker_data_list = (new MemFakerModel())->where(['is_delete' => CommonConst::CONST_NOT_DELETE]) ->order($_order) ->limit(CommonConst::CONST_MAX_SHOW_CNT) ->select(); if (is_object($_faker_data_list)) { $_faker_data_list = $_faker_data_list->toArray(); } foreach ($_faker_data_list as $_item) { $_merge_data[] = [ 'avatar' => empty($_item['avatar']) ? '' : cmf_get_image_preview_url( $_item['avatar'] ), 'nickname' => empty($_item['nickname']) ? '' : $_item['nickname'], 'mem_id' => empty($_item['id']) ? 0 : 'fk_'.$_item['id'], 'agent_id' => empty($_item['id']) ? 0 : 'fk_'.$_item['id'], 'reg_cnt' => StrUtils::formatNumber($_item['sub_mem_cnt']), 'share_total' => StrUtils::formatNumber($_item['sub_amount']), 'amount' => StrUtils::formatNumber($_item['sub_amount']), 'share_total_integral' => intval($_gold_rmb_rate * $_item['sub_amount']), 'integral_total' => intval($_gold_rmb_rate * $_item['sub_amount']), ]; } } if (empty($_merge_data)) { return [ 'count' => 0, 'ranking' => 0, 'list' => [] ]; } //重新排序并截取 array_multisort(array_column($_merge_data, 'share_total_integral'), SORT_DESC, $_merge_data); $_merge_data = array_slice($_merge_data, 0, CommonConst::CONST_MAX_SHOW_CNT); $_ranking = '99+'; foreach ($_merge_data as $_k => $_v) { if ($mem_id == $_v['mem_id']) { $_ranking = $_k + 1; } } $_rdata = [ 'count' => CommonConst::CONST_MAX_SHOW_CNT, 'ranking' => $_ranking, 'list' => $_merge_data ]; Cache::set($_cache_key, json_encode($_rdata), CommonConst::CONST_MINUTE_SECONDS); return $_rdata; } }