<?php
namespace app\admin\controller;

use think\App;
use think\Db;
use think\Exception;

class DinnerRefuseOrder extends Auth
{

    public function __construct(App $app = null) {
        parent::__construct($app);
        $this->table='dinner_order_refuse';
    }
    public function index(){
        if(request()->isAjax()){
            //分页参数
            $length = input('rows',10,'intval');   //每页条数
            $page = input('page',1,'intval');      //第几页
            $start = ($page - 1) * $length;     //分页开始位置
            //排序
            $sortRow = input('sidx','id','trim');      //排序列
            $sort = input('sord','desc','trim');        //排序方式
            $order = $sortRow.' '.$sort;

            $title = input('sn','','trim');
            if($title){
                $map[] = ['b.sn','like','%'.$title.'%'];
            }

            $map[] = ['a.org_id','=',$this->orgId];
            $map[] = ['b.state','<>',0];
            $map= empty($map) ? true: $map;
            //数据查询
            $lists = db($this->table)
                ->alias('a')
                ->join('dinner_order b','a.dinner_order_id=b.id')
                ->field('b.id,b.sn,b.price,b.name,b.mobile,b.address,b.remark,b.pay_time,a.create_time,a.op_time,a.status,a.id as refuse_id')
                ->where($map)->limit($start,$length)->order(
                ['a.id'=>'desc']
            )->select();

            foreach ($lists as $k=>$v){
                $all = Db::name('dinner_order_item')
                ->alias('a')
                ->join('dinner b','a.dinner_id=b.id')
                ->join('dinner_type c','a.dinner_type_id=c.id')
                ->field('a.*,b.name as dinner_name,c.color,c.name as dinner_type_name')
                ->where('a.order_id',$v['id'])
                ->select();

                $item = '';
                foreach ($all as $k2=>$v2){
                    $ss = $k2+1;
                    if($ss<10){
                        $ss= '0'.$ss;
                    }
                    $ur = url('dinner/detail').'?id='.$v2['dinner_id'];
                    $item.=''.$ss.',<span class="label" style="border-radius:0rem !important;background-color: '.$v2['color'].';color: white">'.$v2['dinner_type_name'].'</span><a  data-title="详情" href="javascript:;" url="'.$ur.'">'.$v2['dinner_name'].'*'.$v2['num'];
                    if(count($all)>1 && $k2<count($all)){
                        $item.='<br/>';
                    }
                }
                $lists[$k]['item'] = $item;

                $refuse = Db::name('dinner_order_refuse_item')
                    ->alias('a')
                    ->join('dinner b','a.dinner_id=b.id')
                    ->join('dinner_type c','a.dinner_type_id=c.id')
                    ->field('a.*,b.name as dinner_name,c.color,c.name as dinner_type_name')
                    ->where('a.order_refuse_id',$v['refuse_id'])
                    ->select();

                $item_refuse = '';
                foreach ($refuse as $k3=>$v3){
                    $ss1 = $k3+1;
                    if($ss1<10){
                        $ss1= '0'.$ss1;
                    }
                    $ur = url('dinner/detail').'?id='.$v3['dinner_id'];
                    $item_refuse.=''.$ss1.',<span class="label" style="border-radius:0rem !important;background-color: '.$v3['color'].';color: white">'.$v3['dinner_type_name'].'</span><a  onclick="layer_open(this,0)" data-title="详情" href="javascript:;" url="'.$ur.'">'.$v3['dinner_name'].'*'.$v3['num'];
                    if(count($refuse)>1 && $k3<count($refuse)){
                        $item_refuse.='<br/>';
                    }
                }
                $lists[$k]['item_refuse'] = $item_refuse;

                $status_txt = '';
                if($v['status']==4){
                    $status_txt ='<span class="label" style="border-radius:0rem !important;background-color: #d15b47;color: white">正在退款中</span><br/>'.$v['sn'].'';
                }elseif ($v['status']==5){
                    $status_txt ='<span class="label" style="border-radius:0rem !important;background-color: #82af6f;color: white">已退款</span><br/>'.$v['sn'].'';
                }elseif ($v['status']==6){
                    $status_txt ='<span class="label" style="border-radius:0rem !important;background-color: #3a87ad;color: white">申请退款被拒</span><br/>'.$v['sn'].'';

                }
                $lists[$k]['status_txt'] = $status_txt;
                $lists[$k]['op_time'] = $v['op_time']?$v['op_time']:'';

            }
            //数据返回
            $totalCount = db($this->table)
                ->alias('a')
                ->join('dinner_order b','a.dinner_order_id=b.id')
                ->where($map)->count();
            $totalPage = ceil($totalCount/$length);
            $result['page'] = $page;
            $result['total'] = $totalPage;
            $result['records'] = $totalCount;
            $result['rows'] = $lists;
            return json($result);
        }else{

            return $this->fetch();
        }
    }

