<?php
namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Redis;
use Request;
use Excel;
use DB;

class OrderModel extends Model
{
    protected $connection = 'order';
    protected $table      = 'lie_order';
    protected $primaryKey = 'order_id';
    public $timestamps    = false;

	// 订单导出
	public function orderExport($request, $info)
	{
        set_time_limit(0); 
        ini_set('memory_limit', '2048M');
        
		$map = array();

        $userMainModel = new UserMainModel();
        $map['testMobile'] = $userMainModel->testMobile();

        // 页面参数
        if ($request->isMethod('get')) {
            $map['order_type']           = $request->input('order_type', '');
            $map['order_contain']        = $request->input('order_contain', '');
            $map['time_start']           = $request->input('time_start', '');
            $map['time_end']             = $request->input('time_end', '');
            $map['order_status']         = $request->input('order_status', '');
            $map['shipping_name']        = $request->input('shipping_name', '');
            $map['order_send']           = $request->input('order_send', '');
            $map['test_order']           = $request->input('test_order', '');
            $map['order_pay_type']       = $request->input('order_pay_type', '');
            $map['order_type_a']         = $request->input('order_type_a', '');
            $map['order_source_pf']      = $request->input('order_source_pf', '');
            $map['order_source_adtag']   = $request->input('order_source_adtag', '');
            $map['order_source_ptag']    = $request->input('order_source_ptag', '');
            $map['erp_order_id']         = $request->input('erp_order_id', '');
            $map['order_payment_mode']   = $request->input('order_payment_mode', '');
            $map['order_invoice_status'] = $request->input('order_invoice_status', '');
            $map['order_goods_type']     = $request->input('order_goods_type', '');
            $map['is_new']               = $request->input('is_new', '');
            $map['is_new_order']         = $request->input('is_new_order', '');
            $map['sale_type']            = $request->input('sale_type', '');
            $map['business_type']        = $request->input('business_type', '');
        }

        /* 临时添加 所有人只能查看线上订单 */
        // $map['online_order'] = 1;

        // 非竞调账号,则查看真实数据
        if ($info['role'] != 13) {
            $map['is_fake'] = 0;
        }

        if ($map['order_goods_type'] == 1) {
            $map['order_type_filter'] = in_array($info['role'], [1, 13]) ? [1, 2, 3] : [1]; // 管理员和尽调账号可以查看平台、ERP、京东订单
        } else {
            $map['order_type_filter'] = [1, 3, 4]; // 1.网站 3.京东 4.象牙宝
        } 

        $list = $this->from('lie_order_items as it')
                ->leftJoin('lie_order as o', 'it.order_id', '=', 'o.order_id')
                ->leftJoin('lie_pay_log as p', 'it.order_id', '=', 'p.order_id')
                ->leftJoin('lie_order_invoice as i', 'it.order_id', '=', 'i.order_id')
                ->leftJoin('lie_order_extend as oe', 'oe.order_id', '=', 'i.order_id')
                ->leftJoin('lie_order_address as a', function($join) {
                    $join->on('it.order_id', '=', 'a.order_id')->where('a.address_type', '=', 1);
                })
                ->leftJoin('lie_order_shipping as s', function($join) {
                    $join->on('it.order_id', '=', 's.order_id')->where('s.shipping_type', '=', 1);
                })
                ->leftJoin('lie_user_main as u', 'it.user_id', '=', 'u.user_id')
                ->leftJoin('lie_user_company as c', 'it.user_id', '=', 'c.user_id')
                ->where(function ($query) use ($map) {
                    // 查询类型
                    if (!empty($map['order_contain'])) {
                        if ($map['order_type'] == 1) { // 会员账号 
                            if (preg_match('/@/', $map['order_contain'])) {
                                $query->where('u.email', '=', $map['order_contain']);
                            } else {
                                $query->where('u.mobile', '=', $map['order_contain']);
                            }             
                        } else if ($map['order_type'] == 2) { // 型号名称
                            $query->where('it.goods_name', '=', $map['order_contain']);
                        } else if ($map['order_type'] == 3) { // 发票抬头
                            $query->where('i.tax_title', '=', $map['order_contain']);
                        } else if($map['order_type'] == 4) {
                            $query->where('o.user_id', '=', $map['order_contain']);
                        } else { // 订单编号
                            $query->where('o.order_sn', '=', $map['order_contain']);
                        }
                    }
                })
                ->where(function ($query) use ($map) {
                    // 创建时间
                    if (!empty($map['time_start']) && !empty($map['time_end'])) {
                        $query->whereBetween('o.create_time', [$map['time_start'], $map['time_end']]); 
                    } else if (!empty($map['time_start'])) {
                        $query->where('o.create_time', '>', $map['time_start']);
                    } else if (!empty($map['time_end'])) {
                        $query->where('o.create_time', '<', $map['time_end']); 
                    }
                })
                ->where(function ($query) use ($map) {
                    // 订单状态
                    if (!empty($map['order_status'])) {
                        $query->whereIn('o.status', explode(',', $map['order_status']));
                    }
                })
                ->where(function ($query) use ($map) {
                    // 配送方式
                    if (!empty($map['shipping_name'])) {
                        $query->where('o.order_shipping_type', '=', $map['shipping_name']);
                    }
                })
                ->where(function ($query) use ($map) {
                    // 订单推送业务员
                    if (!empty($map['order_send'])) {
                        $query->whereIn('o.sale_id',  explode(',', $map['order_send']));
                    }
                })
                ->where(function ($query) use ($map) {
                    // 订单类型
                    if (!empty($map['order_pay_type'])) {
                        $query->where('o.order_pay_type', '=', $map['order_pay_type']);
                    }
                })
                ->where(function ($query) use ($map) {
                    // 测试订单
                    if (empty($map['test_order'])) {            
                        $query->whereNotIn('o.user_id', $map['testMobile']);
                    } 
                })
                ->where(function ($query) use ($map) {
                    // 订单来源
                    if (!empty($map['order_source_pf'])) {
                        $order_source_pf = explode(',', $map['order_source_pf']);
                        $string = '';

                        foreach ($order_source_pf as $v) {
                            switch ($v) {
                                case '1': 
                                case '2': 
                                case '6': 
                                    $string .= "FIND_IN_SET('pf=".$v."', o.order_source) OR "; 
                                    break;
                                case '3': 
                                    $string .= "oe.order_type != 0 OR "; 
                                    break;
                                case '4': 
                                    $string .= "o.order_type = 3 OR "; 
                                    break;
                                case '5': 
                                    $string .= "o.order_type = 2 OR ";
                                    break;
                                case '7': 
                                    $string .= "o.order_type = 4 OR "; 
                                    break;
                            }
                        }

                        $query->whereRaw(rtrim($string, ' OR '));

                        // if ($map['order_source_pf'] == 1) {
                        //     $query->whereRaw("FIND_IN_SET('pf=1', o.order_source)");
                        // } else {
                        //     $query->whereRaw("FIND_IN_SET('pf=2', o.order_source)");

                        // }
                    }
                })
                ->where(function ($query) use ($map) {
                    // adtags来源
                    if (!empty($map['order_source_adtag'])) {
                        $query->where('o.order_source', 'like', '%adtag='.$map['order_source_adtag'].'%');
                    }
                })
                ->where(function ($query) use ($map) {
                    // ptag来源
                    if (!empty($map['order_source_ptag'])) {
                        $query->where('o.order_source', 'like', '%ptag='.$map['order_source_ptag'].'%');
                    }
                })
                ->where(function ($query) use ($map) {
                    if ($map['order_type_filter']) { // 自营获取线上、京东、象牙宝订单
                        $query->whereIn('o.order_type', $map['order_type_filter']); 
                    }
                })
                ->where(function ($query) use ($map) {
                    // 同步状态
                    if (!empty($map['erp_order_id'])) {
                        $query->where('o.erp_order_id', '<>', '');    
                    }
                })
                ->where(function ($query) use ($map) {
                    // 竞调数据
                    if (isset($map['is_fake'])) {
                        $query->where('o.is_type', '=', $map['is_fake']);
                    }
                })
                ->where(function ($query) use ($map) {
                    // 支付方式
                    if (!empty($map['order_payment_mode'])) {
                        $pay_name = explode(',', $map['order_payment_mode']);
                        $order_payment_mode = [];

                        foreach ($pay_name as $v) {
                            switch ($v) {
                                case '1': $order_payment_mode[] = '微信支付';break;
                                case '2': $order_payment_mode[] = '支付宝';break;
                                case '3': $order_payment_mode[] = '银联支付(B2B)';break;
                                case '4': $order_payment_mode[] = '银联支付(B2C)';break;
                                case '5': $order_payment_mode[] = '账期支付';break;
                                case '6': $order_payment_mode[] = '京东支付';break;
                                case '7': $order_payment_mode[] = '交通银行';break;
                                case '8': $order_payment_mode[] = '恒生银行';break;
                                case '9': $order_payment_mode[] = '钱包支付';break;
                            }
                        }

                        $query->whereIn('p.pay_name', $order_payment_mode);
                    }
                })
                ->where(function ($query) use ($map) {
                    // 发票类型
                    if (!empty($map['order_invoice_status'])) {
                        $query->where('i.inv_type', '=', $map['order_invoice_status']);
                    }
                })
                ->where(function ($query) use ($map) {
                    // 是否为新用户
                    if ($map['is_new'] != '') {
                        $query->where('u.is_new', '=', $map['is_new']);
                    }
                })
                ->where(function ($query) use ($map) {
                    // 是否新订单
                    if ($map['is_new_order'] != '') {
                        $query->where('oe.is_new', '=', $map['is_new_order']);
                    }
                })
                ->where(function ($query) use ($map) {
                    // 自营其他业务类型
                    if ($map['business_type'] != '') {
                        $query->where('oe.order_type', '=', 3)->whereIn('oe.business_type', explode(',', $map['business_type']));
                    }
                })
                ->where(function ($query) use ($map) {
                    // 销售类型
                    if ($map['sale_type'] != '') {
                        $query->where('o.sale_type', '=', $map['sale_type']);
                    }
                })
                ->where('it.status', '<>', -1)
                ->where('o.order_goods_type', '=', $map['order_goods_type'])
                ->select('it.goods_id', 'it.goods_name', 'it.goods_number', 'it.goods_price', 'it.single_pre_price', 'it.brand_name', 'it.supplier_name', 'o.order_id', 'o.order_sn', 'o.order_type', 'o.order_pay_type', 'o.order_goods_type', 'o.order_source', 'o.create_time', 'o.status', 'o.order_amount', 'o.sale_type', 'o.currency', 'o.sale_id', 'o.cancel_reason', 'i.tax_title', 'i.inv_type', 'i.invoice_status', 'i.tax_title', 'i.company_address', 'i.company_phone', 'i.tax_no', 'i.bank_name', 'i.bank_account', 'a.consignee', 'a.address', 's.status as shipping_status', 'u.user_id', 'u.mobile', 'u.email', 'u.client_source', 'u.is_new', 'u.is_test', 'c.com_name', 'oe.send_remark', 'oe.is_new as is_new_order', 'oe.business_type', 'oe.jd_order_id', 'oe.exchange_rate')
                ->groupBy('it.rec_id')
                ->orderBy('o.create_time', 'DESC')
                ->get()
                ->toArray();

        if (!empty($list)) {
            // 订单数据处理
            $cellData = $this->exportList($list);

            // 标题
            if ($map['order_goods_type'] == 1) {
                $headerCell = ['订单ID', '订单编号', '京东订单编号', '会员账号', '收货人', '下单日期', '下单时间', '客户名称', '平台来源', 'SKUID', '商品型号', '制造商', '供应商', '数量', '单价', '均摊后单价', '商品小计', '币种', '客服', '商品总额', '运费', '附加费', '优惠券', '订单总额', '人民币总额', '付款类型', '订单状态', '发货状态', '收货地址', '发票类型', '发票状态', '发票抬头', '公司注册地址', '公司电话', 'adtags来源', '新用户来源', '取消原因', '推送备注', '是否为测试订单', '是否为新订单'];
            } else {
                $headerCell = ['订单ID', '订单编号', '京东订单编号', '会员账号', '收货人', '下单日期', '下单时间', '客户名称', '平台来源', 'SKUID', '商品型号', '制造商', '供应商', '数量', '单价', '均摊后单价', '商品小计', '币种', '客服', '商品总额', '运费', '附加费', '优惠券', '订单总额', '付款类型', '订单状态', '发货状态', '收货地址', '发票类型', '发票状态', '发票抬头', '公司注册地址', '公司电话', 'adtags来源', '新用户来源', '取消原因', '推送备注', '是否为测试订单', '销售类型', '业务类型'];
            }  

            array_unshift($cellData, $headerCell);

            $fileName = $map['order_goods_type'] == 1 ? '联营订单导出'.date('_YmdHis') : '自营订单导出'.date('_YmdHis');

            Excel::create($fileName, function($excel) use ($cellData){
                $excel->sheet('订单导出', function($sheet) use ($cellData){
                    $sheet->rows($cellData);
                });
            })->export('xls');
        } else {
            return redirect('/prompt')->with(['message'=>"数据为空无法导出!",'url' =>$_SERVER['HTTP_REFERER'], 'jumpTime'=>3,'status'=>false]);
        }
	}

