<?php

namespace Admin\Controller;

use Org\Util\Date;
use Sdk\Controller\AgeController;
use User\Api\MemberApi as MemberApi;
use Org\WeixinSDK\Weixin;

class PayMerchantController extends ThinkController
{

    const WAY_ALIPAY = 1;
    const WAY_WEIXIN = 2;
    const WAY_EXPRESS = 4;

    public function index($p = 0) {
        if(!array_key_exists("timestart",$_REQUEST)&&!$_REQUEST['type']){
            $this->redirect(ACTION_NAME, array('timestart' => date('Y-m-d',strtotime('-30 day')),"timeend"=>date('Y-m-d')));
        }
        $page = intval($p);
        $page = $page ? $page : 1; //默认显示第一页数据
        $arraypage = $page;

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

        $map = [];

        if (!empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
            $map['payed_time'] = array('between', [strtotime($_REQUEST['timestart']), strtotime($_REQUEST['timeend']) + 86399]);
        } elseif (!empty($_REQUEST['timestart']) && empty($_REQUEST['timeend'])) {
            $map['payed_time'] = array('between', [strtotime($_REQUEST['timestart']), time()]);
        } elseif (empty($_REQUEST['timestart']) && !empty($_REQUEST['timeend'])) {
            $map['payed_time'] = array('elt', (strtotime($_REQUEST['timeend']) + 86399));
        }

        if ($_REQUEST['account']) {
            $map['merchant.account'] = $_REQUEST['account'];
        }

        if ($_REQUEST['name']) {
            $map['name'] = $_REQUEST['name'];
        }

        if ($_REQUEST['main_name']) {
            $map['main_name'] = $_REQUEST['main_name'];
        }

        if ($_REQUEST['pay_way']) {
            $data_map['merchant_way'] = ['in',$_REQUEST['pay_way']];
        }
//        var_dump($data_map);die();
        //游戏充值金额
        $data = M("spend use index(pay_channel)","tab_")
            ->field("SUM(CASE WHEN merchant.id is not null and tab_test_white_list.user_id is null THEN pay_amount ELSE 0 END) as cash_amount,
            SUM(CASE WHEN merchant.id is not null and tab_test_white_list.user_id is not null THEN pay_amount ELSE 0 END) as test_amount,
            0 coin_amount,0 offcial_amount,0 spread_amount,0 supersign_amount,0 test_order_amount,merchant_id,name,channel,identifier,
            payed_time,game_id,main_name,merchant_way,merchant.account,tab_spend.pay_way")
            ->join("left join tab_test_white_list on tab_spend.user_id=tab_test_white_list.user_id")
            ->join("left join tab_payment_merchant merchant on merchant.id=tab_spend.merchant_id")
            ->where(['pay_status'=>1,'tab_spend.pay_way'=>['egt',1],'merchant.status'=>1,'merchant.type'=>1])
            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select(false);

        //平台币充值金额计算
        $coinData = M('deposit','tab_')
//            ->join("inner join tab_deposit on tab_pay_info.order_id=tab_deposit.pay_order_number")
            ->join("left join tab_test_white_list on tab_test_white_list.user_id=tab_deposit.user_id")
            ->join("left join tab_payment_merchant merchant on merchant.id=tab_deposit.merchant_id")
            ->field("0 cash_amount,SUM(CASE WHEN merchant.id is not null and pay_source=2 and tab_test_white_list.user_id is not null THEN pay_amount ELSE 0 END) as test_amount,
            SUM(CASE WHEN merchant.id is not null and tab_test_white_list.user_id is null and pay_source=2 THEN pay_amount ELSE 0 END) as coin_amount,
            0 offcial_amount,0 spread_amount,0 supersign_amount,0 test_order_amount,merchant_id,name,channel,identifier,payed_time,0 game_id,main_name,merchant_way,merchant.account,tab_deposit.pay_way")
            ->where(['pay_status'=>1,'tab_deposit.pay_way'=>['egt',1],'merchant.status'=>1,'merchant.type'=>1])
            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select(false);
//        var_dump($coinData);die();
        //官网金额
        $officalData = M('deposit','tab_')
            ->join("left join tab_test_white_list on tab_test_white_list.user_id=tab_deposit.user_id")
            ->join("left join tab_payment_merchant merchant on merchant.id=tab_deposit.merchant_id")
            ->field("0 cash_amount,SUM(CASE WHEN merchant.id is not null and pay_source=0 and tab_test_white_list.user_id is not null THEN pay_amount ELSE 0 END) as test_amount,
            0 as coin_amount,SUM(CASE WHEN merchant.id is not null and tab_test_white_list.user_id is null and pay_source=0 THEN pay_amount ELSE 0 END) as offcial_amount,
            0 spread_amount,0 supersign_amount,0 test_order_amount,merchant_id,name,channel,identifier,payed_time,0 as game_id,main_name,merchant_way,merchant.account,tab_deposit.pay_way")
            ->where(['pay_status'=>1,'tab_deposit.pay_way'=>['egt',1],'merchant.status'=>1,'merchant.type'=>1])
            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select(false);

        if ($map['payed_time'])
        {
            $map['pay_time'] = $map['payed_time'];
            unset($map['payed_time']);
        }

        //推广后台
        $spreadData = M("coin_pay_order","tab_")
            ->field("0 cash_amount,0 test_amount,0 coin_amount,0 offcial_amount,
            SUM(CASE WHEN merchant.id is not null THEN pay_amount ELSE 0 END) as spread_amount,0 supersign_amount,
            0 test_order_amount,merchant_id,name,channel,identifier,pay_time payed_time,0 game_id,main_name,merchant_way,merchant.account,tab_coin_pay_order.pay_way")
            ->join("left join tab_payment_merchant merchant on merchant.id=tab_coin_pay_order.merchant_id")
            ->where(['order_status'=>1,'tab_coin_pay_order.pay_way'=>['egt',1],'merchant.status'=>1,'merchant.type'=>1])
            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select(false);
//        var_dump($spreadData);die();
        //超级签数据
        $superSignData = M('game_supersign','tab_')
            ->field("0 cash_amount,
            SUM(CASE WHEN merchant.id is not null and tab_test_white_list.user_id is not null THEN pay_price ELSE 0 END) as test_amount,
            0 coin_amount,0 offcial_amount,0 spread_amount,
            SUM(CASE WHEN merchant.id is not null and tab_test_white_list.user_id is null THEN pay_price ELSE 0 END) as supersign_amount,
            0 test_order_amount,merchant_id,name,channel,identifier,pay_time payed_time,game_id,main_name,merchant_way,merchant.account,tab_game_supersign.pay_way")
            ->join("left join tab_payment_merchant merchant on merchant.id=tab_game_supersign.merchant_id")
            ->join("left join tab_test_white_list on tab_test_white_list.user_id=tab_game_supersign.user_id")
            ->where(['pay_status'=>1,'tab_game_supersign.pay_way'=>['egt',1],'merchant.status'=>1,'merchant.type'=>1])
            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select(false);

        //测试环境内网平台订单
        $testOrder = M('test_order', 'tab_')
            ->where(['tab_test_order.pay_way'=>['egt',1]])
            ->field('0 cash_amount,0 test_amount,0 coin_amount,0 offcial_amount,0 spread_amount,0 supersign_amount,
            SUM(CASE WHEN merchant.id is not null THEN pay_amount ELSE 0 END) as test_order_amount,merchant_id,name,
            channel,identifier,pay_time payed_time,game_id,main_name,merchant_way,merchant.account,tab_test_order.pay_way')
            ->join("left join tab_payment_merchant merchant on merchant.id=tab_test_order.merchant_id")
            ->where(['merchant.status'=>1,'merchant.type'=>1])
            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select(false);

        $sql = "{$data} UNION ALL {$coinData} UNION ALL {$officalData} UNION ALL {$spreadData} UNION ALL {$superSignData} UNION ALL {$testOrder}";

        if (!$_REQUEST['export']) {
            $data = M()->table("({$sql})a")
                ->field("sum(cash_amount) cash_amount,sum(test_amount) test_amount,
            sum(coin_amount) coin_amount,sum(offcial_amount) offcial_amount,
            sum(spread_amount) spread_amount,sum(supersign_amount) supersign_amount,
            sum(test_order_amount) test_order_amount,merchant_id,account,merchant_way,main_name,
            name,channel,identifier")
                ->page($p, $row)
                ->where("name is not null and merchant_way !=0")
                ->where($data_map)
                ->group("merchant_id,merchant_way")
                ->select();
        } else {
            $data = M()->table("({$sql})a")
                ->field("sum(cash_amount) cash_amount,sum(test_amount) test_amount,
            sum(coin_amount) coin_amount,sum(offcial_amount) offcial_amount,
            sum(spread_amount) spread_amount,sum(supersign_amount) supersign_amount,
            sum(test_order_amount) test_order_amount,merchant_id,account,merchant_way,main_name,
            name,channel,identifier")
                ->where("name is not null and merchant_way !=0")
                ->where($data_map)
                ->group("merchant_id,merchant_way")
                ->select();
        }
//        dump($data);die();
        $count = M()->table("({$sql})a")
            ->field("merchant_id")
            ->where("name is not null and merchant_way !=0")
            ->where($data_map)
//            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select(false);

        $count = M()->table("({$count})b")->count();

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


        $sum = M()->table("({$sql})a")
            ->field("sum(cash_amount) cash_amount,sum(test_amount) test_amount,
            sum(coin_amount) coin_amount,sum(offcial_amount) offcial_amount,
            sum(spread_amount) spread_amount,sum(supersign_amount) supersign_amount,
            sum(test_order_amount) test_order_amount,merchant_id")
            ->where("name is not null and merchant_way !=0")
            ->where($data_map)
//            ->where($map)
            ->find();

        $sum['cash_amount'] = round ($sum['cash_amount'],2);
        $sum['test_amount'] = round ($sum['test_amount'],2);
        $sum['coin_amount'] = round ($sum['coin_amount'],2);
        $sum['offcial_amount'] = round ($sum['offcial_amount'],2);
        $sum['spread_amount'] = round ($sum['spread_amount'],2);
        $sum['supersign_amount'] = round ($sum['supersign_amount'],2);
        $sum['test_order_amount'] = round ($sum['test_order_amount'],2);


        $sum['sum'] = $sum['cash_amount']+$sum['test_amount']+$sum['coin_amount']+$sum['offcial_amount']
            +$sum['spread_amount']+$sum['supersign_amount']+$sum['test_order_amount'];

//        dump($sum);die();

        $sum_merchant = M()->table("({$sql})a")
            ->field("sum(cash_amount+test_amount+coin_amount+offcial_amount+spread_amount+supersign_amount+test_order_amount) sum_amount,
            merchant_id,name,merchant_way")
            ->where("name is not null and merchant_way !=0")
            ->where($data_map)
//            ->where($map)
            ->group("merchant_id,merchant_way")
            ->select();

        $this->checkListOrCountAuthRestMap($map,[]);
        foreach ($data as $key => $value) {
            $data[$key]['sum'] = $value['cash_amount']+$value['test_amount']+$value['coin_amount']+
                $value['offcial_amount']+$value['spread_amount']+$value['supersign_amount']+$value['test_order_amount'];
            $data[$key]['ratio'] = round (($data[$key]['sum']/array_sum(array_column($sum_merchant,'sum_amount')))*100,2);

            $data[$key]['cash_amount'] = number_format($value['cash_amount'],2,'.','');
            $data[$key]['test_amount'] = number_format ($value['test_amount'],2,'.','');
            $data[$key]['coin_amount'] = number_format ($value['coin_amount'],2,'.','');
            $data[$key]['offcial_amount'] = number_format ($value['offcial_amount'],2,'.','');
            $data[$key]['spread_amount'] = number_format ($value['spread_amount'],2,'.','');
            $data[$key]['supersign_amount'] = number_format ($value['supersign_amount'],2,'.','');
            $data[$key]['test_order_amount'] = number_format ($value['test_order_amount'],2,'.','');

            if ($value['merchant_way'] == self::WAY_ALIPAY) {
                $data[$key]['merchant_way'] = "支付宝";
            } else if ($value['merchant_way'] == self::WAY_WEIXIN) {
                $data[$key]['merchant_way'] = "微信";
            } else if ($value['merchant_way'] == self::WAY_EXPRESS) {
                $data[$key]['merchant_way'] = "快捷";
            } else {
                $data[$key]['merchant_way'] = "无";
            }

        }

        $sum_radio = [];
        foreach ($sum_merchant as $key => $value) {
            if ($value['merchant_way'] == self::WAY_ALIPAY) {
                $sum_merchant[$key]['merchant_way'] = "支付宝";
                $sum_radio[$key]['merchant_way'] = "支付宝";
            } else if ($value['merchant_way'] == self::WAY_WEIXIN) {
                $sum_merchant[$key]['merchant_way'] = "微信";
                $sum_radio[$key]['merchant_way'] = "微信";
            } else if ($value['merchant_way'] == self::WAY_EXPRESS) {
                $sum_merchant[$key]['merchant_way'] = "快捷";
                $sum_radio[$key]['merchant_way'] = "快捷";
            } else {
                $sum_merchant[$key]['merchant_way'] = "无";
                $sum_radio[$key]['merchant_way'] = "无";
            }
            $sum_merchant[$key]['sum_amount'] = round($value['sum_amount'],2);
            $sum_radio[$key]['name'] = $value['name'];
            $sum_radio[$key]['ratio'] = round(($value['sum_amount']/array_sum(array_column($sum_merchant,'sum_amount')))*100,2);
        }

        if ($_REQUEST['export']) {
            $title = ['main_name' => '商户主体',
                'name' => '支付商户',
                'merchant_way'=>'支付方式',
                'account' => '商户账号',
                'ratio' => '占比(总充值量%)',
                'cash_amount' => '游戏现金金额',
                'coin_amount' => '平台币直充金额',
                'test_amount'=>'测试白名单金额',
                'test_order_amount' => '测试环境内外网平台金额',
                'supersign_amount' => '超级签',
                'offcial_amount' => '官网',
                'spread_amount' => '推广后台',
                'sum' => '支付渠道内合计'];

            $sum['main_name'] = "合计(根据时间检索变化)";
            $sum['ratio'] = 100;


            $sum_merchant_export['main_name'] = '汇总(根据时间检索变化)';
            $sum_radio_export['main_name'] = '收款商户占比';

            foreach ($sum_merchant as $key => $value) {
//                if ($value['merchant_way'] == self::WAY_ALIPAY) {
//                    $merchant_way = "支付宝";
//                } else if ($value['merchant_way'] == self::WAY_WEIXIN) {
//                    $merchant_way = "微信";
//                } else if ($value['merchant_way'] == self::WAY_EXPRESS) {
//                    $merchant_way = "快捷";
//                } else {
//                    $merchant_way = "无";
//                }

                $radio = round(($value['sum_amount']/array_sum(array_column($sum_merchant,'sum_amount')))*100,2);

                $sum_merchant_export['account'] .= $value['name']."(".$value['merchant_way']."):".$value['sum_amount'];
                $sum_radio_export['account'] .= $value['name']."(".$value['merchant_way']."):".$radio."%";
            }
            $data = array_merge($data,[$sum],[$sum_merchant_export],[$sum_radio_export]);

            data2csv($data,'支付方式统计',$title);
        }

//        dump($sum_merchant);die();
        $this->assign("sum_radio",$sum_radio);
        $this->assign("sum_merchant",$sum_merchant);
        $this->assign("sum",$sum);
        $this->assign("listdata",$data);
        $this->display();

    }



}