    public function option($id=0){
        if(request()->isPost()){
            $res = Db::name($this->table)
                ->where('org_id',$this->orgId)
                ->where('id',$id)
                ->find();
            if($res['status']!==4){
                $this->error('当前订单已操作');
            }
            $order = Db::name('dinner_order')->where('id',$res['dinner_order_id'])->find();
            if(!$order){
                $this->error('订单不存在');
            }
            $status = input('status','');
            $remark = input('refuse_remark','');
            if(!in_array($status,[5,6])){
                $this->error('参数错误');
            }
            Db::startTrans();
            try{
                if($order['cate'] == 0){
                    $r = Db::name('dinner_order')
                        ->where('id',$res['dinner_order_id'])
                        ->update([
                            'state'=>$status,
                            'update_time'=>getTime()
                        ]);

                    if(!$r){
                        \exception('操作失败');
                    }
                }else{
                    if($status==5){
                        $checkAll =  Db::name('dinner_order_item')
                            ->where('order_id',$res['dinner_order_id'])
                            ->where('is_refuse',0)
                            ->find();
                        if(!$checkAll){//已退款
                            Db::name('dinner_order')
                                ->where('id',$res['dinner_order_id'])
                                ->update([
                                    'state'=>5,
                                    'update_time'=>getTime()
                                ]);
                        }
                    }
                }

                $r = Db::name($this->table)
                    ->where('id',$id)
                    ->update([
                        'status'=>$status,
                        'op_user_id'=>$this->userId,
                        'op_time'=>getTime(),
                        'refuse_remark'=>$remark
                    ]);
                if(!$r){
                    \exception('操作失败');
                }
                if($status==5&&$res['order_type']==1&&$res['is_replace']==0) {
                    $checkAll =  Db::name('dinner_order_item')
                        ->where('order_id',$res['dinner_order_id'])
                        ->where('is_refuse',0)
                        ->find();
                    if($checkAll){//部分退款
                         Db::name('dinner_order')
                            ->where('id',$res['dinner_order_id'])
                            ->update([
                                'state'=>7,
                                'update_time'=>getTime()
                            ]);
                    }
                    if($res['refuse_price'] > 0){
                        $orderInfo = Db::name('dinner_order')
                            ->where('id',$res['dinner_order_id'])
                            ->find();
                        $config =get_pay_wechat($orderInfo['org_id']);

                        if(empty($config['mch_id']) || empty($config['key'])){
                            \exception('微信商户信息未配置,请联系管理员');
                        }
                        $app = \EasyWeChat\Factory::payment($config);
                        $totalFee = intval(round($orderInfo['price']*100));
                        $refundFee = intval(round($res['refuse_price']*100));
                        $ret = $app->refund->byOutTradeNumber($orderInfo['sn'], 'T'.$orderInfo['sn'], $totalFee, $refundFee);
                        if($ret['return_code'] != 'SUCCESS' || $ret['result_code'] != 'SUCCESS'){
                            trace(json_encode($ret),'error');
                            \exception('退款申请提交失败');
                        }
                    }
                }
                if($status==6){ // 拒绝,返还
                    $all = Db::name('dinner_order_refuse_item')->where('order_refuse_id',$id)->select();

                    if($order['cate'] == 0){
                        foreach ($all as $k=>$v){
                            Db::name('dinner_order_item')
                                ->where('dinner_id',$v['dinner_id'])
                                ->where('dinner_type_id',$v['dinner_type_id'])
                                ->where('is_refuse',1)
                                ->setField('is_refuse',0);
                        }
                    }else{
                        foreach ($all as $k=>$v){
                            Db::name('dinner_order_item')
                                ->where('dinner_id',$v['dinner_id'])
                                ->where('dinner_type_id',$v['dinner_type_id'])
                                ->where('order_id',$res['dinner_order_id'])
                                ->where('day',$v['day'])
                                ->where('is_refuse',1)
                                ->update(['is_refuse'=>0]);
                        }
                    }
                }


                Db::commit();
                $this->success('操作成功');
            }catch (Exception $e){
                Db::rollback();
                $this->error($e->getMessage());
            }

        }else{
            $this->assign('id',$id);
            return $this->fetch();
        }
    }


}