	/**
     * 导出数据处理
     * @param  [type] $order [查询出的订单数据]
     * @return [type]        [description]
     */
    public function exportList($order)
    {
        // 订单发货状态
        $shipping_status = array(
            '-1' => '未配送',
            '1'  => '配送中',
            '2'  => '已签',
        );

        // 发票类型
        $inv_type = array(
            '1' => '不开发票',
            '2' => '普通发票',
            '3' => '增值税专用发票',
            '4' => '增值税普通发票',
        ); 

        // 发票状态
        $invoice_status = array(
            '-1' => '待确认',
            '1'  => '已开票',
            '2'  => '已发货', 
            '3'  => '已签收',
        );

        // 用户标签
        $user_tags = array(
            '0' => '用户',
            '1' => '新用户',
            '2' => '老用户',
        );

        $tmp = array();

        for ($i = 0; $i < count($order); $i++) {
            // 推送人
            if ($order[$i]['sale_id']) {
                $sales = DB::table('user_info')->where(['userId' => $order[$i]['sale_id']])->select('name')->first();
            }

            $tmp[$i]['order_id']     = $order[$i]['order_id'];
            $tmp[$i]['order_sn']     = "\t".$order[$i]['order_sn']."\t";
            $tmp[$i]['jd_order_id']  = "\t".$order[$i]['jd_order_id']."\t";
            
            $tmp[$i]['user_account'] = $order[$i]['mobile'] ? $order[$i]['mobile'] : $order[$i]['email'];
            // $tmp[$i]['is_new']     = $order[$i]['is_new'] == 1 ? '是' : '否'; // 是否为新用户
            
            $tmp[$i]['consignee']        = isset($order[$i]['consignee']) ? $order[$i]['consignee'] : '';
            $tmp[$i]['create_time_date'] = date('Y-m-d', $order[$i]['create_time']); 
            $tmp[$i]['create_time_sec']  = date('H:i:s', $order[$i]['create_time']); 
            $tmp[$i]['com_name']         = !empty($order[$i]['tax_title']) ? $order[$i]['tax_title'] : $order[$i]['com_name']; 
            $tmp[$i]['items_source']     = $this->getOrderSource($order[$i]['order_id'], $order[$i]['order_type']);

            $tmp[$i]['goods_id']         = $order[$i]['goods_id'];

            // 自营商品名称换成商品型号
            $tmp[$i]['goods_name']       = $order[$i]['order_goods_type'] == 1 ? $order[$i]['goods_name'] : $this->getGoodsName($order[$i]['goods_id']); 
            $tmp[$i]['brand_name']       = $order[$i]['brand_name'];  
            $tmp[$i]['supplier_name']    = $order[$i]['supplier_name']; 
            $tmp[$i]['goods_number']     = $order[$i]['goods_number']; 
            $tmp[$i]['goods_price']      = $order[$i]['goods_price'];  
            $tmp[$i]['single_pre_price'] = $order[$i]['single_pre_price'];  
            $tmp[$i]['goods_amount']     = $order[$i]['goods_number'] * $order[$i]['goods_price'];
            $tmp[$i]['currency']         = $order[$i]['currency'] == 1 ? 'RMB' : 'USD';
            $tmp[$i]['sale_name']        = isset($sales) ? $sales->name : '';  // 推送业务员
             
            if ($i > 0 && $order[$i]['order_id'] == $order[$i-1]['order_id']) {
                $tmp[$i]['goods_sum']    = '';
                $tmp[$i]['shipping_fee'] = '';
                $tmp[$i]['extra_fee']    = '';
                $tmp[$i]['coupon']       = '';
                $tmp[$i]['order_amount'] = '';   

                if ($order[$i]['order_goods_type'] == 1) {
                    $tmp[$i]['rmb_amount'] = ''; // 人民币总额  
                }
            } else {
                $tmp[$i]['goods_sum']    = $this->getOrderPrice($order[$i]['order_id'], 1);
                $tmp[$i]['shipping_fee'] = $this->getOrderPrice($order[$i]['order_id'], 3);
                $tmp[$i]['extra_fee']    = $this->getOrderPrice($order[$i]['order_id'], 2);
                $tmp[$i]['coupon']       = $this->getOrderPrice($order[$i]['order_id'], -4);
                $tmp[$i]['order_amount'] = $order[$i]['order_amount'];  

                if ($order[$i]['order_goods_type'] == 1) {
                    $tmp[$i]['rmb_amount']   = $order[$i]['currency'] == 2 ? $order[$i]['order_amount'] * $order[$i]['exchange_rate'] : $order[$i]['order_amount']; // 人民币总额  
                }
            }

            $tmp[$i]['order_type']      = !empty($order[$i]['order_pay_type']) ? Config('params.order_pay_type')[$order[$i]['order_pay_type']] : '未知';
            $tmp[$i]['order_status']    = !empty($order[$i]['status']) ? Config('params.order_status')[$order[$i]['status']] : '未知';
            $tmp[$i]['shipping_status'] = !empty($order[$i]['shipping_status']) ? $shipping_status[$order[$i]['shipping_status']] : '无发货信息'; // 发货状态
            $tmp[$i]['address']         = $order[$i]['address'];
            $tmp[$i]['inv_type']        =  $order[$i]['inv_type'] ? $inv_type[$order[$i]['inv_type']] : '未知'; // 发票类型
            $tmp[$i]['invoice_status']  = !empty($order[$i]['invoice_status']) ? $invoice_status[$order[$i]['invoice_status']] : '无发票信息'; // 发票状态
            $tmp[$i]['tax_title']       = $order[$i]['tax_title'];
            $tmp[$i]['company_address'] = $order[$i]['company_address'];
            $tmp[$i]['company_phone']   = $order[$i]['company_phone'];

            if ($i > 0 && $order[$i]['order_id'] == $order[$i-1]['order_id']) { 
                $tmp[$i]['adtags']        = '';
                $tmp[$i]['client_source'] = '';
                $tmp[$i]['cancel_reason'] = 
                $tmp[$i]['send_remark']   = '';
            } else {
                $tmp[$i]['adtags']          = $order[$i]['order_source'];
                $tmp[$i]['client_source']   = $order[$i]['client_source'];
                $tmp[$i]['cancel_reason']   = $order[$i]['cancel_reason'];
                $tmp[$i]['send_remark']     = $order[$i]['send_remark'];
            }

            $tmp[$i]['is_test'] = $order[$i]['is_test'] == 1 ? '是' : '否';

            if ($order[$i]['order_goods_type'] == 2) {
                $tmp[$i]['sale_type']     = $order[$i]['sale_type'] == 1 ? '现卖' : '预售';
                $tmp[$i]['business_type'] = $order[$i]['business_type'] ? Config('params.business_type')[$order[$i]['business_type']] : '正常订单'; // 自营其他业务类型
            } else {
                $tmp[$i]['is_new_order'] = $order[$i]['is_new_order'] == 1 ? '是' : '否'; // 是否为新订单
            }

            unset($sales);     
        }

        return $tmp;
    }

