<?php 

namespace wstmart\admin\model;

use think\Db;

use think\Loader;

/**

 * ============================================================================

 * 结算业务处理

 */

class Settlements extends Base{

    /**

	 * 获取结算列表

	 */

	public function pageQuery(){

		$settlementNo = input('settlementNo');

		$shopName = input('shopName');

		$settlementStatus = (int)input('settlementStatus',-1);

		$sort = input('sort');

		$where = [];

		if($settlementNo!='')$where['settlementNo'] = ['like','%'.$settlementNo.'%'];

        if($shopName!='')$where['shopName|shopSn'] = ['like','%'.$shopName.'%']; 

        if($settlementStatus>=0)$where['settlementStatus'] = $settlementStatus;

        $order = 'st.settlementId desc';

        if($sort){

        	$sortArr = explode('.',$sort);

        	$order = $sortArr[0].' '.$sortArr[1];

        	if($sortArr[0]=='settlementNo'){

        		$order = $sortArr[0].'+0 '.$sortArr[1];

        	}

        }

        $result=Db::name('settlements')->alias('st')

            ->join('__SHOPS__ s','s.shopId=st.shopId','left')

            ->join('__ORDERS__ o','o.settlementId=st.settlementId','left')

            ->join('__SHOPS_DEPOSIT_DETAIL__ sd','sd.orderId=o.orderId','left')

            ->join('__PAYMENTS__ p','p.payCode=o.payFrom','left')

            ->where($where)->field('s.shopName,settlementNo,sd.cashDeposit,st.settlementId,st.settlementMoney,st.commissionFee,st.backMoney,st.settlementStatus,st.settlementTime,st.createTime,payFrom,payName')->order($order)

			->paginate(input('limit/d'))->toArray();

        return $result;

	}



	/**

	 * 获取结算订单详情

	 */

	public function getById(){

        $settlementId = (int)input('id');

        $object =  Db::name('settlements')->alias('st')->where('settlementId',$settlementId)->join('__SHOPS__ s','s.shopId=st.shopId','left')->field('s.shopName,st.*')->find();

        // dump($object);die;

        

        if(!empty($object)){

        	$object['list'] = Db::name('orders')->alias('o')->join('__SHOPS_DEPOSIT_DETAIL__ sd','o.orderId=sd.orderId','left')->where(['o.settlementId'=>$settlementId])

        	          ->field('sd.cashDeposit,o.orderId,orderNo,o.payType,goodsMoney,deliverMoney,realTotalMoney,totalMoney,commissionFee,scoreMoney,createTime')

        	          ->order('payType desc,orderId desc')->select();

        }

        // dump($object);die;

        return $object;

	}

	/**

	 * 处理订单

	 */

	public function handle(){

		$id = (int)input('settlementId');

		$remarks = input('remarks');

		Db::startTrans();

        try{

			$object = $this->get($id);

			$object->settlementStatus = 1;

			$object->settlementTime = date('Y-m-d H:i:s');

			if($remarks!='')$object->remarks = $remarks;

			$rs = $object->save();

			if(false !== $rs){

				$shop = model('Shops')->get($object->shopId);

				WSTSendMsg($shop['userId'],"您的结算申请【".$object->settlementNo."】已处理,请留意到账户息哦~",['from'=>4,'dataId'=>$id]);

				$shop->shopMoney = $shop->shopMoney+$object->backMoney;

				$shop->paymentMoney = $shop->paymentMoney + $object->commissionFee;

				$shop->save();

                $lmarr = [];

				//增加资金变动信息

                if($object->settlementMoney>0){

                    $lm = [];

                    $lm['targetType'] = 1;

                    $lm['targetId'] = $object->shopId;

                    $lm['dataId'] = $id;

                    $lm['dataSrc'] = 2;

                    $lm['remark'] = '结算订单申请【'.$object->settlementNo.'】收入订单金额¥'.$object->settlementMoney;

                    $lm['moneyType'] = 1;

                    $lm['money'] = $object->settlementMoney;

                    $lm['payType'] = 0;

                    $lm['createTime'] = date('Y-m-d H:i:s');

                    $lmarr[] = $lm;

                }

                if($object->commissionFee>0){

                    //要对有积分支付的佣金记录进行处理

                    $commissionFee = $object->commissionFee;

                    //如果backMoney小于0则说明平台收到的钱不足以支付佣金,这个backMoney已经减去了积分支付,所以直接显示backMoney为应付的佣金就好

                    if($object->backMoney<0){

                        $commissionFee = $object->backMoney;

                    }

                    $lm = [];

                    $lm['targetType'] = 1;

                    $lm['targetId'] = $object->shopId;

                    $lm['dataId'] = $id;

                    $lm['dataSrc'] = 2;

                    $lm['remark'] = '结算订单申请【'.$object->settlementNo.'】支出订单佣金¥'.$commissionFee."。".(($object->remarks!='')?"【操作备注】:".$object->remarks:'');

                    $lm['moneyType'] = 0;

                    $lm['money'] = $commissionFee;

                    $lm['payType'] = 0;

                    $lm['createTime'] = date('Y-m-d H:i:s');

                    $lmarr[] = $lm;

                }

				if(count($lmarr)>0)model('LogMoneys')->saveAll($lmarr);

				Db::commit();

				return WSTReturn('操作成功!',1);

			}

		}catch (\Exception $e) {

            Db::rollback();errLog($e);

        }

		return WSTReturn('操作失败!',-1);

	}



