<?php

namespace Home\Controller;

use OT\DataDictionary;
use User\Api\PromoteApi;
use Base\Repository\PromoteRepository;
use Base\Repository\SpendRepository;
use Base\Repository\UserRepository;

/**
 * 前台首页控制器
 * 主要获取首页聚合数据
 */
class QueryController extends BaseController
{
    public static $payWay = [
        -1 => '绑币',
        0 => '平台币',
        1 => '支付宝',
        2 => '微信',
        5 => '聚宝云',
        6 => '竣付通',
        7 => '苹果支付',
        8 => '金猪支付',
        9 => '双乾支付',
    ];

    public function recharge($p = 0)
    {
        $page = intval($p);
        $page = $page ? $page : 1; //默认显示第一页数据arraypage

        if (isset($_REQUEST['row'])) {
            $row = $_REQUEST['row'];
        } else {
            $row = 10;
        }

//        $childPromoteIds = getAllChildPromoteList(3);
//        if (empty($childPromoteIds)) {
//            $map['tab_spend.promote_id'] = PID;
//        } else {
//            $childPromoteIds .= ',' . PID;
//
//            $map['tab_spend.promote_id'] = ['in', $childPromoteIds];
//        }

        
        $map1['chain'] = ['like','%'.PID.'/'.'%'];
        $rs = M('promote','tab_')->where($map1)->field('id,account,nickname')->select();
        $childPromoteIds = '';
        if(empty($rs)) {
            $map['tab_spend.promote_id'] = PID;
        }else {
             foreach ($rs as $rsKey => $rsValue) {
                $id = $rsValue['id'];
                $childPromoteIds .= $id.',';
            }
           $childPromoteIds = rtrim($childPromoteIds, ',');
           $childPromoteIds .= ',' . PID;
           $map['tab_spend.promote_id'] = ['in', $childPromoteIds];
        }

        $levelPromote = $this->getLevelPromote();
        $queryPromote = $this->getQueryPromote($levelPromote);
        $map2[] = [
            '_logic' => 'or',
            'id' => $queryPromote['id'],
            'chain' => ['like', $queryPromote['chain'] . $queryPromote['id'] . '/%']
        ];
        $ids = M('promote', 'tab_')->where($map2)->getField('id', true);
        if(empty($ids)) {
           $ids = array();
        }
        if(empty($levelPromote)) {
            array_push($ids,PID);
            
        }
        array_push($ids,$queryPromote['id']);
        if (!empty($ids)) {
            $map['tab_spend.promote_id'] = ['in',$ids];
            
        }else {
            $map['_string'] = '1<>1';
        }
        

        if (!empty(I('own_id'))) {
            $map['tab_spend.promote_id'] = $queryPromote['id'];//本账号
        }

        if (!empty(I('begtime')) && empty(I('endtime'))) {
            $map['tab_spend.pay_time'] = ['egt', strtotime(I('begtime'))];
        } elseif (empty(I('begtime')) && !empty(I('endtime'))) {
            $map['tab_spend.pay_time'] = ['elt', strtotime(I('endtime')) + 86399];
        } elseif (!empty(I('begtime')) && !empty(I('endtime'))) {
            $map['tab_spend.pay_time'] = ['between', [strtotime(I('begtime')), strtotime(I('endtime')) + 86399]];
        }

        if (isset($_REQUEST['pay_way']) && $_REQUEST['pay_way'] !== '') {
            $payWay = intval(I('pay_way'));

            if (in_array($payWay, array_keys(QueryController::$payWay))) {
                if ($payWay == 2) {
                    $map['tab_spend.pay_way'] = ['in', '2,3,4'];
                } else {
                    $map['tab_spend.pay_way'] = $payWay;
                }
            }
        }

        empty(I('relation_game_id')) || $map['tab_game.relation_game_id'] = I('relation_game_id');
        empty(I('sdk_version')) || $map['tab_game.sdk_version'] = I('sdk_version');
        empty(I('server_id')) || $map['tab_spend.server_id'] = I('server_id');
        empty(I('game_player_name')) || $map['tab_spend.game_player_name'] = ['like', '%' . I('game_player_name') . '%'];
        empty(I('user_account')) || $map['tab_spend.user_account'] = I('user_account');
        empty(I('order_number')) || $map['tab_spend.order_number'] = I('order_number');
        $map['tab_spend.pay_status'] = 1;
        $map['tab_spend.is_check'] = ['neq', 2];

        $data = M('Spend', 'tab_')
            ->field('tab_spend.*,tab_promote.account as pro_account,tab_promote.real_name as pro_real_name,tab_promote.grand_id as pro_grand_id,tab_promote.parent_id as pro_parent_id')
            ->join('tab_game on tab_spend.game_id = tab_game.id')
            ->join('left join tab_promote on tab_spend.promote_id = tab_promote.id')
            ->where($map)
            ->order('tab_spend.id desc')
            ->page($page, $row)
            ->select();

        $count = M('Spend', 'tab_')
            ->join('tab_game on tab_spend.game_id = tab_game.id')
            ->where($map)
            ->count();

        if (!empty($data)) {
            foreach ($data as &$list) {
                if ($list['pro_grand_id'] > 0) {
                    $thisPromoteData = D('Promote')
                        ->field('account,real_name')
                        ->where(array('id' => $list['pro_parent_id']))
                        ->find();
                    $list['p_pro_account'] = $thisPromoteData['account'];
                    $list['p_pro_real_name'] = $thisPromoteData['real_name'];
                }
                $list['user_account'] = substr($list['user_account'], 0, 2) . '******' . substr($list['user_account'], 8);
            }
        }

        //分页
        $parameter['p'] = I('get.p', 1);
        $parameter['row'] = I('get.row');
        empty(I('relation_game_id')) || $parameter['relation_game_id'] = I('relation_game_id');
        empty(I('sdk_version')) || $parameter['sdk_version'] = I('sdk_version');
        empty(I('server_id')) || $parameter['server_id'] = I('server_id');
        empty(I('game_player_name')) || $parameter['game_player_name'] = I('game_player_name');
        empty(I('user_account')) || $parameter['user_account'] = I('user_account');
        empty(I('team_leader_id')) || $parameter['team_leader_id'] = I('team_leader_id');
        empty(I('promote_id')) || $parameter['promote_id'] = I('promote_id');
        empty(I('own_id')) || $parameter['own_id'] = I('own_id');
        empty(I('begtime')) || $parameter['begtime'] = I('begtime');
        empty(I('endtime')) || $parameter['endtime'] = I('endtime');
        empty(I('level_promote_2')) || $parameter['level_promote_2'] = I('level_promote_2');
        empty(I('level_promote_3')) || $parameter['level_promote_3'] = I('level_promote_3');
        empty(I('level_promote_4')) || $parameter['level_promote_4'] = I('level_promote_4');
        !isset($_REQUEST['pay_way']) || $parameter['pay_way'] = I('pay_way');

        $serverData = $this->getServer(I('relation_game_id'), I('sdk_version'));

        $thisParentPromoteId = getParentPromoteId(PID);//本账号上级渠道ID
        $page = set_pagination($count, $row, $parameter);
        if ($page) {
            $this->assign('_page', $page);
        }

        $this->assign('listData', $data);
        $this->assign('count', $count);
        $this->assign('setdate', date("Y-m-d"));
        $this->assign('serverData', $serverData['data']);
        $this->assign('thisParentPromoteId', $thisParentPromoteId);
        $this->assign('pID', PID);
        $this->assign('ownId', I('own_id'));
        $this->assign('payWayData', QueryController::$payWay);
        if (!empty(I('team_leader_id'))) {
            $this->assign('teamLeaderData', getAllPromoteListByType(1, false, intval(I('team_leader_id'))));
        }
        $this->meta_title = "订单查询";
        $this->display();
    }

    public function register($p = 0)
    {
        $page = intval($p);
        $page = $page ? $page : 1; //默认显示第一页数据arraypage

        if (isset($_REQUEST['row'])) {
            $row = $_REQUEST['row'];
        } else {
            $row = 10;
        }
        

        //$childPromoteIds = getAllChildPromoteList(3);
//        if (empty($childPromoteIds)) {
//            $map['tab_user.promote_id'] = PID;
//        } else {
//            $childPromoteIds .= ',' . PID;
//
//            $map['tab_user.promote_id'] = ['in', $childPromoteIds];
//        }
     //   $map['tab_user.promote_id'] = ['like','%'.PID.'/'.'%']; 
        $map1['chain'] = ['like','%'.PID.'/'.'%'];
        $rs = M('promote','tab_')->where($map1)->field('id,account,nickname')->select();
        $childPromoteIds = '';
        if(empty($rs)) {
            $map['tab_user.promote_id'] = PID;
        }else {
             foreach ($rs as $rsKey => $rsValue) {
                $id = $rsValue['id'];
                $childPromoteIds .= $id.',';
            }
           $childPromoteIds = rtrim($childPromoteIds, ',');
           $childPromoteIds .= ',' . PID;
           $map['tab_user.promote_id'] = ['in', $childPromoteIds];
        }

        $promote = $this->getLoginPromote();
        $levelPromote = $this->getLevelPromote();
        $queryPromote = $this->getQueryPromote($levelPromote);
        $map2[] = [
            '_logic' => 'or',
            'id' => $queryPromote['id'],
            'chain' => ['like', $queryPromote['chain'] . $queryPromote['id'] . '/%']
        ];
        $ids = M('promote', 'tab_')->where($map2)->getField('id', true);
        if(empty($ids)) {
           $ids = array();
        }
        if(empty($levelPromote)) {
            array_push($ids,PID);
            
        }
        array_push($ids,$queryPromote['id']);
        if (!empty($ids)) {
            $map['tab_user.promote_id'] = ['in',$ids];
            
        }else {
            $map['_string'] = '1<>1';
        }
        
        if (!empty(I('own_id'))) {
            $map['tab_user.promote_id'] = $queryPromote['id'];//本账号
        }

        if (!empty(I('begtime')) && empty(I('endtime'))) {
            $map['tab_user.register_time'] = ['egt', strtotime(I('begtime'))];
        } elseif (empty(I('begtime')) && !empty(I('endtime'))) {
            $map['tab_user.register_time'] = ['elt', strtotime(I('endtime')) + 86399];
        } elseif (!empty(I('begtime')) && !empty(I('endtime'))) {
            $map['tab_user.register_time'] = ['between', [strtotime(I('begtime')), strtotime(I('endtime')) + 86399]];
        }

        empty(I('account')) || $map['tab_user.account'] = I('account');
        empty(I('id')) || $map['tab_user.id'] = intval(I('id'));

        $data = M('User', 'tab_')
            ->field('tab_user.*,tab_promote.real_name as pro_real_name')
            ->join('left join tab_promote on tab_user.promote_id = tab_promote.id')
            ->where($map)
            ->order('tab_user.id desc')
            ->page($page, $row)
            ->select();

        $count = M('User', 'tab_')
            ->where($map)
            ->count();

        if (!empty($data)) {
            foreach ($data as &$list) {
                $loginMap['user_id'] = $list['id'];
                $newLoginData = M('UserLoginRecord', 'tab_')
                    ->field('login_time,login_ip')
                    ->where($loginMap)
                    ->order('login_time desc')
                    ->find();

                $list['new_login_time'] = date('Y-m-d H:i:s', $newLoginData['login_time']);
                $list['new_login_ip'] = $newLoginData['login_ip'];
                $list['account'] = substr($list['account'], 0, 2) . '******' . substr($list['account'], 8);
            }
        }

        //分页
        $parameter['p'] = I('get.p', 1);
        $parameter['row'] = I('get.row');
        empty(I('team_leader_id')) || $parameter['team_leader_id'] = I('team_leader_id');
        empty(I('promote_id')) || $parameter['promote_id'] = I('promote_id');
        empty(I('own_id')) || $parameter['own_id'] = I('own_id');
        empty(I('account')) || $parameter['account'] = I('account');
        empty(I('begtime')) || $parameter['begtime'] = I('begtime');
        empty(I('endtime')) || $parameter['endtime'] = I('endtime');
        empty(I('level_promote_2')) || $parameter['level_promote_2'] = I('level_promote_2');
        empty(I('level_promote_3')) || $parameter['level_promote_3'] = I('level_promote_3');
        empty(I('level_promote_4')) || $parameter['level_promote_4'] = I('level_promote_4');
        $thisParentPromoteId = getParentPromoteId(PID);//本账号上级渠道ID
        $page = set_pagination($count, $row, $parameter);
        if ($page) {
            $this->assign('_page', $page);
        }

        $this->assign('listData', $data);
        $this->assign('count', $count);
        $this->assign('setdate', date("Y-m-d"));
        $this->assign('thisParentPromoteId', $thisParentPromoteId);
        $this->assign('pID', PID);
        $this->assign('ownId', I('own_id'));
        if (!empty(I('team_leader_id'))) {
            $this->assign('teamLeaderData', getAllPromoteListByType(1, false, intval(I('team_leader_id'))));
        }
        $this->meta_title = '注册明细';
        $this->display();
    }

