<?php
namespace Admin\Controller;
class FinanceCompareController extends ThinkController
{
    public $zfb = [1];//官方支付宝渠道id
    public $wx = [2,3];//微信渠道id
    public $ybzf = [17];//易宝渠道id
    public $erro_size = 20000;//商家不存在的错误阈值,到达就不执行
    public $page_size = 300;//每次执行比较的数量
    public $payway = [
        "1"=>"支付宝",
        "2"=>"微信",
        "3"=>"易宝"
    ];
    public $checktype=[
        "1"=>"金额不符",
        "2"=>"商家数据缺失",
        "3"=>"平台数据缺失",
        "4"=>"状态不符",
        "5"=>"渠道不符"
    ];
    public $readtype=[
        "0"=>"未处理",
        "1"=>"已处理"
    ];

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

        if (isset($_REQUEST['row'])) {
            $row = $_REQUEST['row'];
        } else {
            $row = 10;
        }
        $map=["check_status"=>1];
        if ($_REQUEST['pay_way'] != '') {
            $map['pay_way'] = $_REQUEST['pay_way'];
        }
        $listdata = M("finance_compare","tab_")->where($map)->order("create_time desc");
        if(isset($_REQUEST['export'])){
            $listdata = $listdata->select();
            $count = M("finance_compare","tab_")->where($map)->count();
        }else{
            $listdata = $listdata->page($page,$row)->select();
            $count = count($listdata);
        }
        foreach ($listdata as $k => &$v) {
            
            $v['begin_time']=date("Y-m-d H:i:s",$v['begin_time']);
            $v['end_time']=date("Y-m-d H:i:s",$v['end_time']);
            $v['compare_time'] = $v['begin_time']." 至 ".$v['end_time'];
            $v['create_time']=date("Y-m-d H:i:s",$v['create_time']);
            $v['pay_way']=$this->payway[$v['pay_way']];
        }
        if(isset($_REQUEST['export'])){
            $GetData = $_GET;
            unset($GetData['export']);
            addOperationLog(['op_type'=>3,'key'=>getNowDate(),'url'=>U(CONTROLLER_NAME.'/'.ACTION_NAME,$GetData),'menu'=>"统计-数据校验-订单校验-导出"]);

            data2csv($listdata,'订单校验',array(
                "id"=>"序号",
                "compare_time"=>"校验时间范围",
                "pay_way"=>"支付渠道",
                "check_count"=>"校验数量",
                "diff_count"=>"异常数量",
                "diff_money"=>"异常金额",
                "create_time"=>"校验时间"
            ));
        }

        $this->checkListOrCountAuthRestMap($map,[]);