	/**

	 * 获取订单商品

	 */

	public function pageGoodsQuery(){

        $id = (int)input('id');

        return Db::name('orders')->alias('o')->join('__ORDER_GOODS__ og','o.orderId=og.orderId')->where('o.settlementId',$id)

        ->field('orderNo,og.goodsPrice,og.goodsName,og.goodsSpecNames,og.goodsNum,og.commissionRate')->order('o.payType desc,o.orderId desc')->paginate(input('limit/d'))->toArray();

    }



    /**

     * 获取待结算商家

     */

    public function pageShopQuery(){

    	$areaIdPath = input('areaIdPath');

    	$shopName = input('shopName');

    	$where = [];

    	if($shopName!='')$where['s.shopName|s.shopSn'] = ['like','%'.$shopName.'%'];

    	if($areaIdPath !='')$where['s.areaIdPath'] = ['like',$areaIdPath."%"];

    	$where['s.dataFlag'] = 1;

    	$where['s.noSettledOrderNum'] = ['>',0];

		return Db::table('__SHOPS__')->alias('s')->join('__AREAS__ a2','s.areaId=a2.areaId')

		       ->where($where)

		       ->field('shopId,shopSn,shopName,a2.areaName,shopkeeper,telephone,abs(noSettledOrderFee) noSettledOrderFee,noSettledOrderNum')

		       ->order('noSettledOrderFee desc')->paginate(input('limit/d'));



	}



   /**

    * 获取商家未结算的订单

    */

   public function pageShopOrderQuery(){

   	     $orderNo = input('orderNo');

   	     $payType = (int)input('payType',-1);

         $where = [];

         $where['settlementId'] = 0;

         $where['orderStatus'] = 2;

         $where['shopId'] = (int)input('id');

         $where['dataFlag'] = 1;

         if($orderNo!='')$where['orderNo'] = ['like','%'.$orderNo.'%'];

         if(in_array($payType,[0,1]))$where['payType'] = $payType;

   	     $page = Db::name('orders')->where($where)

        	          ->field('orderId,orderNo,payType,goodsMoney,deliverMoney,realTotalMoney,totalMoney,commissionFee,createTime')

        	          ->order('payType desc,orderId desc')->paginate(input('limit/d'))->toArray();

        if(count($page['Rows'])>0){

        	foreach ($page['Rows'] as $key => $v) {

        		$page['Rows'][$key]['payTypeName'] = WSTLangPayType($v['payType']);

        	}

        }

        return $page;

   }



   /**

    * 生成结算单

    */