    /**
     *我的对账单
     */
    public function bill()
    {
        $map['promote_id'] = get_pid();
        if (isset($_REQUEST['bill_number']) && !empty($_REQUEST['bill_number'])) {
            $map['bill_number'] = $_REQUEST['bill_number'];
        }
        if (isset($_REQUEST['game_id']) && !empty($_REQUEST['game_id'])) {
            $map['game_id'] = $_REQUEST['game_id'];
        }
        if (!empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
            $map['bill_start_time'] = array('egt', strtotime($_REQUEST['timestart']));
            $map['bill_end_time'] = array('elt', strtotime($_REQUEST['timeend']) + 24 * 3600 - 1);
        }
        $model = array(
            'm_name' => 'bill',
            'map' => $map,
            'template_list' => 'bill',
            'title' => '我的对账单',
        );
        $user = A('User', 'Event');
        $user->bill_list($model, $_GET['p']);
    }


    /**
     *我的结算
     */
    public function my_earning($p = 1)
    {
        $pro_map['id'] = get_pid();
        $pro = M("promote", "tab_")->where($pro_map)->find();
        $map['promote_id'] = get_pid();
        if ($pro['parent_id'] == 0) {
            if (isset($_REQUEST['settlement_number']) && !empty($_REQUEST['settlement_number'])) {
                $map['settlement_number'] = ['like', '%' . $_REQUEST['settlement_number'] . '%'];
            }
            if (!empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
                /*$map['bill_start_time'] = array('egt',strtotime($_REQUEST['timestart']));
                $map['bill_end_time'] = array('elt',strtotime($_REQUEST['timeend'])+24*3600-1);*/
                $map['starttime'] = array('egt', strtotime($_REQUEST['timestart']));
                $map['endtime'] = array('elt', strtotime($_REQUEST['timeend']) + 24 * 3600 - 1);
            } elseif (!empty($_REQUEST['timestart']) && empty($_REQUEST['timeend'])) {
                $map['starttime'] = array('egt', strtotime($_REQUEST['timestart']));
            } elseif (empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
                $map['endtime'] = array('elt', strtotime($_REQUEST['timeend']) + 24 * 3600 - 1);
            }

            $model = array(
                'm_name' => 'TotalSettlement',
                'map' => $map,
                'fields' => true,
                'order' => 'create_time desc ',
                'template_list' => 'my_earning',
                'title' => '我的结算',

            );
        } else {

            if (isset($_REQUEST['settlement_number']) && !empty($_REQUEST['settlement_number'])) {
                $map['settlement_number'] = ['like', '%' . $_REQUEST['settlement_number'] . '%'];
            }
            if (!empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
                $map['settlement_start_time'] = array('egt', strtotime($_REQUEST['timestart']));
                $map['settlement_end_time'] = array('elt', strtotime($_REQUEST['timeend']) + 24 * 3600 - 1);
            } elseif (!empty($_REQUEST['timestart']) && empty($_REQUEST['timeend'])) {
                $map['settlement_start_time'] = array('egt', strtotime($_REQUEST['timestart']));
            } elseif (empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
                $map['settlement_end_time'] = array('elt', strtotime($_REQUEST['timeend']) + 24 * 3600 - 1);
            }

            $model = array(
                'm_name' => 'son_settlement',
                'fields' => 'settlement_number,settlement_start_time,create_time,
                        settlement_end_time,game_id,game_name,promote_id,
                        promote_account,pattern,bind_coin_status,floor(sum(sum_money*100))/100 as sum_money,
                        sum(reg_number) as reg_number,ratio,money,floor(sum(jie_money*100))/100 as jie_money,status,ti_status',
                'map' => $map,
                'template_list' => 'my_earning_sub',
                'order' => 'create_time desc',
                'group' => 'settlement_number, create_time',
                'title' => '我的结算',
            );
        }
        $user = A('User', 'Event');
        $this->assign("parent_id", $pro['parent_id']);
        $user->shou_list($model, $p);
    }

    /**
     *子渠道结算单
     */
    public function son_earning_($p = 1)
    {
        if (PLEVEL == 0) {
            if (isset($_REQUEST['timestart']) && isset($_REQUEST['timeend']) && !empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
                $starttime = strtotime($_REQUEST['timestart']);
                $endtime = strtotime($_REQUEST['timeend']) + 24 * 60 * 60 - 1;
                $this->assign('starttime', $starttime);
                $this->assign('endtime', $endtime);
                $map[0]['register_time'] = array('BETWEEN', array($starttime, $endtime));
                $map[1]['pay_time'] = array('BETWEEN', array($starttime, $endtime));
                unset($_REQUEST['timestart']);
                unset($_REQUEST['timeend']);

                $map[1]['parent_id'] = $map[0]['u.parent_id'] = PID;
                if (isset($_REQUEST['ch_promote_id']) && !empty($_REQUEST['ch_promote_id'])) {
                    $map[1]['s.promote_id'] = $map[0]['u.promote_id'] = $_REQUEST['ch_promote_id'];
                }
                $model = array(
                    'title' => '子渠道结算单',
                    'template_list' => 'son_earning',
                );
                $user = A('User', 'Event');
                $user->check_bill($model, $p, $map);
            } else {
                $this->display();
            }
        } else {
            $model = array(
                'm_name' => 'SonSettlement',
                'order' => 'id ',
                'title' => '结算账单',
                'template_list' => 'son_earning',
            );

            $user = A('User', 'Event');
            $user->money_list($model, $p);
        }
    }

    //子渠道结算单
    public function son_list($p = 0)
    {
        if (!empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
            $map['settlement_start_time'] = array('egt', strtotime($_REQUEST['timestart']));
            $map['settlement_end_time'] = array('elt', strtotime($_REQUEST['timeend']) + 86399);
        } elseif (!empty($_REQUEST['timestart']) && empty($_REQUEST['timeend'])) {
            $map['settlement_start_time'] = array('egt', strtotime($_REQUEST['timestart']));
            $map['settlement_end_time'] = array('elt', time());
        } elseif (empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
            $map['settlement_end_time'] = array('elt', strtotime($_REQUEST['timeend']) + 86399);
        }
        if (!empty($_REQUEST['start']) && !empty($_REQUEST['end'])) {
            $start = strtotime($_REQUEST['start']);
            $end = strtotime($_REQUEST['end']) + 86399;
            $map['create_time'] = array('BETWEEN', array($start, $end));
        } elseif (!empty($_REQUEST['start']) && empty($_REQUEST['end'])) {
            $start = strtotime($_REQUEST['start']);
            $end = time();
            $map['create_time'] = array('BETWEEN', array($start, $end));
        } elseif (empty($_REQUEST['start']) && !empty($_REQUEST['end'])) {
            $end = strtotime($_REQUEST['end']) + 86399;
            $map['create_time'] = array('elt', $end);
        }

        if (!empty($_REQUEST['ch_promote_id'])) {
            $map['promote_id'] = $_REQUEST['ch_promote_id'];
        } else {

            $promote = M('Promote', 'tab_')->field('id')->where(['parent_id' => PID])->select();
            $zi_p = implode(',', array_column($promote, 'id'));
            $map['promote_id'] = array('in', "$zi_p");
        }
        $model = array(
            'm_name' => 'SonSettlement',
            'fields' => array(
                'settlement_number',
                'settlement_start_time',
                'settlement_end_time',
                'promote_id',
                'promote_account',
                'bind_coin_status',
                'FLOOR(sum(sum_money*100))/100  as sum_money',
                'sum(reg_number) as reg_number',
                'FLOOR(sum(jie_money*100))/100  as jie_money',
                'ti_status',
                'create_time'
            ),
            'order' => 'create_time desc',
            'group' => 'settlement_number,create_time',
            'title' => '子渠道结算单',
            'template_list' => 'son_list',
        );

        $user = A('User', 'Event');
        $user->money_list($model, $p, $map);
    }

    /**
     *子渠道结算单
     */
    public function son_earning($p = 0)
    {

        if (!empty($_REQUEST['timestart']) || !empty($_REQUEST['timeend'])) {
            $starttime = empty($_REQUEST['timestart']) ? strtotime("-7 day {$_REQUEST['timeend']}") : strtotime($_REQUEST['timestart']);
            $endtime = empty($_REQUEST['timeend']) ? mktime(23, 59, 59, date('m'), date('d') - 1, date('Y')) : strtotime($_REQUEST['timeend']) + 24 * 60 * 60 - 1;
            $this->assign('starttime', date('Y-m-d', $starttime));
            $this->assign('endtime', date('Y-m-d', $endtime));
            $mapp['u.register_time'] = array('BETWEEN', array($starttime, $endtime));
            $mapp['u.' . SETTLEMENT_GRADE] = 0;
            $map['s.pay_time'] = array('BETWEEN', array($starttime, $endtime));
            $map['s.pay_status'] = 1;
            $map['s.' . SETTLEMENT_GRADE] = 0;

            if ($_REQUEST['bind_coin'] == 0) {
                $map['s.pay_way'] = array('neq', -1);
            }
            unset($_REQUEST['timestart']);
            unset($_REQUEST['timeend']);

            if (isset($_REQUEST['ch_promote_id']) && !empty($_REQUEST['ch_promote_id'])) {
                $chid = $_REQUEST['ch_promote_id'];

                $promote_child = get_sub_channel_id($chid, PRO_GRADE + 1);

                $map['s.promote_id'] = $mapp['u.promote_id'] = array('in', $promote_child);

            } else {
                $promote_child = get_zi_promote_id(PID);
                if (empty($promote_child)) {
                    $this->error('该渠道无子渠道');
                }
                $map['s.promote_id'] = $mapp['u.promote_id'] = array('in', $promote_child);
            }
            $model = array(
                'fields' => 'sum(s.pay_amount) as total_amount,s.promote_account,s.promote_id,s.game_name,s.game_id,s.sub_status',
                'm_name' => 'Spend',
                'title' => '子渠道结算单',
                'template_list' => 'son_earning',
                'join' => 'tab_apply on tab_Spend.game_id=tab_apply.game_id and tab_Spend.promote_id=tab_apply.promote_id',
                'group' => 's.promote_id,s.game_id',
                'currentid' => $chid ? $chid : '',
            );
            $mmap = array($mapp, $map);
            $user = A('User', 'Event');
            $user->check_child_bill($model, $p, $mmap);

        } else {
            $this->meta_title = '子渠道结算';
            $this->display();
        }

    }

