<?php
namespace wstmart\home\model;
use think\Db;
use think\Loader;
/**
 * ============================================================================
 * 结算类
 */
class Settlements extends Base{
    /**
     * 获取已结算的结算单列表
     */
    public function pageQuery(){
        $shopId = (int)session('WST_USER.shopId');
        $where = [];
        $where['shopId'] = $shopId;
        if(input('settlementNo')!='')$where['settlementNo'] = ['like','%'.input('settlementNo').'%'];
        if((int)input('isFinish')>=0)$where['settlementStatus'] = (int)input('isFinish');
        return Db::name('settlements')->alias('s')->where($where)->order('settlementId', 'desc')
            ->paginate(input('pagesize/d'));
    }
    /**
     *  获取未结算订单列表
     */
    public function pageUnSettledQuery(){
        $where = [];
        if(input('orderNo')!='')$where['orderNo'] = ['like','%'.input('orderNo').'%'];
        $where['dataFlag'] = 1;
        $where['orderStatus'] = 2;
        $where['settlementId'] = 0;
        $where['shopId'] = (int)session('WST_USER.shopId');
        $page =  Db::name('orders')->where($where)->order('orderId', 'desc')
                   ->field('orderId,orderNo,createTime,payType,goodsMoney,deliverMoney,totalMoney,commissionFee,realTotalMoney')
                   ->paginate(input('pagesize/d'))->toArray();
        if(count($page['Rows'])){
            foreach ($page['Rows'] as $key => $v) {
                $page['Rows'][$key]['payTypeNames'] = WSTLangPayType($v['payType']);
            }
        }
        return $page;
    }
    /**
     * 结算指定的订单
     */
    public function settlement(){
        $shopId = (int)session('WST_USER.shopId');
        $ids = input('ids');
        $where['dataFlag'] = 1;
        $where['orderStatus'] = 2;
        $where['settlementId'] = 0;
        $where['orderId'] = ['in',$ids];
        $where['shopId'] = $shopId;
        $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']);
        }
        