    // 获取自营商品型号
    public function getGoodsName($goods_id)
    {
        $goods_info = json_decode(Redis::hget('Self_SelfGoods', $goods_id), true);
        
        return $goods_info['goods_name'];
    }

    // 订单金额展示
    public function getOrderPrice($order_id, $type)
    {
        $price = DB::connection('order')->table('lie_order_price')->where('order_id', '=', $order_id)->where('price_type', '=', $type)->select('price')->first();

        return $price ? $price->price : 0;
    }

    // 获取订单来源
    public function getOrderSource($order_id, $order_type=1)
    {
        if ($order_type == 1) {
            $order = DB::connection('order')->table('lie_order_extend')->where('order_id', $order_id)->select('order_type')->first();

            if ($order) {
                switch ($order->order_type) {
                    case 1: 
                    case 2: 
                    case 3: 
                        return '后台';               
                }
            }

            $order_source = DB::connection('order')->table('lie_order')->where('order_id', $order_id)->select('order_source')->first();

            if (preg_match('/pf=1/', $order_source->order_source)) {
                $source = 'PC端';
            } else if (preg_match('/pf=2/', $order_source->order_source)) {
                $source = '移动端';
            } else if (preg_match('/pf=6/', $order_source->order_source)) {
                $source = '小程序';
            } else {
                $source = '未知';
            }

            return $source;
        } else if ($order_type == 2) {
            return 'ERP';
        } else if ($order_type == 3) {
            return '京东';
        } else if ($order_type == 4) {
            return '象牙宝';
        }

        return false;
    }
}