    public function generatesub()
    {
        //$data = $_REQUEST;
        if (empty($_REQUEST['ids'])) {
            $this->error('请选择要结算的数据');
        } else {
            $settData = array();
            $settlement_number = 'js_' . date('YmdHis', time()) . rand(100, 999);
            $create_time = time();
            $start = $_REQUEST['timestart'];
            $end = $_REQUEST['timeend'];
            foreach ($_REQUEST['ids'] as $key => $value) {
                $data = json_decode($value, true);
                $data['settlement_number'] = $settlement_number;
                $data['create_time'] = time();
                $data['settlement_start_time'] = strtotime($data['settlement_start_time']);
                $data['settlement_end_time'] = strtotime($data['settlement_end_time']);
                switch ($data['cooperation']) {
                    case 'CPS':
                        $data['pattern'] = 0;
                        $cps = $data['ratio'];
                        $data['jie_money'] = round(($cps * $data['sum_money']) / 100, 2);
                        break;
                    case 'CPA':
                        $data['pattern'] = 1;
                        $cpa = $data['money'];
                        $data['jie_money'] = round($cpa * $data['reg_number'], 2);
                        break;
                }
                $userMap['register_time'] = array('BETWEEN', array($data['settlement_start_time'], $data['settlement_end_time'] + 86399));
                $userMap['fgame_id'] = $data['game_id'];

                $userMap[SETTLEMENT_GRADE] = $spendMap[SETTLEMENT_GRADE] = 0;

                $userMap['promote_id'] = $spendMap['promote_id'] = array('in', $data['tpid']);
                $spendMap['game_id'] = $data['game_id'];
                $spendMap['pay_time'] = $userMap['register_time'];
                $user = M('user', 'tab_')->where($userMap)->save(array(SETTLEMENT_GRADE => 1));
                $spend = M('spend', 'tab_')->where($spendMap)->save(array(SETTLEMENT_GRADE => 1));
                $settData[$key] = $data;
            }
            $result = M('SonSettlement', 'tab_')->addAll($settData);
            if ($result) {
                /*$this->success('生成结算单成功!',U('son_earning?success=1',array('timestart' => $start,'timeend' => $end)),true);*/
                $this->success('生成结算单成功!', U('son_list'), true);
            } else {
                $this->error('生成结算单失败!', U('son_earning?fall=1', array('timestart' => $start, 'timeend' => $end)), true);
            }
        }

        $this->error('生成结算单失败!!!', U('son_earning?fall=1', array('timestart' => $start, 'timeend' => $end)), true);
    }


    //申请提现
    public function apply_withdraw($id, $op = 0)
    {
        $map['id'] = $id;
        $with = M("withdraw", "tab_");
        $totalSett = M("TotalSettlement", "tab_")->where($map)->find();
        $with_map['settlement_number'] = $totalSett['settlement_number'];
        $fid = $with->where($with_map)->find();
        if ($fid == null) {
            $add['settlement_number'] = $totalSett['settlement_number'];
            $add['sum_money'] = $totalSett['jie_money'] ? $totalSett['jie_money'] : $totalSett['sum_money'];
            $add['promote_id'] = $totalSett['promote_id'];
            $add['promote_account'] = $totalSett['promote_account'];
            $add['create_time'] = time();
            $add['status'] = 0;
            $with->add($add);
            M("TotalSettlement", "tab_")->where($map)->save(array('ti_status' => 0));
            $settMap['promote_id'] = $totalSett['promote_id'];
            $settMap['starttime'] = $totalSett['starttime'];
            $settMap['endtime'] = $totalSett['endtime'];
            $settMap['create_time'] = $totalSett['create_time'];
            M("settlement", "tab_")->where($settMap)->save(array('ti_status' => 0));
            echo json_encode(array("status" => 1));
        } else {
            if ($op > 0) {
                $with->where($with_map)->setField('status', 0);
                M("settlement", "tab_")->where($map)->setField('ti_status', 0);
                M("TotalSettlement", "tab_")->where($map)->save(array('ti_status' => 0));
                echo json_encode(array("status" => 1));
            } else {
                echo json_encode(array("status" => 0));
            }
        }
    }

    //申请提现
    public function son_apply_withdraw($settlement_number = '')
    {
        $map['settlement_number'] = $settlement_number;
        $with_map['settlement_number'] = $totalSett['settlement_number'];
        $result = M("SonSettlement", "tab_")->where($map)->save(array('ti_status' => 0));
        if ($result !== false) {
            echo json_encode(array("status" => 1));
        } else {
            echo json_encode(array("status" => 0));
        }
    }

    public function audit_withdraw($settlement_number = '')
    {
        $map['settlement_number'] = $settlement_number;
        $with_map['settlement_number'] = $totalSett['settlement_number'];
        $result = M("SonSettlement", "tab_")->where($map)->save(array('ti_status' => 1));
        if ($result !== false) {
            $this->success('审核成功');
        } else {
            $this->error('审核失败');
        }
    }

    private function getDayList($beginTime, $endTime)
    {
        $dayList = [];
        do {
            $dayList[] = date('Y-m-d', $beginTime);
            $beginTime += 24 * 60 * 60;
        } while ($beginTime < $endTime);

        return $dayList;
    }

    public function arpu()
    {
        $this->meta_title = 'ARPU统计';

        $defaultTime = date('Y-m-d', time() - 6 * 24 * 3600) . ' 至 ' . date('Y-m-d');

        $time = I('time', '');
        $time = $time == '' ? $defaultTime : $time;
        $sdkVersion = I('sdk_version', 0);
        $gameId = I('game_id', 0);
        $serverId = I('server_id', 0);
        $promoteId = I('promote_id', 0);
        $subPromoteId = I('sub_promote_id', 0);
        $promote = $this->getLoginPromote();
        $searchPromote = $promote;
        if ($promoteId > 0) {
            $searchPromote = M('promote', 'tab_')->where(['id' => $promoteId])->find();
        }
        if ($subPromoteId > 0) {
            $searchPromote = M('promote', 'tab_')->where(['id' => $subPromoteId])->find();
        }
        $map = [
            '_logic' => 'or',
            'id' => $searchPromote['id'],
            'parent_id' => $searchPromote['id'],
            'grand_id' => $searchPromote['id'],
        ];
        $ids = M('promote', 'tab_')->where($map)->getField('id', true);

        $subPromotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['parent_id' => $promote['id']])->select();
        $games = $this->getGamesByPromote($promote);

        $params = [];
        $searchGameName = '';
        $searchServerName = '';
        if ($gameId > 0) {
            $params['game_id'] = $gameId;
            $searchGameName = M('game', 'tab_')->where(['id' => $gameId])->getField('game_name');
        }
        if ($serverId > 0) {
            $params['server_id'] = $serverId;
            $searchServerName = M('server', 'tab_')->where(['server_id' => $serverId])->getField('server_name');
        }
        if ($sdkVersion > 0) {
            $params['sdk_version'] = $sdkVersion;
        }
        $params['promote_id'] = $ids;
        list($beginTime, $endTime) = $this->getBetweenTime($time);
        $params['begin_time'] = $beginTime;
        $params['end_time'] = $endTime;

        $dayList = $this->getDayList($beginTime, $endTime);
        $params['dayList'] = $dayList;