        $shops = model('shops')->get($shopId);
        if(empty($shops))WSTReturn('无效的店铺结算账号!');
        Db::startTrans();
        try{
            $areaNames  = model('areas')->getParentNames($shops['bankAreaId']);
            $data = [];
            $data['settlementType'] = 0;
            $data['shopId'] = $shopId;
            $data['settlementMoney'] = $settlementMoney;
            $data['commissionFee'] = $commissionFee;
            $data['backMoney'] = $settlementMoney-$commissionFee;
            $data['settlementStatus'] = 0;
            $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]);
                 //修改商家订单情况
                 $commissionFee = -1*$commissionFee;//平台要收的佣金就等于商家要付的钱
                 $shops->noSettledOrderNum = $shops->noSettledOrderNum-count($orders);
                 $shops->paymentMoney = $shops->paymentMoney + $commissionFee;
                 $shops->noSettledOrderFee = $shops->noSettledOrderFee-$commissionFee;
                 $shops->save();
                 Db::commit();
                 return WSTReturn('提交结算申请成功,请留意结算信息~',1);
            }
        }catch (\Exception $e) {
            Db::rollback();errLog($e);
        }
        return WSTReturn('提交结算申请失败',-1);
    }

    /**
     * 获取已结算订单
     */
    public function pageSettledQuery(){
        $where = [];
        if(input('settlementNo')!='')$where['settlementNo'] = ['like','%'.input('settlementNo').'%'];
        if(input('orderNo')!='')$where['orderNo'] = ['like','%'.input('orderNo').'%'];
        if((int)input('isFinish')>=0)$where['settlementStatus'] = (int)input('isFinish');
        $where['dataFlag'] = 1;
        $where['orderStatus'] = 2;
        $where['o.shopId'] = (int)session('WST_USER.shopId');
        $page = Db::name('orders')->alias('o')
          ->join('__SETTLEMENTS__ s','o.settlementId=s.settlementId')
          ->join('__PAYMENTS__ p','o.payFrom=p.payCode')->where($where)
          ->field('orderId,orderNo,payType,goodsMoney,deliverMoney,totalMoney,o.commissionFee,realTotalMoney,s.settlementTime,s.settlementNo,p.payName')->order('s.settlementTime desc')->paginate(input('pagesize/d'))->toArray();
        if(count($page['Rows'])){
            foreach ($page['Rows'] as $key => $v) {
                $page['Rows'][$key]['commissionFee'] = abs($v['commissionFee']);
                $page['Rows'][$key]['payTypeNames'] = WSTLangPayType($v['payType']);
            }
        }
        return $page;
    }

    /**
     * 获取结算订单详情
     */
    public function getById(){
        $shopId = (int)session('WST_USER.shopId');
        $settlementId = (int)input('id');
        $object =  Db::name('settlements')->alias('st')->where(['settlementId'=>$settlementId,'st.shopId'=>$shopId])->join('__SHOPS__ s','s.shopId=st.shopId','left')->field('s.shopName,st.*')->find();
        if(!empty($object)){
            $object['list'] = Db::name('orders')->where(['settlementId'=>$settlementId])
                      ->field('orderId,orderNo,payType,goodsMoney,deliverMoney,realTotalMoney,totalMoney,scoreMoney,commissionFee,createTime')
                      ->order('payType desc,orderId desc')->select();
        }
        return $object;
    }
    /**
   * 导出订单
   */
  public function toExport(){
    $name='已结算订单表';
    $where = [];
        if(input('settlementNo')!='')$where['settlementNo'] = ['like','%'.input('settlementNo').'%'];
        if(input('orderNo')!='')$where['orderNo'] = ['like','%'.input('orderNo').'%'];
        if((int)input('isFinish')>=0)$where['settlementStatus'] = (int)input('isFinish');
        $where['dataFlag'] = 1;
        $where['orderStatus'] = 2;
        $where['o.shopId'] = (int)session('WST_USER.shopId');
        $page = Db::name('orders')->alias('o')
          ->join('__SETTLEMENTS__ s','o.settlementId=s.settlementId')
          ->join('__PAYMENTS__ p','o.payFrom=p.payCode')->where($where)
          ->field('orderId,orderNo,payType,goodsMoney,deliverMoney,totalMoney,o.commissionFee,realTotalMoney,s.settlementTime,s.settlementNo,p.payName')->order('s.settlementTime desc')->select();
        if(count($page)){
            foreach ($page as $key => $v) {
                $page[$key]['commissionFee'] = abs($v['commissionFee']);
                $page[$key]['payTypeNames'] = WSTLangPayType($v['payType']);
            }
        }
    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(20);
    $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(30);
    $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(30);
    $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(12);
    $objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(12);
    $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(20);
    $objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(20);
    $objPHPExcel->getActiveSheet()->getStyle('A1:N1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
    $objPHPExcel->getActiveSheet()->getStyle('A1:N1')->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:J1')->applyFromArray($styleArray);
  
    for ($row = 0; $row < count($page); $row++){
      $i = $row+2;
      $objPHPExcel->getActiveSheet()
      ->setCellValue('A'.$i, $page[$row]['orderNo'])
      ->setCellValue('B'.$i, $page[$row]['payTypeNames'])
      ->setCellValue('C'.$i, $page[$row]['goodsMoney'])
      ->setCellValue('D'.$i, $page[$row]['deliverMoney'])
      ->setCellValue('E'.$i, $page[$row]['totalMoney'])
      ->setCellValue('F'.$i, $page[$row]['realTotalMoney'])
      ->setCellValue('G'.$i, $page[$row]['commissionFee'])
      ->setCellValue('H'.$i, $page[$row]['payName'])
      ->setCellValue('I'.$i, $page[$row]['settlementNo'])
      ->setCellValue('J'.$i, $page[$row]['settlementTime']);
    }
  
    //输出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');
  }
}