	public function generateSettleByShop(){

		$shopId = (int)input('id');

		$where = [];

		$where['shopId'] = $shopId;

		$where['dataFlag'] = 1;

		$where['orderStatus'] = 2;

		$where['settlementId'] = 0;

		$orders = Db::name('orders')->where($where)->field('orderId,payType,realTotalMoney,scoreMoney,commissionFee')->select();

    	if(empty($orders))return WSTReturn('没有需要结算的订单,请刷新后再核对!');

    	$settlementMoney = 0;

        $commissionFee = 0;    //平台要收的佣金

        $ids = [];

    	foreach ($orders as $key => $v) {

            $ids[] = $v['orderId'];

    		if($v['payType']==1){

                $settlementMoney += $v['realTotalMoney']+$v['scoreMoney'];

            }else{

                $settlementMoney += $v['scoreMoney'];

            }

            $commissionFee += abs($v['commissionFee']);

    	}

    	$backMoney = $settlementMoney-$commissionFee;

    	$shops = model('shops')->get($shopId);

    	if(empty($shops))WSTReturn('无效的店铺结算账号!');

    	Db::startTrans();

		try{

            $data = [];

            $data['settlementType'] = 0;

            $data['shopId'] = $shopId;

            $data['settlementMoney'] = $settlementMoney;

            $data['commissionFee'] = $commissionFee;

            $data['backMoney'] = $settlementMoney-$commissionFee;

            $data['settlementStatus'] = 1;

            $data['settlementTime'] = date('Y-m-d H:i:s');

            $data['createTime'] = date('Y-m-d H:i:s');

            $data['settlementNo'] = '';

            $result = $this->save($data);

            if(false !==  $result){

            	$this->settlementNo = $this->settlementId.(fmod($this->settlementId,7));

            	$this->save();

            	//修改商家订单情况

                Db::name('orders')->where(['orderId'=>['in',$ids]])->update(['settlementId'=>$this->settlementId]);

                $shops->shopMoney = $shops->shopMoney + $backMoney;

                $shops->noSettledOrderNum = 0;

                $shops->noSettledOrderFee = 0;

                $shops->paymentMoney = 0;

                //修改商家充值金额

                $lockCashMoney = (($shops->rechargeMoney - $commissionFee)>=0)?($shops->rechargeMoney - $commissionFee):0;

                $shops->rechargeMoney = $lockCashMoney;

                $shops->save();

                

                //发消息

                $tpl = WSTMsgTemplates('SHOP_SETTLEMENT');

                if( $tpl['tplContent']!='' && $tpl['status']=='1'){

                    $find = ['${SETTLEMENT_NO}'];

                    $replace = [$this->settlementNo];

                    

                    $msg = array();

                    $msg["shopId"] = $shopId;

                    $msg["tplCode"] = $tpl["tplCode"];

                    $msg["msgType"] = 1;

                    $msg["content"] = str_replace($find,$replace,$tpl['tplContent']) ;

                    $msg["msgJson"] = ['from'=>4,'dataId'=>$this->settlementId];

                    model("common/MessageQueues")->add($msg);

                }

                //增加资金变动信息

                $lmarr = [];

                if($settlementMoney>0){

                    $lm = [];

                    $lm['targetType'] = 1;

                    $lm['targetId'] = $shopId;

                    $lm['dataId'] = $this->settlementId;

                    $lm['dataSrc'] = 2;

                    $lm['remark'] = '结算订单申请【'.$this->settlementNo.'】收入订单金额¥'.$settlementMoney."。";

                    $lm['moneyType'] = 1;

                    $lm['money'] = $settlementMoney;

                    $lm['payType'] = 0;

                    $lm['createTime'] = date('Y-m-d H:i:s');

                    $lmarr[] = $lm;

                }

                if($commissionFee>0){

    				$lm = [];

    				$lm['targetType'] = 1;

    				$lm['targetId'] = $shopId;

    				$lm['dataId'] = $this->settlementId;

    				$lm['dataSrc'] = 2;

    				$lm['remark'] = '结算订单申请【'.$this->settlementNo.'】收取订单佣金¥'.$commissionFee."。";

    				$lm['moneyType'] = 0;

    				$lm['money'] = $commissionFee;

    				$lm['payType'] = 0;

    				$lm['createTime'] = date('Y-m-d H:i:s');

                    $lmarr[] = $lm;

                }

				if(count($lmarr)>0)model('LogMoneys')->saveAll($lmarr);

				Db::commit();

            	return WSTReturn('生成结算单成功',1);

            }

		}catch (\Exception $e) {

            Db::rollback();errLog($e);

        }

        return WSTReturn('生成结算单失败',-1);

    }

	/**

     * 导出

     */