        $timeout = 0;
        $records = [];
        if (intval($endTime - $beginTime) / (24 * 3600) <= 30) {
            $userRepository = new UserRepository();
            $spendRepository = new SpendRepository();
            $payGameCountList = $spendRepository->getPayGameCountGroupByDay($params);
            $payUserCountList = $spendRepository->getPayUserCountGroupByDay($params);
            $newPayUserCountList = $spendRepository->getNewPayUserCountGroupByDay($params);
            $payAmountList = $spendRepository->getPayAmountGroupByDay($params);
            $newPayAmountList = $spendRepository->getNewPayAmountGroupByDay($params);
            $historyPayCountList = $spendRepository->getHistoryPayCountGroupByDay($params);
            $loginCountList = $userRepository->getLoginCountGroupByDay($params);
            $registerCountList = $userRepository->getRegisterCountGroupByDay($params);

            foreach ($dayList as $day) {
                $records[] = [
                    'day' => $day,
                    'payGameCount' => $payGameCountList[$day],
                    'payUserCount' => $payUserCountList[$day],
                    'newPayUserCount' => $newPayUserCountList[$day],
                    'payAmount' => number_format($payAmountList[$day], 2),
                    'newPayAmount' => number_format($newPayAmountList[$day], 2),
                    'historyPayCount' => $historyPayCountList[$day],
                    'loginCount' => $loginCountList[$day],
                    'registerCount' => $registerCountList[$day],
                    'payRate' => $loginCountList[$day] == 0 ? '--' : round($payUserCountList[$day] / $loginCountList[$day] * 100, 2) . '%',
                    'ratentionOneDay' => '--',
                    'arpu' => $loginCountList[$day] == 0 ? '0.00' : number_format(round($payAmountList[$day] / $loginCountList[$day], 2), 2),
                    'arppu' => $payUserCountList[$day] == 0 ? '0.00' : number_format(round($payAmountList[$day] / $payUserCountList[$day], 2), 2),
                ];
            }
        } else {
            $timeout = 1;
        }
        $this->assign('games', $games);
        $this->assign('subPromotes', $subPromotes);
        $this->assign('timeout', $timeout);
        $this->assign('records', $records);
        $this->assign('searchGameName', $searchGameName);
        $this->assign('searchServerName', $searchServerName);
        $this->assign('searchPromote', $searchPromote);
        $this->display();
    }

    public function gameArpu()
    {
        $promote = $this->getLoginPromote();
        $map = [
            '_logic' => 'or',
            'id' => $promote['id'],
            'parent_id' => $promote['id'],
            'grand_id' => $promote['id'],
        ];
        $ids = M('promote', 'tab_')->where($map)->getField('id', true);

        $time = I('time', date('Y-m-d'));
        $applys = M('Apply', 'tab_')->field('game_id, game_name')->where(['promote_id' => $promote['id']])->order('game_id desc')->select();
        $gameIds = array_column($applys, 'game_id');
        $applys = index_by_column('game_id', $applys);

        $params = [
            'begin_time' => strtotime($time . ' 00:00:00'),
            'end_time' => strtotime($time . ' 23:59:59'),
            'game_ids' => $gameIds,
            'promote_ids' => $ids,
        ];

        $userRepository = new UserRepository();
        $spendRepository = new SpendRepository();
        $payUserCountList = $spendRepository->getPayUserCountGroupByGame($params);
        $newPayUserCountList = $spendRepository->getNewPayUserCountGroupByGame($params);
        $payAmountList = $spendRepository->getPayAmountGroupByGame($params);
        $newPayAmountList = $spendRepository->getNewPayAmountGroupByGame($params);
        $historyPayCountList = $spendRepository->getHistoryPayCountGroupByGame($params);
        $loginCountList = $userRepository->getLoginCountGroupByGame($params);
        $registerCountList = $userRepository->getRegisterCountGroupByGame($params);

        foreach ($gameIds as $gameId) {
            $records[] = [
                'gameId' => $gameId,
                'gameName' => $applys[$gameId]['game_name'],
                'payUserCount' => $payUserCountList[$gameId],
                'newPayUserCount' => $newPayUserCountList[$gameId],
                'payAmount' => number_format($payAmountList[$gameId], 2),
                'newPayAmount' => number_format($newPayAmountList[$gameId], 2),
                'historyPayCount' => $historyPayCountList[$gameId],
                'loginCount' => $loginCountList[$gameId],
                'registerCount' => $registerCountList[$gameId],
                'payRate' => $loginCountList[$gameId] == 0 ? '--' : round($payUserCountList[$gameId] / $loginCountList[$gameId] * 100, 2) . '%',
                'ratentionOneDay' => '--',
                'arpu' => $loginCountList[$gameId] == 0 ? '0.00' : number_format(round($payAmountList[$gameId] / $loginCountList[$gameId], 2), 2),
                'arppu' => $payUserCountList[$gameId] == 0 ? '0.00' : number_format(round($payAmountList[$gameId] / $payUserCountList[$gameId], 2), 2),
            ];
        }

        $this->assign('records', $records);
        $this->display('gameArpu');
    }

    public function arpu_analysis()
    {
        $this->meta_title = "ARPU统计";
        A('User', 'Event')->arpu_analysis();
    }

    public function cha_userarpu($p = 0)
    {
        $page = intval($p);
        $page = $page ? $page : 1; //默认显示第一页数据arraypage
        $arraypage = $page ? $page : 1; //默认显示第一页数据
        $row = 10;

        if (isset($_REQUEST['row'])) {
            $row = $_REQUEST['row'];
        } else {
            $row = 10;
        }

        $time = $_REQUEST['time'];
        $promote_id = $_REQUEST['promote_id'];
        /* if ($promote_id <1) {
            $pid = D('Promote')->get_child_promote(PID,'id');
            if (empty($pid[0])) {
                $promote_id = PID;
            } else {
                $id = implode(',',array_column($pid,'id'));
                $promote_id = PID.','.$id;
            }
        } */

        $join = "left join tab_user u on u.fgame_id = tab_game.id";
        if ($time == '') {
            $this->error('参数错误,缺少时间');
        } else {
            $map['register_time'] = array('between', array(strtotime($time), strtotime($time) + 24 * 60 * 60 - 1));
        }
        /* if($promote_id!=''){
            $map_list['promote_id']=array('in',$promote_id);
            $map['promote_id']=array('in',$promote_id);
            $join .= " AND u.promote_id = {$promote_id}";
        } */

        if ($promote_id > 0) {
            if (PID == $promote_id) {
                $pro_arr[] = PID;
            } else {

                $pro_id1 = get_prmoote_chlid_account2($promote_id);
                $pro_arr = array_column($pro_id1, 'id');
                $pro_arr[] = $promote_id;
            }
            $map['promote_id'] = array('in', $pro_arr);
            $map_list['promote_id'] = array('in', $pro_arr);
            $promote_id = implode(',', $pro_arr);
            $join .= " AND u.promote_id in ({$promote_id})";
        } else {
            $pid = D('Promote')->get_child_promote(PID, 'id');
            if (empty($pid[0])) {
                $pro_arr[] = PID;
            } else {
                $pro_arr = array_column($pid, 'id');
                $pro_arr[] = PID;
            }

            $map['promote_id'] = array('in', $pro_arr);
            $map_list['promote_id'] = array('in', $pro_arr);
            $promote_id = implode(',', $pro_arr);
            $join .= " AND u.promote_id in ({$promote_id})";

        }
        $spend2 = D('Spend');
        $data = M('Apply', 'tab_')->field('game_id, game_name')->where(['promote_id' => $promote_id])->order('game_id desc')->select();
        foreach ($data as $key => $value) {
            $game_id = $value['game_id'];
            $map_list['game_id'] = $game_id;
            $user = M('User', 'tab_');
            $spend = M('spend', 'tab_');

            //新增人数
            $rdata = $user
                ->field('count(id) as register_num')
                ->where(array('fgame_id' => $game_id))
                ->where(array_merge($map, ['puid' => 0]))
                ->find();
            $data[$key]['register_num'] = $rdata['register_num'];
            //活跃玩家
            //$data[$key]['act_user'] = $this->count_act_user($time,$game_id,$promote_id);
            $activedata = D('User')->login_count_by_time(strtotime($time), strtotime($time) + 86399, $game_id, $promote_id);
            $data[$key]['act_user'] = $activedata[0]['login_num'] ? $activedata[0]['login_num'] : 0;
            //1日留存
            $mapl = $map_list;
            $mapl["FROM_UNIXTIME(register_time,'%Y-%m-%d')"] = $time;
            $mapl['tab_user.promote_id'] = $mapl['promote_id'];
            $mapl['tab_user.puid'] = 0;
            unset($mapl['promote_id']);
            $login_time = date('Y-m-d', strtotime("+1 day", strtotime($time)));
            $num = $user
                ->field('count(DISTINCT tab_user.id) as num')
                ->join("right join tab_user_login_record as ur on ur.user_id = tab_user.id and FROM_UNIXTIME(ur.login_time,'%Y-%m-%d') = '{$login_time}'")
                ->where($mapl)
                ->find();
            $data[$key]['keep_num'] = round($num['num'] / $data[$key]['register_num'], 4) * 100;
            //充值
            $mapl = $map_list;
            empty($game_name) || $mapl['game_name'] = array('like', '%' . $game_name . '%');

            $mapl['pay_status'] = 1;
            $mapl["FROM_UNIXTIME(pay_time,'%Y-%m-%d')"] = $time;
            if (I('bangbi') == 1) {
                $mapl['pay_way'] = array('neq', '-10');
                $bangbi = true;
            } else {
                $mapl['pay_way'] = array('neq', -1);
                $bangbi = false;
            }
            $spend = $spend->field("IFNULL(sum(pay_amount),0) as money,IFNULL(count(distinct user_id),0) as people")->where($mapl)->find();
            $data[$key]['spend'] = $spend['money'];
            //付费玩家数
            $data[$key]['spend_people'] = $spend['people'];
            //新付费玩家
            $newsdata = $spend2->pay_count_by_time_class([$time], $game_id, $promote_id, 1, $bangbi);
            $data[$key]['spend_news'] = $newsdata[0]['pay_num'] ? $newsdata[0]['pay_num'] : 0;
            //付费率
            $data[$key]['spend_rate'] = round($data[$key]['spend_people'] / $data[$key]['act_user'], 4) * 100;
            //ARPU
            $data[$key]['ARPU'] = round($data[$key]['spend'] / $data[$key]['act_user'], 2);
            //ARPPU
            $data[$key]['ARPPU'] = round($data[$key]['spend'] / $data[$key]['spend_people'], 2);
            if ($data[$key]['register_num'] == 0 && $data[$key]['act_user'] == 0 && $data[$key]['keep_num'] == 0 && $data[$key]['spend'] == 0 && $data[$key]['spend_people'] == 0) {
                unset($data[$key]);
            }
        }
        $count = count($data);
        /*         if($count > $row){
                    $page = new \Think\Page($count, $row);
                    $page->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');
                    $this->assign('_page', $page->show());
                } */

        /*$page = set_pagination($count,++$count);
        if($page) {$this->assign('_page', $page);}*/
        $this->assign('_page', '<div><span class="rows">共 ' . $count . ' 条记录</span></div>');

        /*$size=$row;//每页显示的记录数
        $pnum = ceil(count($data) / $size); //总页数,ceil()函数用于求大于数字的最小整数
        //用array_slice(array,offset,length) 函数在数组中根据条件取出一段值;array(数组),offset(元素的开始位置),length(组的长度)
        $data = array_slice($data, ($arraypage-1)*$size, $size);*/
        $this->assign('list_data', $data);
        $this->display();
    }


    /**
     * 获取活跃用户数
     * @param $time
     */
    public function count_act_user($time, $game_id = "", $promote_id = "")
    {
        $map["FROM_UNIXTIME(login_time,'%Y-%m-%d')"] = $time;
        $map1["FROM_UNIXTIME(register_time,'%Y-%m-%d')"] = $time;
        empty($game_id) || $map['game_id'] = $game_id;
        empty($game_id) || $map1['fgame_id'] = $game_id;
        if (!empty($promote_id)) {
            $user = M('User', 'tab_')->field('id')->where(array('promote_id' => $promote_id))->select();
            $user = implode(',', array_column($user, 'id'));
            $map['user_id'] = array('in', $user);
            $map1['id'] = array('in', $user);
        };
        $uudata = M('User', 'tab_')
            ->field('id')
            ->where($map1)
            ->select(false);
        $data = M('user_login_record', 'tab_')
            ->field('id')
            ->where($map)
            ->union($uudata)
            ->group('user_id')
            ->select();
        $data = count($data);
        return $data;
    }

    public function retention_analysis()
    {
        $this->meta_title = '留存统计';
        A('User', 'Event')->retention_analysis();

    }

    public function details()
    {
        $map['id'] = $_REQUEST['id'];
        $data = M('TotalSettlement', 'tab_')->where($map)->find();
        $mapSett['promote_id'] = $data['promote_id'];
        $mapSett['starttime'] = $data['starttime'];
        $mapSett['endtime'] = $data['endtime'];
        $mapSett['create_time'] = $data['create_time'];
        $listData = M('settlement', 'tab_')->where($mapSett)->select();
        $totalData = M('settlement', 'tab_')->where($mapSett)->sum('sum_money');
        $this->assign('list_data', $listData);
        $this->assign('total', $totalData);
        $this->display();
    }

    public function son_details()
    {
        $map['promote_id'] = $_REQUEST['promote_id'];
        $map['settlement_number'] = $_REQUEST['settlement_number'];
        $data = M('SonSettlement', 'tab_')->where($map)->select();
        $total = M('SonSettlement', 'tab_')->where($map)->sum('jie_money');
        $this->assign('total', floor($total * 100) / 100);
        $this->assign('list_data', $data);
        $this->display();
    }

    public function dailySummary()
    {
        $relationGameId = intval(I('relation_game_id', 0));
        $sdkVersion = intval(I('sdk_version', 0));
        $serverId = intval(I('server_id'), 0);
        $nowTime = date('Y-m-d');
        $initBegTime = date('Y-m-d', strtotime('-6 day', strtotime($nowTime)));
        $initBegTime = empty(I('begtime')) ? $initBegTime : I('begtime');
        $initEndTime = $nowTime;
        $initEndTime = empty(I('endtime')) ? $initEndTime : I('endtime');
        $begTime = strtotime($initBegTime);
        $endTime = strtotime($initEndTime);
        $levelPromote = $this->getLevelPromote();
        $queryPromote = $this->getQueryPromote($levelPromote);

        $loginPromote = $this->getLoginPromote();

        $map = [];
        $ownId = intval(I('own_id'), 0);//本账号
        if ($ownId) {
            $userPlayInfoWhere['tab_user_play_info.promote_id'] = $queryPromote['id'];
            $userPlayInfoWhere2['ti.promote_id'] = $queryPromote['id'];
            $userGameLoginWhere['tab_user_game_login_record.promote_id'] = $queryPromote['id'];
            $spendWhere['tab_spend.promote_id'] = $queryPromote['id'];
        } else {
            $map['chain'] = ['like', $queryPromote['chain'] . $queryPromote['id'] . '/%'];
            $ids = M('promote', 'tab_')->where($map)->getField('id', true);
            $ids[] = $queryPromote['id'];

            $userPlayInfoWhere['tab_user_play_info.promote_id'] = ['in', $ids];
            $userPlayInfoWhere2['ti.promote_id'] = ['in', $ids];
            $userGameLoginWhere['tab_user_game_login_record.promote_id'] = ['in', $ids];
            $spendWhere['tab_spend.promote_id'] = ['in', $ids];
        }
        $map = [];
        $map['_string'] = '1 = 1';
        $join = '';
        if ($relationGameId > 0) {
            $map['tab_game.relation_game_id'] = I('relation_game_id');
            $join = 'tab_game on game_id = tab_game.id';
        }
        if ($sdkVersion > 0) {
            $userPlayInfoWhere['tab_user_play_info.sdk_version'] = $sdkVersion;
            $userPlayInfoWhere2['ti.sdk_version'] = $sdkVersion;
            $userGameLoginWhere['tab_user_game_login_record.sdk_version'] = $sdkVersion;
            $spendWhere['tab_spend.sdk_version'] = $sdkVersion;
        }
        $spendWhere['tab_spend.pay_status'] = 1;
        if ($serverId > 0) {
            $userPlayInfoWhere['tab_user_play_info.server_id'] = $serverId;
            $userPlayInfoWhere2['ti.server_id'] = $serverId;
            $userGameLoginWhere['tab_user_game_login_record.server_id'] = $serverId;
            $spendWhere['tab_spend.server_id'] = $serverId;
        }

        $userPlayInfoModel = M('UserPlayInfo', 'tab_');

        $summaryData = [];
        $data = [];
        $dataNum = ($endTime - $begTime) / 86400 + 1;
        $dateTime = $endTime;
        for ($index = 0; $index < $dataNum; $index++) {
            $thisDateTime = date('Ymd', $dateTime);
            $summaryData['date'][] = $thisDateTime;
            $data[]['day'] = $thisDateTime;
            $dateTime = strtotime('-1 day', $dateTime);
        }

        $allData['role_num'] = 0;
        $allData['user_num'] = 0;
        $allData['new_user_num'] = 0;
        $allData['new_device_num'] = 0;
        $allData['new_ip_num'] = 0;
        $allData['login_user_num'] = 0;
        $allData['spend_user_num'] = 0;
        $allData['spend_num'] = 0;
        $allData['spend_all_amount'] = 0;
        $allData['spend_cash'] = 0;
        $allData['spend_generic'] = 0;
        $allData['pay_amount'] = 0;
        $allData['spend_discount'] = 0;
        $allData['spend_voucher'] = 0;
        foreach ($data as &$list) {
            $thisDateTime = strtotime($list['day']);
            $userPlayInfoWhere['tab_user_play_info.create_time'] = ['between', [$thisDateTime, $thisDateTime + 86399]];
            $userGameLoginWhere['tab_user_game_login_record.login_time'] = ['between', [$thisDateTime, $thisDateTime + 86399]];
            $spendWhere['tab_spend.pay_time'] = ['between', [$thisDateTime, $thisDateTime + 86399]];

            $list['role_num'] = $userPlayInfoModel
                ->join($join)
                ->where($userPlayInfoWhere)
                ->where($map)
                ->order('play_time desc')
                ->count();//创角数
            $list['user_num'] = count($userPlayInfoModel
                ->join($join)
                ->where($userPlayInfoWhere)
                ->where($map)
                ->group('tab_user_play_info.game_id,tab_user_play_info.user_id')
                ->select());//创角用户

            $newUserNumSql = $userPlayInfoModel
                ->table('tab_user_play_info as ti')
                ->where($userPlayInfoWhere2)
                ->where('ti.user_id = tab_user_play_info.user_id and ti.game_id = tab_user_play_info.game_id and ti.create_time < ' . $thisDateTime)
                ->fetchSql(true)
                ->count();
            $newUserNumData = $userPlayInfoModel
                ->field('tab_user_play_info.create_time,(' . $newUserNumSql . ') as num')
                ->join($join)
                ->where($userPlayInfoWhere)
                ->where($map)
                ->group('tab_user_play_info.user_id')
                ->having('num = 0')
                ->order('tab_user_play_info.id')
                ->select();
            $list['new_user_num'] = count($newUserNumData);//新创角用户

            $newDeviceSql = $userPlayInfoModel
                ->table('tab_user_play_info as ti')
                ->where($userPlayInfoWhere2)
                ->where('ti.create_device_number = tab_user_play_info.create_device_number and ti.game_id = tab_user_play_info.game_id and ti.create_time < ' . $thisDateTime)
                ->fetchSql(true)
                ->count();
            $newDeviceData = $userPlayInfoModel
                ->field('tab_user_play_info.create_time,(' . $newDeviceSql . ') as num')
                ->join($join)
                ->where($userPlayInfoWhere)
                ->where($map)
                ->group('tab_user_play_info.create_device_number')
                ->having('num = 0')
                ->order('tab_user_play_info.id')
                ->select();
            $list['new_device_num'] = count($newDeviceData);//新创角设备

            $newIpNumSql = $userPlayInfoModel
                ->table('tab_user_play_info as ti')
                ->where($userPlayInfoWhere2)
                ->where('ti.create_ip = tab_user_play_info.create_ip and ti.game_id = tab_user_play_info.game_id and ti.create_time < ' . $thisDateTime)
                ->fetchSql(true)
                ->count();
            $newIpNumData = $userPlayInfoModel
                ->field('tab_user_play_info.create_time,(' . $newIpNumSql . ') as num')
                ->join($join)
                ->where($userPlayInfoWhere)
                ->where($map)
                ->group('tab_user_play_info.create_ip')
                ->having('num = 0')
                ->order('tab_user_play_info.id')
                ->select();
            $list['new_ip_num'] = count($newIpNumData);//新增创角IP

            $list['login_user_num'] = count(M('UserGameLoginRecord', 'tab_')
                ->join($join)
                ->where($userGameLoginWhere)
                ->where($map)
                ->group('tab_user_game_login_record.game_id,tab_user_game_login_record.user_id')
                ->select());//登录用户数

            $list['spend_user_num'] = count(M('Spend', 'tab_')
                ->join($join)
                ->where($spendWhere)
                ->where($map)
                ->group('tab_spend.game_id,tab_spend.user_id')
                ->select());//充值人数
            $list['spend_num'] = M('Spend', 'tab_')
                ->join($join)
                ->where($spendWhere)
                ->where($map)
                ->count();//充值次数
            $list['spend_all_amount'] = M('Spend', 'tab_')
                ->join($join)
                ->where($spendWhere)
                ->where($map)
                ->sum('tab_spend.pay_amount');//充值总额
            $list['spend_all_amount'] = empty($list['spend_all_amount']) ? 0 : $list['spend_all_amount'];

            $list['spend_cash'] = M('Spend', 'tab_')
                ->join($join)
                ->where($spendWhere)
                ->where($map)
                ->where(array('tab_spend.pay_way' => ['in', '1,2,3,4,5,6']))
                ->sum('tab_spend.pay_amount');//现金充值
            $list['spend_cash'] = empty($list['spend_cash']) ? 0 : $list['spend_cash'];

            $list['spend_generic'] = M('Spend', 'tab_')
                ->join($join)
                ->where($spendWhere)
                ->where($map)
                ->where(array('tab_spend.pay_way' => 0))
                ->sum('tab_spend.pay_amount');//通用币
            $list['spend_generic'] = empty($list['spend_generic']) ? 0 : $list['spend_generic'];

            $list['spend_binding'] = M('Spend', 'tab_')
                ->join($join)
                ->where($spendWhere)
                ->where($map)
                ->where(array('tab_spend.pay_way' => -1))
                ->sum('tab_spend.pay_amount');//绑定币
            $list['spend_binding'] = empty($list['spend_binding']) ? 0 : $list['spend_binding'];

            $list['spend_discount'] = 0;//折扣币
            $list['spend_voucher'] = 0;//代金券

            $allData['role_num'] += $list['role_num'];
            $allData['user_num'] += $list['user_num'];
            $allData['new_user_num'] += $list['new_user_num'];
            $allData['new_device_num'] += $list['new_device_num'];
            $allData['new_ip_num'] += $list['new_ip_num'];
            $allData['login_user_num'] += $list['login_user_num'];
            $allData['spend_user_num'] += $list['spend_user_num'];
            $allData['spend_num'] += $list['spend_num'];
            $allData['spend_all_amount'] = bcadd($allData['spend_all_amount'], $list['spend_all_amount'], 2);
            $allData['spend_cash'] = bcadd($allData['spend_cash'], $list['spend_cash'], 2);
            $allData['spend_generic'] = bcadd($allData['spend_generic'], $list['spend_generic'], 2);
            $allData['spend_binding'] = bcadd($allData['spend_binding'], $list['spend_binding'], 2);
            $allData['spend_discount'] = bcadd($allData['spend_discount'], $list['spend_discount'], 2);
            $allData['spend_voucher'] = bcadd($allData['spend_voucher'], $list['spend_voucher'], 2);

            $summaryData['role_num'][] = $list['role_num'];
            $summaryData['user_num'][] = $list['user_num'];
            $summaryData['new_user_num'][] = $list['new_user_num'];
            $summaryData['new_device_num'][] = $list['new_device_num'];
            $summaryData['spend_user_num'][] = $list['spend_user_num'];
            $summaryData['spend_all_amount'][] = $list['spend_all_amount'];
        }

        $summaryData['date'] = array_reverse($summaryData['date']);
        $summaryData['role_num'] = array_reverse($summaryData['role_num']);
        $summaryData['user_num'] = array_reverse($summaryData['user_num']);
        $summaryData['new_user_num'] = array_reverse($summaryData['new_user_num']);
        $summaryData['new_device_num'] = array_reverse($summaryData['new_device_num']);
        $summaryData['spend_user_num'] = array_reverse($summaryData['spend_user_num']);
        $summaryData['spend_all_amount'] = array_reverse($summaryData['spend_all_amount']);

        $serverData = $this->getServer($relationGameId, $sdkVersion);

        $this->assign('meta_title', '每日概况');
        $this->assign('loginPromote', $loginPromote);
        $this->assign('ownId', $ownId);
        $this->assign('listData', $data);
        $this->assign('allData', $allData);
        $this->assign('summaryData', $summaryData);
        $this->assign('setdate', date("Y-m-d"));
        $this->assign('initBegTime', $initBegTime);
        $this->assign('initEndTime', $initEndTime);
        $this->assign('serverData', $serverData['data']);
        $this->display();
    }

    public function summary()
    {
        $page = intval(I('get.p', 1));
        $page = $page ? $page : 1; //默认显示第一页数据arraypage
        $row = intval(I('get.row', 10));
        $relationGameId = intval(I('relation_game_id', 0));
        $sdkVersion = intval(I('sdk_version', 0));
        $serverId = intval(I('server_id'), 0);
        $nowTime = date('Y-m-d');
        $initBegTime = date('Y-m-d', strtotime('-6 day', strtotime($nowTime)));
        $initBegTime = empty(I('begtime')) ? $initBegTime : I('begtime');
        $initEndTime = $nowTime;
        $initEndTime = empty(I('endtime')) ? $initEndTime : I('endtime');
        $begTime = strtotime($initBegTime);
        $endTime = strtotime($initEndTime);
        $levelPromote = $this->getLevelPromote();
        $queryPromote = $this->getQueryPromote($levelPromote);

        empty($relationGameId) || $parameter['relation_game_id'] = $relationGameId;
        empty($sdkVersion) || $parameter['sdk_version'] = $sdkVersion;
        empty($serverId) || $parameter['server_id'] = $serverId;
        $parameter['level_promote_2'] = $levelPromote[0];
        $parameter['level_promote_3'] = $levelPromote[1];
        $parameter['level_promote_4'] = $levelPromote[2];
        $parameter['begtime'] = $initBegTime;
        $parameter['endtime'] = $initEndTime;
        $parameter['p'] = $page;
        $parameter['row'] = $row;

        $loginPromote = $this->getLoginPromote();

        $map = [];
        $ownId = intval(I('own_id'), 0);//本账号
        if ($ownId) {
            $map['a.promote_id'] = $queryPromote['id'];
            $userPlayInfoMap['tab_user_play_info.promote_id'] = $queryPromote['id'];
            $userGameLoginMap['tab_user_game_login_record.promote_id'] = $queryPromote['id'];
            $spendMap['tab_spend.promote_id'] = $queryPromote['id'];
        } else {
            $map['chain'] = ['like', $queryPromote['chain'] . $queryPromote['id'] . '/%'];
            $ids = M('promote', 'tab_')->where($map)->getField('id', true);
            $ids[] = $queryPromote['id'];

            $map = [];
            $map['a.promote_id'] = ['in', $ids];
            $userPlayInfoMap['tab_user_play_info.promote_id'] = ['in', $ids];
            $userGameLoginMap['tab_user_game_login_record.promote_id'] = ['in', $ids];
            $spendMap['tab_spend.promote_id'] = ['in', $ids];
        }
        if ($relationGameId > 0) {
            $map['g.relation_game_id'] = $relationGameId;
        }
        if ($sdkVersion > 0) {
            $map['a.sdk_version'] = $sdkVersion;
        }
        $serverJoin = '';
        if ($serverId > 0) {
            $serverJoin = 'tab_server as s on s.game_id = a.game_id';
            $map['s.server_id'] = $serverId;
            $userPlayInfoMap['tab_user_play_info.server_id'] = $serverId;
            $userGameLoginMap['tab_user_game_login_record.server_id'] = $serverId;
            $spendMap['tab_spend.server_id'] = $serverId;
        }

        $userPlayInfoMap2 = $userPlayInfoMap;
        $userPlayInfoMap['tab_user_play_info.create_time'] = ['between', [$begTime, $endTime + 86399]];
        $userGameLoginMap['tab_user_game_login_record.login_time'] = ['between', [$begTime, $endTime + 86399]];
        $spendMap['tab_spend.pay_time'] = ['between', [$begTime, $endTime + 86399]];
        $spendMap['tab_spend.pay_status'] = 1;
        $userPlayInfoModel = M('UserPlayInfo', 'tab_');
        $userGameLoginModel = M('UserGameLoginRecord', 'tab_');
        $spendModel = M('Spend', 'tab_');

        $data = M('Apply', 'tab_')->alias('a')
            ->field('a.game_id,a.game_name,a.sdk_version')
            ->join('tab_game as g on g.id = a.game_id')
            ->join($serverJoin)
            ->where($map)
            ->group('a.game_id')
            ->order('g.sort desc,g.id desc')
            ->page($page, $row)
            ->select();
        $count = M('Apply', 'tab_')->alias('a')
            ->join('tab_game as g on g.id = a.game_id')
            ->join($serverJoin)
            ->where($map)
            ->count('distinct a.game_id');

        $allData['role_num'] = 0;
        $allData['user_num'] = 0;
        $allData['new_user_num'] = 0;
        $allData['new_device_num'] = 0;
        $allData['new_ip_num'] = 0;
        $allData['login_user_num'] = 0;
        $allData['spend_user_num'] = 0;
        $allData['spend_num'] = 0;
        $allData['spend_all_amount'] = 0;
        $allData['spend_cash'] = 0;
        $allData['spend_generic'] = 0;
        $allData['pay_amount'] = 0;
        $allData['spend_discount'] = 0;
        $allData['spend_voucher'] = 0;
        if (!empty($data)) {
            foreach ($data as &$list) {
                $userPlayInfoMap['tab_user_play_info.game_id'] = $list['game_id'];
                $userPlayInfoMap2['tab_user_play_info.game_id'] = $list['game_id'];
                $userGameLoginMap['tab_user_game_login_record.game_id'] = $list['game_id'];
                $spendMap['tab_spend.game_id'] = $list['game_id'];

                $list['role_num'] = $userPlayInfoModel
                    ->where($userPlayInfoMap)
                    ->count();//创角数

                $list['user_num'] = $userPlayInfoModel
                    ->where($userPlayInfoMap)
                    ->count('distinct tab_user_play_info.user_id');//创角用户

                $newUserNumData = $userPlayInfoModel
                    ->field('tab_user_play_info.create_time')
                    ->where($userPlayInfoMap2)
                    ->group('tab_user_play_info.user_id')
                    ->having('tab_user_play_info.create_time between ' . $begTime . ' and ' . ($endTime + 86399))
                    ->order('tab_user_play_info.id')
                    ->select();
                $list['new_user_num'] = count($newUserNumData);//新创角用户

                $newDeviceData = $userPlayInfoModel
                    ->field('tab_user_play_info.create_time')
                    ->where($userPlayInfoMap2)
                    ->group('tab_user_play_info.create_device_number')
                    ->having('tab_user_play_info.create_time between ' . $begTime . ' and ' . ($endTime + 86399))
                    ->order('tab_user_play_info.id')
                    ->select();
                $list['new_device_num'] = count($newDeviceData);//新创角设备

                $newIpData = $userPlayInfoModel
                    ->field('tab_user_play_info.create_time')
                    ->where($userPlayInfoMap2)
                    ->group('tab_user_play_info.create_ip')
                    ->having('tab_user_play_info.create_time between ' . $begTime . ' and ' . ($endTime + 86399))
                    ->order('tab_user_play_info.id')
                    ->select();
                $list['new_ip_num'] = count($newIpData);//新增创角IP

                $list['login_user_num'] = count($userGameLoginModel
                    ->where($userGameLoginMap)
                    ->group('tab_user_game_login_record.game_id,tab_user_game_login_record.user_id')
                    ->select());//登录用户数

                $list['spend_user_num'] = $spendModel
                    ->where($spendMap)
                    ->count('distinct tab_spend.user_id');//充值人数

                $list['spend_num'] = $spendModel
                    ->where($spendMap)
                    ->count();//充值次数

                $list['spend_all_amount'] = $spendModel
                    ->where($spendMap)
                    ->sum('tab_spend.pay_amount');//充值总额

                $list['spend_cash'] = $spendModel
                    ->where($spendMap)
                    ->where(array('tab_spend.pay_way' => ['in', '1,2,3,4,5,6']))
                    ->sum('tab_spend.pay_amount');//现金充值

                $list['spend_generic'] = $spendModel
                    ->where($spendMap)
                    ->where(array('tab_spend.pay_way' => 0))
                    ->sum('tab_spend.pay_amount');//通用币

                $list['spend_binding'] = $spendModel
                    ->where($spendMap)
                    ->where(array('tab_spend.pay_way' => -1))
                    ->sum('tab_spend.pay_amount');//绑定币

                $list['spend_discount'] = 0;//折扣币
                $list['spend_voucher'] = 0;//代金券

                $allData['role_num'] += $list['role_num'];
                $allData['user_num'] += $list['user_num'];
                $allData['new_user_num'] += $list['new_user_num'];
                $allData['new_device_num'] += $list['new_device_num'];
                $allData['new_ip_num'] += $list['new_ip_num'];
                $allData['login_user_num'] += $list['login_user_num'];
                $allData['spend_user_num'] += $list['spend_user_num'];
                $allData['spend_num'] += $list['spend_num'];
                $allData['spend_all_amount'] = bcadd($allData['spend_all_amount'], $list['spend_all_amount'], 2);
                $allData['spend_cash'] = bcadd($allData['spend_cash'], $list['spend_cash'], 2);
                $allData['spend_generic'] = bcadd($allData['spend_generic'], $list['spend_generic'], 2);
                $allData['spend_binding'] = bcadd($allData['spend_binding'], $list['spend_binding'], 2);
                $allData['spend_discount'] = bcadd($allData['spend_discount'], $list['spend_discount'], 2);
                $allData['spend_voucher'] = bcadd($allData['spend_voucher'], $list['spend_voucher'], 2);
            }
        }

        $serverData = $this->getServer($relationGameId, $sdkVersion);

        $page = set_pagination($count, $row, $parameter);
        if ($page) {
            $this->assign('_page', $page);
        }
        $this->assign('meta_title', '数据汇总列表');
        $this->assign('loginPromote', $loginPromote);
        $this->assign('ownId', $ownId);
        $this->assign('allData', $allData);
        $this->assign('listData', $data);
        $this->assign('count', $count);
        $this->assign('setdate', date("Y-m-d"));
        $this->assign('initBegTime', $initBegTime);
        $this->assign('initEndTime', $initEndTime);
        $this->assign('serverData', $serverData['data']);
        $this->display();
    }

    public function dabiao_game()
    {

        if (isset($_REQUEST['game_id']) && !empty($_REQUEST['game_id'])) {
            $game_id = M('game', 'tab_')->field('id')->where(array('relation_game_id' => $_REQUEST['game_id']))->select();
            $game_id = array_map('array_shift', $game_id);
            $gmap['game_id'] = array('in', $game_id);
            //unset($_REQUEST['game_id']);
        }

        if (isset($_REQUEST['server_name']) && !empty($_REQUEST['server_name'])) {
            $dmap['server_name'] = $_REQUEST['server_name'];
            unset($_REQUEST['server_name']);
        }

        if (isset($_REQUEST['server_id']) && !empty($_REQUEST['server_id'])) {
            $dmap['server_id'] = $_REQUEST['server_id'];
            unset($_REQUEST['server_id']);
        }

        if (isset($_REQUEST['game_level']) && !empty($_REQUEST['game_level'])) {
            $gamedata = M('game', 'tab_')->field('first_level,first_level_name,second_level_name,second_level,third_level,third_level_name')->where(array('relation_game_id' => $_REQUEST['game_id']))->find();
            if ($gamedata['first_level_name'] == $_REQUEST['game_level']) {
                $dmap['role_level'] = array('egt', $gamedata['first_level']);
            } elseif ($gamedata['second_level_name'] == $_REQUEST['game_level']) {
                $dmap['role_level'] = array('egt', $gamedata['second_level']);
            } elseif ($gamedata['third_level_name'] == $_REQUEST['game_level']) {
                $dmap['role_level'] = array('egt', $gamedata['third_level']);
            }
            unset($_REQUEST['game_level']);
        }

        if (isset($_REQUEST['begtime']) && isset($_REQUEST['endtime']) && !empty($_REQUEST['begtime']) && !empty($_REQUEST['endtime'])) {
            $dmap['play_time'] = array('BETWEEN', [strtotime($_REQUEST['begtime']), strtotime($_REQUEST['endtime']) + 86400]);
            unset($_REQUEST['begtime']);
            unset($_REQUEST['endtime']);
        } elseif (isset($_REQUEST['begtime']) && !empty($_REQUEST['begtime'])) {
            $dmap['play_time'] = array('BETWEEN', [strtotime($_REQUEST['begtime']), date("Y-m-d", strtotime("-1 day"))]);
            unset($_REQUEST['begtime']);
        } elseif (isset($_REQUEST['endtime']) && !empty($_REQUEST['endtime'])) {
            $dmap['play_time'] = array('ELT', strtotime($_REQUEST['endtime']) + 86400);
            unset($_REQUEST['endtime']);
        }
        $promote = $_REQUEST['promote_id'];

        if (PID == $promote) {

        } else {

            $pids = get_prmoote_chlid_account($promote);
            $pro_arr = array_column($pids, 'id');
            $pro_arr[] = $promote;
            $promote = implode(',', $pro_arr);

        }

        $game = M('apply', 'tab_')
            ->field('game_id,game_name')
            ->where($gmap)
            ->where(array('promote_id' => array('in', $promote), 'status' => 1))
            ->group('game_id')
            ->select();
        $game_count = count($game);
        for ($y = 0; $y <= $game_count; $y++) {
            $game_level = M('game', 'tab_')->field('first_level')->where(array('id' => $game[$y]['game_id']))->find();
            if ($dmap['role_level']) {
                $game_level['first_level'] = $dmap['role_level'][1];
            }
            $gdabiao = M('user_play_info', 'tab_')
                ->field('user_id')
                ->where($dmap)
                ->where(array('game_id' => $game[$y]['game_id'], 'role_level' => array('egt', $game_level['first_level']), 'promote_id' => array('in', $promote)))
                ->group('user_id')
                ->select();
            $gdabiao = count($gdabiao);
            $game[$y]['num'] = $gdabiao;
            if ($game[$y]['num'] == 0) {
                unset($game[$y]);
            }
        }
        $this->assign('list_data', $game);
        $this->display();
    }

    private function map_game_list()
    {
        $uid = session('promote_auth.pid');
        $map['tab_game.game_status'] = 1;
        $map['tab_apply.status'] = 1;
        $promote = $this->get_child_promote();
        array_push($promote, $uid);
        $map['tab_promote.id'] = array('in', $promote);
        $data = M('game', 'tab_')
            ->field('relation_game_name,relation_game_id')
            ->join('tab_apply on tab_apply.game_id = tab_game.id')
            ->join('tab_promote ON tab_apply.promote_id = tab_promote.id')
            ->where($map)
            ->group('relation_game_id')
            ->select();
        $this->assign("game_list", $data);
    }

    public function getServerAjax()
    {
        $serverData = $this->getServer(I('relation_game_id'), I('sdk_version'));

        $this->ajaxReturn($serverData);
    }

    public function getServer($relationGameId, $sdkVersion)
    {
        $result['status'] = 0;
        $result['data'] = [];

        if (empty($relationGameId)) {
            return $result;
        }

        $map['relation_game_id'] = intval($relationGameId);
        empty($sdkVersion) || $map['sdk_version'] = intval($sdkVersion);

        $gameIds = M('Game', 'tab_')
            ->where($map)
            ->getField('id', true);

        if (empty($gameIds)) {
            return $result;
        }

        $gameIds = implode(',', $gameIds);
        $where['game_id'] = ['in', $gameIds];
        $where['show_status'] = 1;

        $serverData = M('Server', 'tab_')
            ->field('server_id,server_name')
            ->where($where)
            ->order('server_version,start_time desc')
            ->select();
        $result['status'] = 1;
        $result['data'] = $serverData;

        return $result;
    }

    public function get_child_promote()
    {
        $uid = session('promote_auth.pid');
        $map['parent_id'] = $uid;
        $map['status'] = 1;
        $data = M('promote', 'tab_')
            ->field('id')
            ->where($map)
            ->select();
        return array_map('array_shift', $data);
    }

    //查看角色详情
    public function viewRole($p = 0)
    {
        $promoteId = D('User')->where('id = %d', I('get.id'))->getField('promote_id');
        $permission = hasPromotePermission(PID, $promoteId);//是否有该推广员权限

        if ($permission === false) {
            $this->error('无推广员权限');
        }

        $page = intval($p);
        $page = $page ? $page : 1; //默认显示第一页数据arraypage

        if (isset($_REQUEST['row'])) {
            $row = $_REQUEST['row'];
        } else {
            $row = 10;
        }

        if (!empty(I('begtime')) && empty(I('endtime'))) {
            $map['tab_user_play_info.play_time'] = ['egt', strtotime(I('begtime'))];
        } elseif (empty(I('begtime')) && !empty(I('endtime'))) {
            $map['tab_user_play_info.play_time'] = ['elt', strtotime(I('endtime')) + 86399];
        } elseif (!empty(I('begtime')) && !empty(I('endtime'))) {
            $map['tab_user_play_info.play_time'] = ['between', [strtotime(I('begtime')), strtotime(I('endtime')) + 86399]];
        }

        empty(I('relation_game_id')) || $map['tab_game.relation_game_id'] = I('relation_game_id');
        empty(I('sdk_version')) || $map['tab_game.sdk_version'] = I('sdk_version');
        empty(I('server_id')) || $map['tab_user_play_info.server_id'] = I('server_id');
        empty(I('role_name')) || $map['tab_user_play_info.role_name'] = ['like', '%' . I('role_name') . '%'];
        $map['tab_user_play_info.user_id'] = I('get.id');
        $map['tab_user_play_info.promote_id'] = $promoteId;

        $data = M('user_play_info', 'tab_')
            ->field('tab_user_play_info.user_account,tab_user_play_info.game_name,tab_user_play_info.sdk_version,tab_user_play_info.play_time,tab_user_play_info.server_name,tab_user_play_info.role_name')
            ->join('tab_game on tab_user_play_info.game_id = tab_game.id')
            ->where($map)
            ->order('tab_user_play_info.id desc')
            ->page($page, $row)
            ->select();

        $count = M('user_play_info', 'tab_')
            ->where($map)
            ->join('tab_game on tab_user_play_info.game_id = tab_game.id')
            ->count();

        if (!empty($data)) {
            foreach ($data as &$list) {
                $list['user_account'] = substr($list['user_account'], 0, 2) . '******' . substr($list['user_account'], 8);
            }
        }

        //分页
        $parameter['p'] = I('get.p', 1);
        $parameter['row'] = I('get.row');
        $parameter['id'] = I('get.id');
        empty(I('relation_game_id')) || $parameter['relation_game_id'] = I('relation_game_id');
        empty(I('sdk_version')) || $parameter['sdk_version'] = I('sdk_version');
        empty(I('server_id')) || $parameter['server_id'] = I('server_id');
        empty(I('role_name')) || $parameter['role_name'] = I('role_name');
        empty(I('begtime')) || $parameter['begtime'] = I('begtime');
        empty(I('endtime')) || $parameter['endtime'] = I('endtime');

        $page = set_pagination($count, $row, $parameter);
        if ($page) {
            $this->assign('_page', $page);
        }

        $serverData = $this->getServer(I('relation_game_id'), I('sdk_version'));

        $this->assign('listData', $data);
        $this->assign('count', $count);
        $this->assign('setdate', date("Y-m-d"));
        $this->assign('serverData', $serverData['data']);
        $this->meta_title = '角色详情';
        $this->display('view_role');
    }

    public function users()
    {
        $promote = $this->getLoginPromote();
        $promoteId = $promote['id'];
        $map = [
            '_logic' => 'or',
            'id' => $promoteId,
            'parent_id' => $promoteId,
            'grand_id' => $promoteId,
        ];
        $ids = M('promote', 'tab_')->where($map)->getField('id', true);

        $promotes = [];
        $groupPromotes = [];
        if ($promote['parent_id'] == 0) {
            $groupPromotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['parent_id' => $promoteId])->select();
            $promotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['grand_id' => $promoteId])->select();
        }
        if ($promote['parent_id'] > 0 && $promote['grand_id'] == 0) {
            $promotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['parent_id' => $promoteId])->select();
        }

        $fields = [
            'id', 'account', 'promote_account', 'promote_id', 'device_number', 'register_time', 'register_ip', 'login_time', 'login_ip', 'device_type'
        ];
        $query = M('user', 'tab_')->field($fields)->where(['promote_id' => ['in', $ids]]);
        list($records, $pagination, $count) = $this->paginate($query);

        $this->assign('promotes', $promotes);
        $this->assign('groupPromotes', $groupPromotes);
        $this->assign('records', $records);
        $this->assign('pagination', $pagination);
        $this->assign('count', $count);
        $this->display();
    }

    private function getLevelPromote()
    {
        $levelPromote = [];
        $levelPromote[] = I('level_promote_2', 0);
        $levelPromote[] = I('level_promote_3', 0);
        $levelPromote[] = I('level_promote_4', 0);
        return $levelPromote;
    }

    private function getQueryPromote($levelPromote)
    {
        $queryPromote = null;
        $promote = $this->getLoginPromote();
        $queryPromoteId = 0;
        foreach ($levelPromote as $item) {
            if ($item != 0) {
                $queryPromoteId = $item;
            }
        }
        if ($queryPromoteId == 0) {
            $queryPromote = $this->getLoginPromote();
        } else {
            $queryPromote = M('promote', 'tab_')->where(['id' => $queryPromoteId])->find();
        }
        return $queryPromote;
    }

    public function userRoles()
    {
        $gameId = I('game_id', 0);
        $serverId = I('server_id', 0);
        $isSelf = I('is_self', 0);
        $roleName = I('role_name', '');
        $userAccount = I('user_account', '');
        $promoteId = I('promote_id', 0);
        $sdkVersion = I('sdk_version', 0);
        $roleLevelBegin = intval(I('role_level_begin', 0));
        $roleLevelEnd = intval(I('role_level_end', 0));
        $headmanPromoteId = I('headman_promote_id', 0);
        $createTime = I('create_time', '');

        $promote = $this->getLoginPromote();
        $levelPromote = $this->getLevelPromote();
        $queryPromote = $this->getQueryPromote($levelPromote);

        $map[] = [
            '_logic' => 'or',
            'id' => $queryPromote['id'],
            'chain' => ['like', $queryPromote['chain'] . $queryPromote['id'] . '/%']
        ];
        $ids = M('promote', 'tab_')->where($map)->getField('id', true);

        $map = [];
        if (count($ids) > 0) {
            $map = ['promote_id' => ['in', $ids]];
        } else {
            $map['_string'] = '1<>1';
        }

        if ($gameId != 0) {
            $map['game_id'] = $gameId;
        }
        if ($serverId != 0) {
            $map['server_id'] = $serverId;
        }
        if ($roleName != '') {
            $map['role_name'] = ['like', '%' . $roleName . '%'];
        }
        if ($userAccount != '') {
            $map['user_account'] = ['like', '%' . $userAccount . '%'];
        }
        if ($sdkVersion != 0) {
            $map['sdk_version'] = $sdkVersion;
        }
        if ($roleLevelBegin != 0 && $roleLevelEnd == 0) {
            $map['role_level'] = ['egt', $roleLevelBegin];
        } elseif ($roleLevelEnd != 0 && $roleLevelBegin == 0) {
            $map['role_level'] = ['elt', $roleLevelEnd];
        } elseif ($roleLevelEnd != 0 && $roleLevelBegin != 0) {
            $map['role_level'] = ['between', [$roleLevelBegin, $roleLevelEnd]];
        }
        if ($createTime != '') {
            $createTimeRow = explode(' 至 ', $createTime);
            $createTimeBegin = 0;
            $createTimeEnd = 0;
            if (count($createTimeRow) == 2) {
                $createTimeBegin = strtotime($createTimeRow[0] . ' 00:00:00');
                $createTimeEnd = strtotime($createTimeRow[1] . ' 23:59:59');
            } else {
                $createTimeBegin = strtotime($createTimeRow[0] . ' 00:00:00');
                $createTimeEnd = strtotime($createTimeRow[0] . ' 23:59:59');
            }
            $map['create_time'] = ['between', [$createTimeBegin, $createTimeEnd]];
        }
        if ($isSelf) {
            $map['promote_id'] = $queryPromote['id'];
        }
        $query = M('user_play_info', 'tab_')->where($map)->order('create_time desc');
        list($records, $pagination, $count) = $this->paginate($query);

        $games = $this->getGamesByPromote($promote);

        $this->assign('games', $games);
        $this->assign('records', $records);
        $this->assign('pagination', $pagination);
        $this->assign('count', $count);
        $this->display('userRoles');
    }

    public function userRecharges()
    {
        $gameId = I('game_id', 0);
        $serverId = I('server_id', 0);
        $isSelf = I('is_self', 0);
        $roleName = I('role_name', '');
        $userAccount = I('user_account', '');
        $promoteId = I('promote_id', 0);
        $sdkVersion = I('sdk_version', 0);
        $costBegin = I('cost_begin', '');
        $costEnd = I('cost_end', '');

        $promote = $this->getLoginPromote();
        $levelPromote = $this->getLevelPromote();
        $queryPromote = $this->getQueryPromote($levelPromote);

        $map[] = [
            '_logic' => 'or',
            'id' => $queryPromote['id'],
            'chain' => ['like', $queryPromote['chain'] . $queryPromote['id'] . '/%']
        ];
        $ids = M('promote', 'tab_')->where($map)->getField('id', true);

        $map = [];
        if (count($ids) > 0) {
            $map = ['promote_id' => ['in', $ids]];
        } else {
            $map['_string'] = '1<>1';
        }

        $spendMap = $map;
        if ($gameId != 0) {
            $map['game_id'] = $gameId;
        }
        if ($serverId != 0) {
            $map['server_id'] = $serverId;
        }
        if ($roleName != '') {
            $map['role_name'] = ['like', '%' . $roleName . '%'];
        }
        if ($userAccount != '') {
            $map['user_account'] = ['like', '%' . $userAccount . '%'];
        }
        if ($sdkVersion != 0) {
            $map['sdk_version'] = $sdkVersion;
        }
        if ($isSelf) {
            $map['promote_id'] = $queryPromote['id'];
            $spendMap['promote_id'] = $queryPromote['id'];
        }
        if ($costBegin != '' || $costEnd != '') {
            $having = '';
            if ($costBegin != '' && $costEnd != '') {
                $having = 'sum(cost) between ' . $costBegin . ' and ' . $costEnd;
            } elseif ($costBegin != '' && $costEnd == '') {
                $having = 'sum(cost) >= ' . $costBegin;
            } elseif ($costBegin == '' && $costEnd != '') {
                $having = 'sum(cost) <= ' . $costEnd;
            }
            $subMap = $map;
            $subMap['pay_status'] = 1;
            $subMap['pay_game_status'] = 1;
            $subQuery = M('spend', 'tab_')->field('game_player_id')->where($subMap)->group('game_player_id')->having($having)->buildSql();
            $map['_string'] = 'role_id in (' . $subQuery . ')';
        }
        $query = M('user_play_info', 'tab_')->where($map)->order('play_time desc');
        list($roles, $pagination, $count) = $this->paginate($query);
        $roleIds = array_column($roles, 'role_id');

        $spendMap['pay_status'] = 1;
        $spendMap['pay_game_status'] = 1;
        if (count($roleIds) > 0) {
            $spendMap['game_player_id'] = ['in', $roleIds];
        } else {
            $spendMap['_string'] = '1<>1';
        }
        $allRecharges = M('spend', 'tab_')->field('count(*) count, sum(cost) cost, game_player_id')->where($spendMap)->group('game_player_id')->select();
        $allRecords = [];
        foreach ($allRecharges as $recharge) {
            $allRecords[$recharge['game_player_id']] = $recharge;
        }

        $map['pay_time'] = ['between', [strtotime(date('Y-m-d 00:00:00')), strtotime(date('Y-m-d 23:59:59'))]];
        if (isset($map['_string'])) {
            unset($map['_string']);
        }
        $todayRecharges = M('spend', 'tab_')->field('sum(cost) cost, game_player_id')->where($map)->group('game_player_id')->select();
        $todayRecords = [];
        foreach ($todayRecharges as $recharge) {
            $todayRecords[$recharge['game_player_id']] = $recharge;
        }

        $records = [];
        foreach ($roles as $role) {
            $records[] = [
                'user_account' => $role['user_account'],
                'game_name' => $role['game_name'],
                'role_name' => $role['role_name'],
                'role_id' => $role['role_id'],
                'role_level' => $role['role_level'],
                'server_id' => $role['server_id'],
                'server_name' => $role['server_name'],
                'recharge_cost' => isset($allRecords[$role['role_id']]) ? round(floatval($allRecords[$role['role_id']]['cost']), 2) : 0,
                'recharge_count' => isset($allRecords[$role['role_id']]) ? $allRecords[$role['role_id']]['count'] : 0,
                'recharge_cost_today' => isset($todayRecords[$role['role_id']]) ? round(floatval($todayRecords[$role['role_id']]['cost']), 2) : 0,
                'play_time' => $role['play_time'],
                'play_ip' => $role['play_ip'],
                'promote_id' => $role['promote_id'],
                'promote_account' => $role['promote_account'],
                'sdk_version' => $role['sdk_version'],
                'unlogin_day' => intval((strtotime(date('Y-m-d 00:00:00')) - strtotime(date('Y-m-d 00:00:00', $role['play_time']))) / (24 * 3600))
            ];
        }

        $games = $this->getGamesByPromote($promote);

        $this->assign('games', $games);
        $this->assign('promotes', $promotes);
        $this->assign('groupPromotes', $groupPromotes);
        $this->assign('records', $records);
        $this->assign('pagination', $pagination);
        $this->assign('count', $count);
        $this->display('userRecharges');
    }

    private function getGamesByPromote($promote)
    {
        return M('apply', 'tab_')->field(['game_id', 'game_name'])->where(['promote_id' => $promote['id']])->select();
    }

    private function getGroupPromotes($promote)
    {
        $promotes = [];
        if ($promote['parent_id'] == 0) {
            $promotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['parent_id' => $promote['id']])->select();
        }
        return $promotes;
    }

    private function getNormalPromotes($promote)
    {
        $promotes = [];
        if ($promote['parent_id'] > 0 && $promote['grand_id'] == 0) {
            $promotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['parent_id' => $promote['id']])->select();
        } elseif ($promote['parent_id'] == 0) {
            $promotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['grand_id' => $promote['id']])->select();
        }
        return $promotes;
    }

    public function getGameServers()
    {
        $gameId = I('game_id', 0);
        $servers = M('server', 'tab_')->field(['id', 'server_id', 'server_name'])->where(['game_id' => $gameId])->order('server_id asc')->select();
        $this->ajaxReturn([
            'status' => 1,
            'msg' => '成功',
            'data' => ['servers' => $servers]
        ]);
    }

    public function getSubPromotes()
    {
        $promoteId = I('promote_id', 0);
        $promotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['parent_id' => $promoteId])->select();
        $this->ajaxReturn([
            'status' => 1,
            'msg' => '成功',
            'data' => ['promotes' => $promotes]
        ]);
    }

    /**
     * [充值详细信息]
     * @param $id [充值id]
     */
    public function viewSpendDetailed($id)
    {
        $spendData = array();

        if ($id > 0) {
            $promoteId = D('Spend')->where('id = %d', $id)->getField('promote_id');
            $permission = hasPromotePermission(PID, $promoteId);//是否有该推广员权限

            if ($permission) {
                $map['id'] = $id;

                $spendData = D('Spend')->where($map)->find();
                $spendData['pay_status'] = ($spendData['pay_status'] == 1) ? '成功' : '失败';
            }
        }

        $this->assign('list_data', $spendData);
        $this->meta_title = "订单详情";
        $this->display('view_spend_detailed');
    }

    private function getBetweenTime($time, $defaultBegin = 0, $defaultEnd = 0)
    {
        $delimiter = ' 至 ';
        $begin = $defaultBegin;
        $end = $defaultEnd;
        if ($time != '') {
            if (strpos($time, $delimiter) == -1) {
                $begin = strtotime($time . ' 00:00:00');
                $end = strtotime($time . ' 23:59:59');
            } else {
                $timeRow = explode($delimiter, $time);
                $begin = strtotime($timeRow[0] . ' 00:00:00');
                $end = strtotime($timeRow[1] . ' 23:59:59');
            }
        }
        return [$begin, $end];
    }

    public function achievement()
    {
        $time = I('time', date('Y-m-d'));
        $sdkVersion = I('sdk_version', 0);
        $gameId = I('game_id', 0);
        $serverId = I('server_id', 0);
        $parentId = I('parent_id', 0);
        $promoteId = I('promote_id', 0);
        $status = I('status', 0);

        $loginPromote = $this->getLoginPromote();

        $promote = null;
        $searchPromoteType = 0;
        if ($parentId > 0) {
            $promote = M('promote', 'tab_')->where(['id' => $parentId])->find();
            $searchPromoteType = 2;
        } else {
            $promote = $loginPromote;
            $searchPromoteType = 1;
        }

        $games = $this->getGamesByPromote($promote);

        $subPromotes = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where(['parent_id' => $promote['id']])->select();

        $map = ['parent_id' => $promote['id']];
        if ($promoteId > 0) {
            $map['id'] = $promoteId;
        }

        $query = M('promote', 'tab_')->field(['id', 'account', 'real_name'])->where($map);
        list($promotes, $pagination, $count) = $this->paginate($query);
        $ids = array_column($promotes, 'id');

        $rows = [];
        if (count($ids) > 0) {
            $rows = M('promote', 'tab_')->field(['id', 'parent_id'])->where(['parent_id' => ['in', $ids]])->select();
        }
        $basicPromotes = [];
        foreach ($rows as $row) {
            $basicPromotes[$row['id']] = $row['parent_id'];
        }

        $params = [
            'isContainSubs' => true,
            'basicPromotes' => $basicPromotes,
        ];
        if ($gameId > 0) {
            $params['game_id'] = $gameId;
        }
        if ($serverId > 0) {
            $params['server_id'] = $serverId;
        }
        if ($sdkVersion > 0) {
            $params['sdk_version'] = $sdkVersion;
        }
        if ($status > 0) {
            $params['lock_status'] = $status;
        }
        list($beginTime, $endTime) = $this->getBetweenTime($time);
        $params['begin_time'] = $beginTime;
        $params['end_time'] = $endTime;

        $promoteRepository = new PromoteRepository();
        $createRoleCountList = $promoteRepository->getCreateRoleCountByIds($ids, $params);
        $createRoleUserCountList = $promoteRepository->getCreateRoleUserCountByIds($ids, $params);
        $newCreateRoleUserCountList = $promoteRepository->getNewCreateRoleUserCountByIds($ids, $params);
        $newCreateRoleDeviceCountList = $promoteRepository->getNewCreateRoleDeviceCountByIds($ids, $params);
        $newCreateRoleIpCountList = $promoteRepository->getNewCreateRoleIpCountByIds($ids, $params);
        $loginUserCountList = $promoteRepository->getLoginUserCountByIds($ids, $params);
        $rechargeCountList = $promoteRepository->getRechargeCountByIds($ids, $params);
        $rechargeUserCountList = $promoteRepository->getRechargeUserCountByIds($ids, $params);
        $rechargeAmountList = $promoteRepository->getRechargeAmountByIds($ids, $params);

        $records = [];
        if (I('p', 1) == 1) {
            $selfParams = $params;
            $selfParams['isContainSubs'] = false;
            $selfCreateRoleCountList = $promoteRepository->getCreateRoleCountByIds([$promote['id']], $selfParams);
            $selfCreateRoleUserCountList = $promoteRepository->getCreateRoleUserCountByIds([$promote['id']], $selfParams);
            $selfNewCreateRoleUserCountList = $promoteRepository->getNewCreateRoleUserCountByIds([$promote['id']], $selfParams);
            $selfNewCreateRoleDeviceCountList = $promoteRepository->getNewCreateRoleDeviceCountByIds([$promote['id']], $selfParams);
            $selfNewCreateRoleIpCountList = $promoteRepository->getNewCreateRoleIpCountByIds([$promote['id']], $selfParams);
            $selfLoginUserCountList = $promoteRepository->getLoginUserCountByIds([$promote['id']], $selfParams);
            $selfRechargeCountList = $promoteRepository->getRechargeCountByIds([$promote['id']], $selfParams);
            $selfRechargeUserCountList = $promoteRepository->getRechargeUserCountByIds([$promote['id']], $selfParams);
            $selfRechargeAmountList = $promoteRepository->getRechargeAmountByIds([$promote['id']], $selfParams);

            $records[] = [
                'id' => $promote['id'],
                'account' => $promote['account'],
                'real_name' => $promote['real_name'],
                'create_role_count' => $selfCreateRoleCountList[$promote['id']],
                'create_role_user_count' => $selfCreateRoleUserCountList[$promote['id']],
                'new_create_role_user_count' => $selfNewCreateRoleUserCountList[$promote['id']],
                'new_create_role_device_count' => $selfNewCreateRoleDeviceCountList[$promote['id']],
                'new_create_role_ip_count' => $selfNewCreateRoleIpCountList[$promote['id']],
                'login_user_count' => $selfLoginUserCountList[$promote['id']],
                'recharge_count' => $selfRechargeCountList[$promote['id']],
                'recharge_user_count' => $selfRechargeUserCountList[$promote['id']],
                'recharge_amount' => $selfRechargeAmountList[$promote['id']]['ban_coin'] + $rechargeAmountList[$promote['id']]['coin'] + $rechargeAmountList[$promote['id']]['cash'],
                'recharge_by_ban_coin' => $selfRechargeAmountList[$promote['id']]['ban_coin'],
                'recharge_by_coin' => $selfRechargeAmountList[$promote['id']]['coin'],
                'recharge_by_cash' => $selfRechargeAmountList[$promote['id']]['cash'],
                'search_promote_type' => $searchPromoteType,
            ];
        }

        foreach ($promotes as $promote) {
            $id = $promote['id'];
            $records[] = [
                'id' => $id,
                'account' => $promote['account'],
                'real_name' => $promote['real_name'],
                'create_role_count' => $createRoleCountList[$id],
                'create_role_user_count' => $createRoleUserCountList[$id],
                'new_create_role_user_count' => $newCreateRoleUserCountList[$id],
                'new_create_role_device_count' => $newCreateRoleDeviceCountList[$id],
                'new_create_role_ip_count' => $newCreateRoleIpCountList[$id],
                'login_user_count' => $loginUserCountList[$id],
                'recharge_count' => $rechargeCountList[$id],
                'recharge_user_count' => $rechargeUserCountList[$id],
                'recharge_amount' => $rechargeAmountList[$id]['ban_coin'] + $rechargeAmountList[$id]['coin'] + $rechargeAmountList[$id]['cash'],
                'recharge_by_ban_coin' => $rechargeAmountList[$id]['ban_coin'],
                'recharge_by_coin' => $rechargeAmountList[$id]['coin'],
                'recharge_by_cash' => $rechargeAmountList[$id]['cash'],
                'search_promote_type' => 0,
            ];
        }

        $level = 0;
        if ($parentId > 0) {
            $level = 2;
        } elseif ($loginPromote['parent_id'] == 0) {
            $level = 1;
        } elseif ($loginPromote['parent_id'] > 0 && $loginPromote['grand_id'] == 0) {
            $level = 2;
        } elseif ($loginPromote['parent_id'] > 0 && $loginPromote['grand_id'] > 0) {
            $level = 3;
        }

        $this->assign('games', $games);
        $this->assign('level', $level);
        $this->assign('subPromotes', $subPromotes);
        $this->assign('records', $records);
        $this->assign('pagination', $pagination);
        $this->assign('count', $count);
        $this->display();
    }

    public function getChildPromoteList()
    {
        $promoteId = intval(I('post.promote_id', 0));
        $promoteId = empty($promoteId) ? PID : $promoteId;
        $promoteList = getAllPromoteListByType(3, false, $promoteId);
        $data['status'] = 1;
        $data['data'] = $promoteList;

        $this->ajaxReturn($data);
    }
}