        $page = set_pagination($count,$row);
        if($page) {$this->assign('_page', $page);}
        $this->assign('list_data',$listdata);
        $this->assign('pay_way_list',$this->payway);
        $this->display();
    }
    public function add()
    {
        $this->assign("page_size",$this->page_size);
        $this->display();
    }
    public function list($p=1)
    {

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

        if (isset($_REQUEST['row'])) {
            $row = $_REQUEST['row'];
        } else {
            $row = 10;
        }
        if (isset($_REQUEST['compare_id'])) {
            $compare_id = $_REQUEST['compare_id'];
        }else{
            $this->error("参数错误");
        }
        

        $map=["type"=>["gt",0],"compare_id"=>$compare_id];

        if ($_REQUEST['pay_order_number'] != '') {
            $map['pay_order_number'] = $_REQUEST['pay_order_number'];
        }
        if ($_REQUEST['is_read'] != '') {
            $map['is_read'] = $_REQUEST['is_read'];
        }
        if ($_REQUEST['type'] != '') {
            $map['type'] = $_REQUEST['type'];
        }
        
        $listdata = M("finance_compare_info","tab_")->where($map);
        if(isset($_REQUEST['export'])){
            $listdata = $listdata->select();
        }else{
            $listdata = $listdata->page($page,$row)->select();
        }
        foreach ($listdata as $k => &$v) {
            $v['pay_way']=$this->payway[$v['pay_way']];
            $v['type']=$this->checktype[$v['type']];
            $v['read_str']=$this->readtype[$v['is_read']];
        }
        if(isset($_REQUEST['export'])){
            $GetData = $_GET;
            unset($GetData['export']);
            addOperationLog(['op_type'=>3,'key'=>getNowDate(),'url'=>U(CONTROLLER_NAME.'/'.ACTION_NAME,$GetData),'menu'=>"统计-数据校验-订单校验-订单校验详情-导出"]);

            data2csv($listdata,'订单校验详情',array(
                "pay_order_number"=>"订单号",
                "pay_way"=>"支付渠道",
                "read_str"=>"状态",
                "pt_pay_amount"=>"平台支付金额",
                "sj_pay_amount"=>"商家订单金额",
                "diff_money"=>"相差金额",
                "type"=>"原因分类"
            ));
        }
        $count = M("finance_compare_info","tab_")
                ->field("count(*) count, 
                        SUM(CASE WHEN is_read = 0 THEN pt_pay_amount ELSE 0 END) as noread_pt_pay_amount,
                        SUM(CASE WHEN is_read = 0 THEN sj_pay_amount ELSE 0 END) as noread_sj_pay_amount, 
                        SUM(CASE WHEN is_read = 0 THEN diff_money ELSE 0 END) as noread_diff_money,
                        SUM(pt_pay_amount) pt_pay_amount,
                        SUM(sj_pay_amount) sj_pay_amount,
                        SUM(diff_money) diff_money")
                ->where($map)
                ->find();
        $page = set_pagination($count['count'],$row);
        if($page) {$this->assign('_page', $page);}
        $this->assign('list_data',$listdata);
        $this->assign('count_data',$count);
        $this->assign('read_type',$this->readtype);
        $this->assign('check_type',$this->checktype);
        $this->display();
    }
    public function changeRead()
    {
        if (isset($_REQUEST['id']) && isset($_REQUEST['is_read']) && isset($_REQUEST['compare_id'])) {
            $id = $_REQUEST['id'];
            $is_read = $_REQUEST['is_read'];
            $compare_id = $_REQUEST['compare_id'];
        }else{
            $this->error("参数错误");
        }
        //处理数据
        $info = M("finance_compare_info","tab_")->where("id={$id}")->find();
        if($info['is_read'] != $is_read){
            $this->ajaxReturn(array("error"=>"此单已标记成功请勿重复点击","code"=>40001));
        }
        //获取
        $fc = M("finance_compare","tab_")->where("id={$compare_id}")->find();
        if($is_read == 0){
            //改为已处理
            $fcsavedata = [
                "diff_count"=>$fc['diff_count']-1,
                "diff_money"=>$fc['diff_money']-$info['diff_money'],
            ];
            $isavedata = [
                "is_read"=>1
            ];
        }else{
            //改为未处理
            $fcsavedata = [
                "diff_count"=>$fc['diff_count']-0+1,
                "diff_money"=>$fc['diff_money']-0+$info['diff_money'],
            ];
            $isavedata = [
                "is_read"=>0
            ];
        }
        //保存
        M("finance_compare","tab_")->where("id={$compare_id}")->save($fcsavedata);
        M("finance_compare_info","tab_")->where("id={$id}")->save($isavedata);
        $this->ajaxReturn(array("success"=>"处理成功","code"=>0));

    }
    /**
     * 创建比较基础数据
     */
    public function creatCompare()
    {
        $adddata = I("post.");

        $adddata['create_time'] = time();
        $adddata['begin_time'] = strtotime($adddata['begin_time']);
        $adddata['end_time'] = strtotime($adddata['end_time'])+ 86399;

       $res =  M("finance_compare","tab_")->add($adddata);
       if($res){
           $this->ajaxReturn(array("success"=>"ok","code"=>0,"data"=>["id"=>$res]));
       }else{
        $this->ajaxReturn(array("error"=>"creat error","code"=>4000));
       }
    }
    /**
     * 循环比较数据
     */
    public function compareData()
    {
        $checkdata = I('POST.');
        $keys = $checkdata['keys'];
        $compare_id = $checkdata['compare_id'];
        $pay_way = $checkdata['pay_way'];//1支付宝 2微信 17易宝
        $data = $checkdata['checkarr'];
        //过滤数据
        $sp=[];
        $pf=[];
        $er=[];
        foreach($data as $k=>$v){
            $v[$keys[0]] = trim($v[$keys[0]]);
            $v[$keys[1]] = trim($v[$keys[1]]);

            $pay_where = substr($v[$keys[0]], 0, 2);
            $tmp = [
                "pt_pay_amount"=>0,
                "diff_money"=>$v[$keys[1]],
                "sj_pay_amount"=>$v[$keys[1]],
                "type"=>3,
                "pay_order_number"=>$v[$keys[0]],
                "compare_id"=>$compare_id,
                "pay_way"=>$pay_way,
                "is_read"=>0
            ];
            
            if($pay_where == 'SP'){
                $tmp['order_type']=1;
                $sp[$v[$keys[0]]] =  $tmp;
            }elseif($pay_where == 'PF'){
                $tmp['order_type']=2;
                $pf[$v[$keys[0]]] =  $tmp;
            }else{
                $tmp['order_type']=0;
                $er[$v[$keys[0]]] =  $tmp;
            }
        }
        //判断游戏流水
        if(count($sp) > 0){
            $keys = implode(",",array_keys($sp));
            $where = ["pay_order_number"=>["in",$keys]];
            $sres =  M("Spend","tab_")->field("pay_order_number,pay_amount,pay_status,pay_way")->where($where)->select();
            if($sres){
                $this->setDiffData($sres,$sp);
            }
            $saveres = $this->saveCheckData($sp);
            if($saveres == false){
                $this->delCompare($compare_id);
                $this->ajaxReturn(array("error"=>"添加失败","code"=>40001));
            }
        }
        //判断平台币流水
        if(count($pf) > 0){
            $keys = implode(",",array_keys($pf));
            $where = ["pay_order_number"=>["in",$keys]];
            $sres =  M("Deposit","tab_")->field("pay_order_number,pay_amount,pay_status,pay_way")->where($where)->select();
            if($sres){
                $this->setDiffData($sres,$pf);
            }
            $saveres = $this->saveCheckData($pf);
            if($saveres == false){
                $this->delCompare($compare_id);
                $this->ajaxReturn(array("error"=>"添加失败","code"=>40002));
            }
        }
        //不存在订单添加
        if(count($er) > 0){
            $saveerrores = $this->saveCheckData($er);
            if($saveerrores == false){
                $this->delCompare($compare_id);
                $this->ajaxReturn(array("error"=>"添加失败","code"=>40003));
            }
        }
        
        $this->ajaxReturn(array("success"=>"ok","code"=>0,"data"=>[]));
    }
    /**
     * 验证平台游戏流水
     */
    public function checkSpendData()
    {
        $checkdata = I('POST.');
        if ($checkdata['pay_way'] == 1) {
            $check_arr  = $this->zfb;
        }elseif($checkdata['pay_way'] == 2){
            $check_arr  = $this->wx;
        }elseif($checkdata['pay_way'] == 3){
            $check_arr  = $this->ybzf;
        }
        $check_arr  = implode(",",$check_arr);
        //组件sql
        $fmap = [
            "compare_id"=>$checkdata['compare_id'],
            "order_type"=>1
        ];
        //改为join

        $fcisql =  M("finance_compare_info","tab_")->field("pay_order_number,compare_id")->where($fmap)->select(false);
        $map = [
            // "pay_order_number"=>["not in",$fcisql],
            "s.pay_time" => ['between', [strtotime($checkdata['begin_time']), strtotime($checkdata['end_time']) + 86399]],
            "s.pay_status"=>1,
            "s.pay_way"=>["in",$check_arr]
        ];
        $res =  M("Spend s","tab_")
            ->field("s.pay_order_number,s.pay_amount,s.pay_status,s.pay_way,ifnull(fc.compare_id,0) compare_id")
            ->join("( $fcisql ) fc on s.pay_order_number = fc.pay_order_number","left")
            ->where($map)
            ->having("compare_id = 0")
            ->limit($this->erro_size)
            ->select();
        if(count($res) >= $this->erro_size){
            $this->delCompare($checkdata['compare_id']);
            $this->ajaxReturn(array("error"=>"商家不存在的数据大于{$this->erro_size}条,没有比较的意义,请确认表格的渠道和时间是否正确","code"=>40004));
        }
        $saveres = true;
        if(count($res) > 0){
            $add = [];
            foreach($res as $k=>$v){
                $tmp = [
                    "pt_pay_amount"=>$v["pay_amount"],
                    "diff_money"=>$v["pay_amount"],
                    "sj_pay_amount"=>0,
                    "type"=>2,
                    "pay_order_number"=>$v["pay_order_number"],
                    "compare_id"=>$checkdata['compare_id'],
                    "pay_way"=>$checkdata['pay_way'],
                    "order_type"=>1,
                    "is_read"=>0
                ];
                $add[] = $tmp;
            }
            unset($res);
            $saveres =  M("finance_compare_info","tab_")->addAll($add);
        }
        if($saveres){
            $this->ajaxReturn(array("success"=>"ok","code"=>0,"data"=>[]));
        }else{
            $this->delCompare($checkdata['compare_id']);
            $this->ajaxReturn(array("error"=>"比对数据添加失败","code"=>40005));
        }
    }
    /**
     * 验证平台币流水
     */
    public function checkDepositData()
    {
        $checkdata = I('POST.');
        if ($checkdata['pay_way'] == 1) {
            $check_arr  = $this->zfb;
        }elseif($checkdata['pay_way'] == 2){
            $check_arr  = $this->wx;
        }elseif($checkdata['pay_way'] == 3){
            $check_arr  = $this->ybzf;
        }
        $check_arr  = implode(",",$check_arr);
        //组件sql
        $fmap = [
            "compare_id"=>$checkdata['compare_id'],
            "order_type"=>2
        ];
        $fcisql =  M("finance_compare_info","tab_")->field("pay_order_number,compare_id")->where($fmap)->select(false);
        $map = [
            "create_time" => ['between', [strtotime($checkdata['begin_time']), strtotime($checkdata['end_time']) + 86399]],
            "pay_status"=>1,
            "pay_way"=>["in",$check_arr]
        ];
        $res =  M("Deposit s","tab_")
            ->field("s.pay_order_number,s.pay_amount,s.pay_status,s.pay_way,ifnull(fc.compare_id,0) compare_id")
            ->join("( $fcisql ) fc on s.pay_order_number = fc.pay_order_number","left")
            ->where($map)
            ->having("compare_id = 0")
            ->limit($this->erro_size)
            ->select();
        if(count($res) >= $this->erro_size){
            $this->delCompare($checkdata['compare_id']);
            $this->ajaxReturn(array("error"=>"商家不存在的数据大于{$this->erro_size}条,没有比较的意义,请确认表格的渠道和时间是否正确","code"=>40004));
        }
        $saveres = true;
        if(count($res) > 0){
            $add = [];
            foreach($res as $k=>$v){
                $tmp = [
                    "pt_pay_amount"=>$v["pay_amount"],
                    "diff_money"=>$v["pay_amount"],
                    "sj_pay_amount"=>0,
                    "type"=>2,
                    "pay_order_number"=>$v["pay_order_number"],
                    "compare_id"=>$checkdata['compare_id'],
                    "pay_way"=>$checkdata['pay_way'],
                    "order_type"=>2,
                    "is_read"=>0
                ];
                $add[] = $tmp;
            }
            unset($res);
            $saveres =  M("finance_compare_info","tab_")->addAll($add);
        }
        if($saveres){
            $this->ajaxReturn(array("success"=>"ok","code"=>0,"data"=>[]));
        }else{
            $this->delCompare($checkdata['compare_id']);
            $this->ajaxReturn(array("error"=>"比对数据添加失败","code"=>40005));
        }
    }
    /**
     * 生成最终比较统计
     */
    public function creatCompareCount()
    {
        $checkdata = I('POST.');
        $compare_id = $checkdata['compare_id'];
        //统计
        $imap = [
            "compare_id"=>$compare_id,
            "type"=>["gt",0]
        ];
        $ires =  M("finance_compare_info","tab_")->field("IFNULL(sum(diff_money),0) diff_money,IFNULL(count(*),0) count")->where($imap)->find();
        $savedata = [
            "diff_count"=>$ires['count'],
            "diff_money"=>$ires['diff_money'],
            "check_status"=>1
        ];
       $res =  M("finance_compare","tab_")->where("id='{$compare_id}'")->save($savedata);
       if($res){
         $this->ajaxReturn(array("success"=>"ok","code"=>0,"data"=>[]));
       }else{
        $this->delCompare($compare_id);
        $this->ajaxReturn(array("error"=>"save error","code"=>40006));
       }

    }
    //比较数据库与原数据
    protected function setDiffData($dbres,&$ydata)
    {
        //type 1:金额不符 2:商家数据缺失 3:平台数据缺失 4:状态不符;5:渠道不符
        foreach ($dbres as $k => $v) {
            if(array_key_exists($v['pay_order_number'],$ydata)){
                //存在
                $flag = true;
                $ydata[$v['pay_order_number']]['pt_pay_amount'] = $v['pay_amount'];
                $ydata[$v['pay_order_number']]['diff_money'] = abs($ydata[$v['pay_order_number']]['pt_pay_amount']-$ydata[$v['pay_order_number']]['sj_pay_amount']);

                if($ydata[$v['pay_order_number']]['diff_money'] > 0){//金额不符
                    $ydata[$v['pay_order_number']]['type'] = 1;
                    $flag = false;
                    continue;
                }

                if($v['pay_status'] != 1){//状态不符合
                    $ydata[$v['pay_order_number']]['type'] = 4;
                    $ydata[$v['pay_order_number']]['diff_money'] = $v['pay_amount'];
                    $flag = false;
                    continue;
                }
                //判断渠道
                $way = $ydata[$v['pay_order_number']]['pay_way'];
                if ($way == 1) {
                    $checkarr  = $this->zfb;
                }elseif($way == 2){
                    $checkarr  = $this->wx;
                }elseif($way == 3){
                    $checkarr  = $this->ybzf;
                }
                if(!in_array($way,$checkarr)){//渠道不符
                    $ydata[$v['pay_order_number']]['type'] = 5;
                    $flag = false;
                    continue;
                }
                
                if($flag){//正常
                    $ydata[$v['pay_order_number']]['type'] = 0;
                }
            }
        }
    }
    //添加详情
    protected function saveCheckData(&$data){
        $arr = [];
        foreach ($data as $k => $v) {
            $arr[] =  $v;
        }
        unset($data);
        $res =  M("finance_compare_info","tab_")->addAll($arr);
        unset($arr);
        return $res;
    }
    //回退删除
    protected function delCompare($compare_id){
       
        M("finance_compare_info","tab_")->where("compare_id = '{$compare_id}'")->delete();
        M("finance_compare","tab_")->where("id = '{$compare_id}'")->delete();
    }
}