    public function toExport(){

        $name='结算申请表';

        $settlementNo = input('settlementNo');

        $shopName = input('shopName');

        $settlementStatus = (int)input('settlementStatus',-1);

        $sort = input('sort');

        $where = [];

        if($settlementNo!='')$where['settlementNo'] = ['like','%'.$settlementNo.'%'];

        if($shopName!='')$where['shopName|shopSn'] = ['like','%'.$shopName.'%']; 

        if($settlementStatus>=0)$where['settlementStatus'] = $settlementStatus;

        $order = 'st.settlementId desc';

        if($sort){

            $sortArr = explode('.',$sort);

            $order = $sortArr[0].' '.$sortArr[1];

            if($sortArr[0]=='settlementNo'){

                $order = $sortArr[0].'+0 '.$sortArr[1];

            }

        }

        $page=Db::name('settlements')->alias('st')

            ->join('__SHOPS__ s','s.shopId=st.shopId','left')

            ->join('__ORDERS__ o','o.settlementId=st.settlementId','left')

            ->join('__SHOPS_DEPOSIT_DETAIL__ sd','sd.orderId=o.orderId','left')

            ->join('__PAYMENTS__ p','p.payCode=o.payFrom','left')

            ->where($where)->field('s.shopName,settlementNo,sd.cashDeposit,st.settlementId,st.settlementMoney,st.commissionFee,st.backMoney,st.settlementStatus,st.settlementTime,st.createTime,payFrom,payName')->order($order)

            ->select();

        foreach($page as &$v){

            $order_list=db('orders')->where('settlementId',$v['settlementId'])->field('orderNo,realTotalMoney,scoreMoney')->select();

            $v['order_number']='';

            if(count($order_list)>0){

                foreach($order_list as $val){

                    $v['order_number']=$v['order_number'].$val['orderNo'].',';//

                }

                //.$order_list['realTotalMoney'].$order_list['scoreMoney'];

            }

        }

        Loader::import('phpexcel.PHPExcel.IOFactory');

        $objPHPExcel = new \PHPExcel();

        // 设置excel文档的属性

        $objPHPExcel->getProperties()->setCreator("WSTMart")//创建人

        ->setLastModifiedBy("WSTMart")//最后修改人

        ->setTitle($name)//标题

        ->setSubject($name)//题目

        ->setDescription($name)//描述

        ->setKeywords("结算")//关键字

        ->setCategory("Test result file");//种类

    

        // 开始操作excel表

        $objPHPExcel->setActiveSheetIndex(0);

        // 设置工作薄名称

        $objPHPExcel->getActiveSheet()->setTitle(iconv('gbk', 'utf-8', 'Sheet'));

        // 设置默认字体和大小

        $objPHPExcel->getDefaultStyle()->getFont()->setName(iconv('gbk', 'utf-8', ''));

        $objPHPExcel->getDefaultStyle()->getFont()->setSize(11);

        $styleArray = array(

                'font' => array(

                        'bold' => true,

                        'color'=>array(

                                'argb' => 'ffffffff',

                        )

                ),

                'borders' => array (

                        'outline' => array (

                                'style' => \PHPExcel_Style_Border::BORDER_THIN,  //设置border样式

                                'color' => array ('argb' => 'FF000000'),     //设置border颜色

                        )

                )

        );

        //设置宽

        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(25);

        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(12);

        $objPHPExcel->getActiveSheet()->getStyle('A1:K1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);

        $objPHPExcel->getActiveSheet()->getStyle('A1:K1')->getFill()->getStartColor()->setARGB('333399');

        

        $objPHPExcel->getActiveSheet()->setCellValue('A1', '结算单号')

        ->setCellValue('B1', '申请店铺')->setCellValue('C1', '结算金额')

        ->setCellValue('D1', '结算佣金')->setCellValue('E1', '扣除质保金')->setCellValue('F1', '返还金额')

        ->setCellValue('G1', '申请时间')->setCellValue('H1', '状态')

        ->setCellValue('I1', '订单单号')->setCellValue('J1', '支付方式');

        $objPHPExcel->getActiveSheet()->getStyle('A1:I1')->applyFromArray($styleArray);

    

        for ($row = 0; $row < count($page); $row++){

            $i = $row+2;

            $objPHPExcel->getActiveSheet()

            ->setCellValue('A'.$i, $page[$row]['settlementNo'])

            ->setCellValue('B'.$i, $page[$row]['shopName'])

            ->setCellValue('C'.$i, '¥'.$page[$row]['settlementMoney'])

            ->setCellValue('D'.$i, '¥'.$page[$row]['commissionFee'])

            ->setCellValue('E'.$i, '¥'.(float)$page[$row]['cashDeposit'])

            ->setCellValue('F'.$i, '¥'.$page[$row]['backMoney'])

            ->setCellValue('G'.$i, $page[$row]['createTime'])

            ->setCellValue('H'.$i, $page[$row]['settlementStatus']==1?'已结算':'未结算')

            ->setCellValue('I'.$i, $page[$row]['order_number'])

            ->setCellValue('J'.$i, $page[$row]['payName']);



        }

    

        //输出EXCEL格式

        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

        // 从浏览器直接输出$filename

        header('Content-Type:application/csv;charset=UTF-8');

        header("Pragma: public");

        header("Expires: 0");

        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");

        header("Content-Type:application/force-download");

        header("Content-Type:application/vnd.ms-excel;");

        header("Content-Type:application/octet-stream");

        header("Content-Type:application/download");

        header('Content-Disposition: attachment;filename="'.$name.'.xls"');

        header("Content-Transfer-Encoding:binary");

        $objWriter->save('php://output');

    }

}