<?php
namespace wstmart\admin\model;
use think\Loader;
use think\Db;
use Env;
/**
 * ============================================================================
 * 退款订单业务处理类
 */
class OrderRefunds extends Base{
	
    /**
	 * 获取用户退款订单列表
	 */
	public function refundPageQuery(){
		$startDate = input('startDate');
		$endDate = input('endDate');
		$where = ['o.dataFlag'=>1];
		$where['orderStatus'] = ['in',[-1,-3]];
		$orderNo = input('orderNo');
		$shopName = input('shopName');
		$deliverType = (int)input('deliverType',-1);
		$areaId1 = (int)input('areaId1');
		if($areaId1>0){
			$where['s.areaIdPath'] = ['like',"$areaId1%"];
			$areaId2 = (int)input("areaId1_".$areaId1);
			if($areaId2>0)$where['s.areaIdPath'] = ['like',$areaId1."_"."$areaId2%"];
			$areaId3 = (int)input("areaId1_".$areaId1."_".$areaId2);
			if($areaId3>0)$where['s.areaId'] = $areaId3;
		}
		$isRefund = (int)input('isRefund',-1);
		if($orderNo!='')$where['orderNo'] = ['like','%'.$orderNo.'%'];
		if($shopName!='')$where['shopName|shopSn'] = ['like','%'.$shopName.'%'];
		
		if($deliverType!=-1)$where['o.deliverType'] = $deliverType;
		if($isRefund!=-1)$where['o.isRefund'] = $isRefund;

		if($startDate!='' && $endDate!=''){
			$where['orf.createTime'] = ['between',[$startDate.' 00:00:00',$endDate.' 23:59:59']];
		}else if($startDate!=''){
			$where['orf.createTime'] = ['>=',$startDate.' 00:00:00'];
		}else if($endDate!=''){
			$where['orf.createTime'] = ['<=',$endDate.' 23:59:59'];
		}
		// 排序
		$sort = input('sort');
		$order = [];
		if($sort!=''){
			$sortArr = explode('.',$sort);
			$order[$sortArr[0]] = $sortArr[1];
		}
		$page = Db::name('orders')->alias('o')->join('__SHOPS__ s','o.shopId=s.shopId','left')
		     ->join('__USERS__ u','o.userId=u.userId','left')
		     ->join('__ORDER_REFUNDS__ orf ','o.orderId=orf.orderId and refundStatus in (0,1,2)')
		     ->where($where)
		     ->field('orf.id refundId,o.orderId,o.orderNo,s.shopName,s.shopId,s.shopQQ,s.shopWangWang,o.goodsMoney,o.totalMoney,o.realTotalMoney,refundStatus,
		              o.orderStatus,u.loginName,o.deliverType,payType,payFrom,o.orderStatus,orderSrc,orf.backMoney,orf.backProductNum,orf.backCouponsNum,orf.backWangNum,orf.refundRemark,isRefund,orf.createTime,o.orderCode,o.useScore')
			 ->order($order)
			 ->order('orf.createTime', 'desc')
			 ->paginate(input('limit/d'))->toArray();

	    if(count($page['Rows'])>0){
	    	 foreach ($page['Rows'] as $key => $v){
	    	 	 $page['Rows'][$key]['payType'] = WSTLangPayType($v['payType']);
	    	 	 $page['Rows'][$key]['deliverType'] = WSTLangDeliverType($v['deliverType']==1);
	    	 	 $page['Rows'][$key]['status'] = WSTLangOrderStatus($v['orderStatus']);
				 $page['Rows'][$key]['orderCodeTitle'] = WSTOrderCodeTitle($v['orderCode']);
	    	 }
	    }
	    return $page;
	}
	/**
	 * 获取退款资料
	 */
	public function getInfoByRefund(){
		return $this->alias('orf')->join('__ORDERS__ o','orf.orderId=o.orderId')->where(['orf.id'=>(int)input('get.id'),'isRefund'=>0,'orderStatus'=>['in',[-1,-3]],'refundStatus'=>['in',[0,1]]])
		         ->field('orf.id refundId,orderNo,o.orderId,goodsMoney,refundReson,refundOtherReson,totalMoney,realTotalMoney,deliverMoney,payType,payFrom,backMoney,o.useScore,o.scoreMoney,tradeNo,orf.backProductNum,orf.backCouponsNum,orf.backWangNum,o.productNum,o.couponsNum,o.wangNum,o.moneyNum')
		         ->find();
	}
	/**
	 * 退款
	 */
	public function orderRefund(){
		$id = (int)input('post.id');
		if($id==0)return WSTReturn("操作失败!");
		$refund = $this->get($id);
		//if(empty($refund) || $refund->refundStatus!=1)return WSTReturn("该退款订单不存在或已退款!");
		if(empty($refund))return WSTReturn("该退款订单不存在或已退款!");
		$order = model('orders')->get($refund->orderId);
//		dump($order->payFrom);
		if($order->payType==1 && $order->payFrom=='wallets'){
			return $this->saveOrderRefund($refund,$order);
		}
		if($order->payType==1 && $order->payFrom=='ect'){
			return $this->ectOrderRefund($refund,$order);
		}
		if($order->payType==1 && $order->payFrom=='qlgpay'){
			return $this->qlgOrderRefund($refund,$order);
		}
		$content = input('post.content');
	        $refundId = (int)input('post.id');
	        $request_no = $order['orderNo'].$order['userId'];
	        $backMoney = $refund["backMoney"];
	        $tradeNo = $order['tradeNo'];
	        $refund_reason = "订单【".$order['orderNo']."】退款";
	        Loader::import('alipay.aop.AopClient', EXTEND_PATH,'.php');
	        Loader::import('alipay.aop.request.AlipayTradeRefundRequest', EXTEND_PATH,'.php');
	     //    require Env::get('root_path') . 'extend/alipay/aop/AopClient.php';
		   	// require Env::get('root_path') . 'extend/alipay/aop/request/AlipayTradeRefundRequest.php';
		   	$payment = model('common/payments')->getPayment("app_alipays");
		   	//dump($payment);
	        $aop = new \AopClient ();
	        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
	        $aop->appId = $payment["appId"];
	        $aop->rsaPrivateKey = $payment["rsaPrivateKey"];
	        $aop->alipayrsaPublicKey=$payment["alipayrsaPublicKey"];
	        $aop->apiVersion = '1.0';
	        $aop->signType = 'RSA2';
	        $aop->postCharset='UTF-8';
	        $aop->format='json';
	        $request = new \AlipayTradeRefundRequest ();

	        $request->setBizContent("{" .
	            "\"trade_no\":\"$tradeNo\"," .
	            "\"refund_amount\":\"$backMoney\"," .
	            "\"refund_reason\":\"$refund_reason\"," .
	            "\"out_request_no\":\"$request_no\"" .
	        "  }");

	        $result = $aop->execute ( $request); 
	        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
	        $resultCode = $result->$responseNode->code;
	        if(!empty($resultCode) && $resultCode == 10000){
	        	if($result->$responseNode->fund_change=="Y"){
	        		$obj = array();
			        $obj['refundTradeNo'] = $request_no;//退款单号
			        $obj['content'] = $content;
			        $obj['refundId'] = $refundId;
			        $rs = $this->complateOrderRefund($obj);
			        if($rs['status']==1){
			        	return WSTReturn("退款成功",1); 
			        }else{
			        	return WSTReturn("退款失败",1);
			        }
	        	}
	        } else {
	        	$msg = $result->$responseNode->sub_msg;
	        	//dump($msg);
	            return WSTReturn($msg,-1); 
	        }

	}
	public function complateOrderRefund($obj){
		Db::startTrans();
        try{
			$content = $obj['content'];
			$refundTradeNo = $obj['refundTradeNo'];
			$refundId = $obj['refundId'];
			$refund = $this->get($refundId);
			$order = model('orders')->get($refund->orderId);
			if(!(in_array($order->orderStatus,[-1,-3]) && $order->isRefund==0 && ($order->isPay==1 || ($order->payType==0 && $order->useScore>0))))return WSTReturn("无效的退款订单!");
			//修改退款单信息
			$refund->refundRemark = $content;
			$refund->refundTime = date('Y-m-d H:i:s');
			$refund->refundStatus = 2;
			$refund->refundTradeNo = $refundTradeNo;
			$refund->save();
			//修改订单状态
			$order->isRefund = 1;
			$order->save();	
			
			if($order->useScore>0){
				$score = [];
				$score['userId'] = $order->userId;
				$score['score'] = $order->useScore;
				$score['dataSrc'] = 4;
				$score['dataId'] = $refund['id'];
				$score['dataRemarks'] = "返还订单【".$order->orderNo."】积分".$order->useScore."个";
				$score['scoreType'] = 1;
				model('common/UserScores')->add($score);
			}
			
			//发送一条用户信息
			$tpl = WSTMsgTemplates('ORDER_REFUND_SUCCESS');
			if( $tpl['tplContent']!='' && $tpl['status']=='1'){
				$find = ['${ORDER_NO}','${REMARK}'];
				$replace = [$order->orderNo,$content];
				WSTSendMsg($order->userId,str_replace($find,$replace,$tpl['tplContent']),['from'=>1,'dataId'=>$order->orderId]);
			} 
			//微信消息
			if((int)WSTConf('CONF.wxenabled')==1){
				$reasonData = WSTDatas('REFUND_TYPE',$refund->refundReson);
				$params = [];
				$params['ORDER_NO'] = $order->orderNo;
				$params['REASON'] = $reasonData['dataName'].(($refund->refundReson==10000)?" - ".$refund->refundOtherReson:"");           
				$params['MONEY'] = $refund->backMoney.(($order['useScore']>0)?("【退回积分:".$order['useScore']."】"):"");
				WSTWxMessage(['CODE'=>'WX_ORDER_REFUND_SUCCESS','userId'=>$order->userId,'params'=>$params]);
			}
			//如果有钱剩下,那么就退回到商家钱包
			$shopMoneys = $order->realTotalMoney-$refund->backMoney;
			if($shopMoneys>0){
				//创建商家资金流水
				$lm = [];
				$lm['targetType'] = 1;
				$lm['targetId'] = $order->shopId;
				$lm['dataId'] = $order->orderId;
				$lm['dataSrc'] = 1;
				$lm['remark'] = '订单【'.$order->orderNo.'】退款,返回商家金额¥'.$shopMoneys."。";
				$lm['moneyType'] = 1;
				$lm['money'] = $shopMoneys;
				$lm['payType'] = 0;
				$lm['createTime'] = date('Y-m-d H:i:s');
				model('LogMoneys')->add($lm);
				//发送商家信息
				$tpl = WSTMsgTemplates('ORDER_SHOP_REFUND');
		        if( $tpl['tplContent']!='' && $tpl['status']=='1'){
		            $find = ['${ORDER_NO}','${MONEY}'];
		            $replace = [$order->orderNo,$shopMoneys];
		           
		        	$msg = array();
		            $msg["shopId"] = $order->shopId;
		            $msg["tplCode"] = $tpl["tplCode"];
		            $msg["msgType"] = 1;
		            $msg["content"] = str_replace($find,$replace,$tpl['tplContent']) ;
		            $msg["msgJson"] = ['from'=>1,'dataId'=>$order->orderId];
		            model("common/MessageQueues")->add($msg);
		        } 
		        //微信消息
				if((int)WSTConf('CONF.wxenabled')==1){
					$reasonData = WSTDatas('REFUND_TYPE',$refund->refundReson);
					$params = [];
					$params['ORDER_NO'] = $order->orderNo;
					$params['REASON'] = $reasonData['dataName'].(($refund->refundReson==10000)?" - ".$refund->refundOtherReson:"");
					$params['SHOP_MONEY'] = $shopMoneys;             
				    $params['MONEY'] = $refund->backMoney.(($order['useScore']>0)?("【退回积分:".$order['useScore']."】"):"");
				    
				    $msg = array();
					$tplCode = "WX_ORDER_SHOP_REFUND";
					$msg["shopId"] = $order->shopId;
		            $msg["tplCode"] = $tplCode;
		            $msg["msgType"] = 4;
		            $msg["paramJson"] = ['CODE'=>'WX_ORDER_SHOP_REFUND','params'=>$params];
		            $msg["msgJson"] = "";
		            model("common/MessageQueues")->add($msg);
				} 
			}
			Db::commit();
			return WSTReturn("退款成功",1); 
		}catch (\Exception $e) {
            Db::rollback();errLog($e);
        }
		return WSTReturn("退款失败,请刷新后再重试"); 
	}

	public function saveOrderRefund($refund,$order){
		$content = input('post.content');
		$lockCashMoney = $order["lockCashMoney"];
		if(!(in_array($order->orderStatus,[-1,-3]) && $order->isRefund==0 && ($order->isPay==1 || ($order->payType==0 && $order->useScore>0))))return WSTReturn("无效的退款订单!");
		Db::startTrans();
		try{
			//修改退款单信息
			$refund->refundRemark = $content;
			$refund->refundTime = date('Y-m-d H:i:s');
			$refund->refundStatus = 2;
			$refund->save();
			//修改订单状态
			$order->isRefund = 1;
			$order->save();
			//创建用户资金流水记录
			if($refund->backMoney>0){
				$lm = [];
				$lm['targetType'] = 0;
				$lm['targetId'] = $order->userId;
				$lm['dataId'] = $order->orderId;
				$lm['dataSrc'] = 1;
				$lm['remark'] = '订单【'.$order->orderNo.'】退款¥'.$refund->backMoney."。".(($content!='')?"【退款备注】:".$content:'');
				$lm['moneyType'] = 1;
				$lm['money'] = $refund->backMoney;
				$lm['payType'] = 0;
				$lm['createTime'] = date('Y-m-d H:i:s');
				model('common/LogMoneys')->add($lm);
				//修改用户充值金额
				model('users')->where(["userId"=>$order->userId])->setInc("rechargeMoney",($lockCashMoney>$refund->backMoney)?$refund->backMoney:$lockCashMoney);
			}

			if($order->useScore>0) {
				$score = [];
				$score['userId'] = $order->userId;
				$score['score'] = $order->useScore;
				$score['dataSrc'] = 4;
				$score['dataId'] = $refund['id'];
				$score['dataRemarks'] = "返还订单【" . $order->orderNo . "】积分" . $order->useScore . "个";
				$score['scoreType'] = 1;
				model('common/UserScores')->add($score);
			}
			//发送一条用户信息
			$tpl = WSTMsgTemplates('ORDER_REFUND_SUCCESS');
			if( $tpl['tplContent']!='' && $tpl['status']=='1'){
				$find = ['${ORDER_NO}','${REMARK}'];
				$replace = [$order->orderNo,$content];
				WSTSendMsg($order->userId,str_replace($find,$replace,$tpl['tplContent']),['from'=>1,'dataId'=>$order->orderId]);
			}
			//微信消息
			if((int)WSTConf('CONF.wxenabled')==1){
				$reasonData = WSTDatas('REFUND_TYPE',$refund->refundReson);
				$params = [];
				$params['ORDER_NO'] = $order->orderNo;
				$params['REASON'] = $reasonData['dataName'].(($refund->refundReson==10000)?" - ".$refund->refundOtherReson:"");
				$params['MONEY'] = $refund->backMoney.(($order['useScore']>0)?("【退回积分:".$order['useScore']."】"):"");
				WSTWxMessage(['CODE'=>'WX_ORDER_REFUND_SUCCESS','userId'=>$order->userId,'params'=>$params]);
			}
			//如果有钱剩下,那么就退回到商家钱包
			$shopMoneys = $order->realTotalMoney-$refund->backMoney;
			if($shopMoneys>0){
				//创建商家资金流水
				$lm = [];
				$lm['targetType'] = 1;
				$lm['targetId'] = $order->shopId;
				$lm['dataId'] = $order->orderId;
				$lm['dataSrc'] = 1;
				$lm['remark'] = '订单【'.$order->orderNo.'】退款,返回商家金额¥'.$shopMoneys."。";
				$lm['moneyType'] = 1;
				$lm['money'] = $shopMoneys;
				$lm['payType'] = 0;
				$lm['createTime'] = date('Y-m-d H:i:s');
				model('LogMoneys')->add($lm);
				//dump($lm);
				//发送商家信息
				$tpl = WSTMsgTemplates('ORDER_SHOP_REFUND');
				if( $tpl['tplContent']!='' && $tpl['status']=='1'){
					$find = ['${ORDER_NO}','${MONEY}'];
					$replace = [$order->orderNo,$shopMoneys];

					$msg = array();
					$msg["shopId"] = $order->shopId;
					$msg["tplCode"] = $tpl["tplCode"];
					$msg["msgType"] = 1;
					$msg["content"] = str_replace($find,$replace,$tpl['tplContent']) ;
					$msg["msgJson"] = ['from'=>1,'dataId'=>$order->orderId];
					model("common/MessageQueues")->add($msg);
				}
				//微信消息
				if((int)WSTConf('CONF.wxenabled')==1){
					$reasonData = WSTDatas('REFUND_TYPE',$refund->refundReson);
					$params = [];
					$params['ORDER_NO'] = $order->orderNo;
					$params['REASON'] = $reasonData['dataName'].(($refund->refundReson==10000)?" - ".$refund->refundOtherReson:"");
					$params['SHOP_MONEY'] = $shopMoneys;
					$params['MONEY'] = $refund->backMoney.(($order['useScore']>0)?("【退回积分:".$order['useScore']."】"):"");

					$msg = array();
					$tplCode = "WX_ORDER_SHOP_REFUND";
					$msg["shopId"] = $order->shopId;
					$msg["tplCode"] = $tplCode;
					$msg["msgType"] = 4;
					$msg["paramJson"] = ['CODE'=>'WX_ORDER_SHOP_REFUND','params'=>$params];
					$msg["msgJson"] = "";
					model("common/MessageQueues")->add($msg);
				}
			}
//			die;
			Db::commit();
			return WSTReturn("退款成功",1);
		}catch (\Exception $e) {
			Db::rollback();errLog($e);
		}
		return WSTReturn("退款失败,请刷新后再重试");
	}
	public function qlgOrderRefund($refund,$order){
		$content = input('post.content');
		//dump($refund);
		if(!(in_array($order->orderStatus,[-1,-3]) && $order->isRefund==0 && ($order->isPay==1 || ($order->payType==0 && $order->useScore>0))))return WSTReturn("无效的退款订单!");
		
		Db::startTrans();
		try{
			//修改退款单信息
			$refund->refundRemark = $content;
			$refund->refundTime = date('Y-m-d H:i:s');
			$refund->refundStatus = 2;
			//修改订单状态
			$order->isRefund = 1;
			$order->save();
			$userId = $order->userId;
			//创建用户资金流水记录
			$um = Db::name('users');
			$lmm = Db::name('log_moneys');
			$nowTime = time();
			//记录各个券支出
			//产品券
			if($refund->backProductNum > 0){
				Model('common/LogMoneys')->addMoneyLog(0,$userId,$order->orderId,1,'交易订单【'.$order->orderNo.'】退款¥'.$refund->backProductNum,1,$refund->backProductNum,'qlgpay',1);
			}
			//优惠券
			if($refund->backCouponsNum > 0){
				Model('common/LogMoneys')->addMoneyLog(0,$userId,$order->orderId,1,'交易订单【'.$order->orderNo.'】退款¥'.$refund->backCouponsNum,1,$refund->backCouponsNum,'qlgpay',2);
			}
			//旺旺券
			if($refund->backWangNum > 0){
				Model('common/LogMoneys')->addMoneyLog(0,$userId,$order->orderId,1,'交易订单【'.$order->orderNo.'】退款¥'.$refund->backWangNum,1,$refund->backWangNum,'qlgpay',3);
			}
			//发送一条用户信息
			$tpl = WSTMsgTemplates('ORDER_REFUND_SUCCESS');
			if( $tpl['tplContent']!='' && $tpl['status']=='1'){
				$find = ['${ORDER_NO}','${REMARK}'];
				$replace = [$order->orderNo,$content];
				WSTSendMsg($order->userId,str_replace($find,$replace,$tpl['tplContent']),['from'=>1,'dataId'=>$order->orderId]);
			}
			//微信消息
			if((int)WSTConf('CONF.wxenabled')==1){
				$reasonData = WSTDatas('REFUND_TYPE',$refund->refundReson);
				$params = [];
				$params['ORDER_NO'] = $order->orderNo;
				$params['REASON'] = $reasonData['dataName'].(($refund->refundReson==10000)?" - ".$refund->refundOtherReson:"");
				$params['MONEY'] = $refund->backMoney.(($order['useScore']>0)?("【退回积分:".$order['useScore']."】"):"");
				WSTWxMessage(['CODE'=>'WX_ORDER_REFUND_SUCCESS','userId'=>$order->userId,'params'=>$params]);
			}
			//如果有钱剩下,那么就退回到商家钱包
			$userId=Db::name('shops')->where('shopId',$order->shopId)->value('userId');
			$backShopNum = round($order->productNum - $refund->backProductNum,2);
			if($backShopNum > 0){
				Model('common/LogMoneys')->addMoneyLog(1,$order->shopId,$order->orderId,1,'交易订单【'.$order->orderNo.'】退款剩余收入¥'.$backShopNum,1,$backShopNum,'qlgpay',1);
			}
			$backShopNum = round($order->couponsNum - $refund->backCouponsNum,2);
			if($backShopNum > 0){
				Model('common/LogMoneys')->addMoneyLog(1,$order->shopId,$order->orderId,1,'交易订单【'.$order->orderNo.'】退款剩余收入¥'.$backShopNum,1,$backShopNum,'qlgpay',2);
			}
			$backShopNum = round($order->wangNum - $refund->backWangNum,2);
			if($backShopNum > 0){
				Model('common/LogMoneys')->addMoneyLog(1,$order->shopId,$order->orderId,1,'交易订单【'.$order->orderNo.'】退款剩余收入¥'.$backShopNum,1,$backShopNum,'qlgpay',3);
			}
			Db::commit();
			return WSTReturn("退款成功",1);
		}catch (\Exception $e) {
			dump($e);
			Db::rollback();errLog($e);
		}
		return WSTReturn("退款失败,请刷新后再重试");
	}
	public function ectOrderRefund($refund,$order){
		$content = input('post.content');
		$lockCashMoney = $order["lockCashMoney"];
		//dump($refund);
		if(!(in_array($order->orderStatus,[-1,-3]) && $order->isRefund==0 && ($order->isPay==1 || ($order->payType==0 && $order->useScore>0))))return WSTReturn("无效的退款订单!");
		
		Db::startTrans();
		try{
			//修改退款单信息
			$refund->refundRemark = $content;
			$refund->refundTime = date('Y-m-d H:i:s');
			$refund->refundStatus = 2;
			//修改订单状态
			$order->isRefund = 1;
			$order->save();
			//创建用户资金流水记录
			$ectInfo=db('orders_ect')->where('orderId',$order['orderId'])->field('ectPrice,orderEctNum')->find();
			//获取退还给用户的ECT数量
			$ectNum=round(($refund->backMoney/$ectInfo['ectPrice']),2);
			if($ectNum>0){
				$lm = [];
				$lm['targetType'] = 0;
				$lm['targetId'] = $order->userId;
				$lm['dataId'] = $order->orderId;
				$lm['dataSrc'] = 1;
				$lm['remark'] = '订单【'.$order->orderNo.'】退ECT数量'.$ectNum."。".(($content!='')?"【退款备注】:".$content:'');
				$lm['moneyType'] = 1;
				$lm['money'] = $ectNum;
				$lm['payType'] = "ect";
				$lm['createTime'] = date('Y-m-d H:i:s');
				model('common/LogMoneys')->add($lm);
			}
			if($order->useScore>0){
				$score = [];
				$score['userId'] = $order->userId;
				$score['score'] = $order->useScore;
				$score['dataSrc'] = 4;
				$score['dataId'] = $refund['id'];
				$score['dataRemarks'] = "返还订单【".$order->orderNo."】积分".$order->useScore."个";
				$score['scoreType'] = 1;
				model('common/UserScores')->add($score);
			}
			//发送一条用户信息
			$tpl = WSTMsgTemplates('ORDER_REFUND_SUCCESS');
			if( $tpl['tplContent']!='' && $tpl['status']=='1'){
				$find = ['${ORDER_NO}','${REMARK}'];
				$replace = [$order->orderNo,$content];
				WSTSendMsg($order->userId,str_replace($find,$replace,$tpl['tplContent']),['from'=>1,'dataId'=>$order->orderId]);
			}
			//微信消息
			if((int)WSTConf('CONF.wxenabled')==1){
				$reasonData = WSTDatas('REFUND_TYPE',$refund->refundReson);
				$params = [];
				$params['ORDER_NO'] = $order->orderNo;
				$params['REASON'] = $reasonData['dataName'].(($refund->refundReson==10000)?" - ".$refund->refundOtherReson:"");
				$params['MONEY'] = $refund->backMoney.(($order['useScore']>0)?("【退回积分:".$order['useScore']."】"):"");
				WSTWxMessage(['CODE'=>'WX_ORDER_REFUND_SUCCESS','userId'=>$order->userId,'params'=>$params]);
			}
			//如果有钱剩下,那么就退回到商家钱包,先获取总的ECT数量

			$backShopEctNum=round(($ectInfo['orderEctNum']-$ectNum),2);
			if($backShopEctNum>0){
				//创建商家资金流水
				$userId=db('shops')->where('shopId',$order['shopId'])->value('userId');
				$l = [];
				$l['targetType'] = 1;
				$l['targetId'] = $userId;
				$l['dataId'] = $order->orderId;
				$l['dataSrc'] = 1;
				$l['remark'] = '订单【'.$order->orderNo.'】退款,返回商家ect数量:'.$backShopEctNum."。";
				$l['moneyType'] = 1;
				$l['money'] = $backShopEctNum;
				$l['payType'] = "ect";
				$l['createTime'] = date('Y-m-d H:i:s');
				model('LogMoneys')->add($l);
				//dump(Db::getlastsql());die;
				//发送商家信息
				$tpl = WSTMsgTemplates('ORDER_SHOP_REFUND');
				if( $tpl['tplContent']!='' && $tpl['status']=='1'){
					$find = ['${ORDER_NO}','${MONEY}'];
					$replace = [$order->orderNo,$backShopEctNum];

					$msg = array();
					$msg["shopId"] = $order->shopId;
					$msg["tplCode"] = $tpl["tplCode"];
					$msg["msgType"] = 1;
					$msg["content"] = str_replace($find,$replace,$tpl['tplContent']) ;
					$msg["msgJson"] = ['from'=>1,'dataId'=>$order->orderId];
					model("common/MessageQueues")->add($msg);
				}
				//微信消息
				if((int)WSTConf('CONF.wxenabled')==1){
					$reasonData = WSTDatas('REFUND_TYPE',$refund->refundReson);
					$params = [];
					$params['ORDER_NO'] = $order->orderNo;
					$params['REASON'] = $reasonData['dataName'].(($refund->refundReson==10000)?" - ".$refund->refundOtherReson:"");
					$params['SHOP_MONEY'] = $backShopEctNum;
					$params['MONEY'] = $refund->backMoney.(($order['useScore']>0)?("【退回积分:".$order['useScore']."】"):"");

					$msg = array();
					$tplCode = "WX_ORDER_SHOP_REFUND";
					$msg["shopId"] = $order->shopId;
					$msg["tplCode"] = $tplCode;
					$msg["msgType"] = 4;
					$msg["paramJson"] = ['CODE'=>'WX_ORDER_SHOP_REFUND','params'=>$params];
					$msg["msgJson"] = "";
					model("common/MessageQueues")->add($msg);
				}
			}
			Db::commit();
			return WSTReturn("退款成功",1);
		}catch (\Exception $e) {
			Db::rollback();errLog($e);
		}
		return WSTReturn("退款失败,请刷新后再重试");
	}

	/**
	 * 导出订单
	 */
	public function toExport(){
		$name='退款订单表';
		$startDate = input('startDate');
		$endDate = input('endDate');
		$where = ['o.dataFlag'=>1];
		$where['orderStatus'] = ['in',[-1,-3]];
		$orderNo = input('orderNo');
		$shopName = input('shopName');
		$deliverType = (int)input('deliverType',-1);
		$areaId1 = (int)input('areaId1');
		if($startDate!='' && $endDate!=''){	
			$where['orf.createTime'] = ['between',[$startDate.' 00:00:00',$endDate.' 23:59:59']];
		}else if($startDate!=''){
			$where['orf.createTime'] = ['>=',$startDate.' 00:00:00'];
		}else if($endDate!=''){
			$where['orf.createTime'] = ['<=',$endDate.' 23:59:59'];
		}
		$isRefund = (int)input('isRefund',-1);
		if($orderNo!='')$where['orderNo'] = ['like','%'.$orderNo.'%'];
		if($shopName!='')$where['shopName|shopSn'] = ['like','%'.$shopName.'%'];
		if($deliverType!=-1)$where['o.deliverType'] = $deliverType;
		if($isRefund!=-1)$where['o.isRefund'] = $isRefund;

		if($areaId1>0){
		$where['s.areaIdPath'] = ['like',"$areaId1%"];
		$areaId2 = (int)input("areaId1_".$areaId1);
		if($areaId2>0)$where['s.areaIdPath'] = ['like',$areaId1."_"."$areaId2%"];
		$areaId3 = (int)input("areaId1_".$areaId1."_".$areaId2);
		if($areaId3>0)$where['s.areaId'] = $areaId3;
		}
		$isRefund = (int)input('isRefund',-1);

		// 排序
		$sort = input('sort');
		$order = [];
		if($sort!=''){
			$sortArr = explode('.',$sort);
			$order[$sortArr[0]] = $sortArr[1];
		}
		$page = Db::name('orders')->alias('o')->join('__SHOPS__ s','o.shopId=s.shopId','left')
		     ->join('__USERS__ u','o.userId=u.userId','left')
		     ->join('__ORDER_REFUNDS__ orf ','o.orderId=orf.orderId and refundStatus in (1,2)') 
		     ->where($where)
		     ->field('orf.id refundId,o.orderId,o.orderNo,s.shopName,s.shopId,s.shopQQ,s.shopWangWang,o.goodsMoney,o.totalMoney,o.realTotalMoney,
		              o.orderStatus,u.loginName,o.deliverType,payType,o.payFrom,o.orderStatus,orderSrc,orf.backMoney,orf.refundRemark,isRefund,orf.createTime,o.orderCode,o.useScore')
			 ->order($order)
			 ->order('orf.createTime', 'desc')
			 ->select();
	    if(count($page)>0){
	    	 foreach ($page as &$v){
	    	 	$v['payType'] = WSTLangPayType($v['payType']);
	    	 	$v['deliverType'] = WSTLangDeliverType($v['deliverType']==1);
	    	 	$v['status'] = WSTLangOrderStatus($v['orderStatus']);
				$v['orderCodeTitle'] = WSTOrderCodeTitle($v['orderCode']);
	    	 }
	    }

	    unset($v);
		Loader::import('phpexcel.PHPExcel.IOFactory');
		$objPHPExcel = new \PHPExcel();
		// 设置excel文档的属性
		$objPHPExcel->getProperties()->setCreator("heyuanhui")//创建人
		->setLastModifiedBy("heyuanhui")//最后修改人
		->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(25);
		$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(25);
		$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(35);
		$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(15);
		$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(15);
		$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(15);
		$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(15);
		$objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(12);
		$objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(8);
		$objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(8);
		$objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(8);
		$objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(12);
		$objPHPExcel->getActiveSheet()->getStyle('A1:T1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
		$objPHPExcel->getActiveSheet()->getStyle('A1:T1')->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', '退款状态')
								->setCellValue('K1', '退款备注');
		$objPHPExcel->getActiveSheet()->getStyle('A1:R1')->applyFromArray($styleArray);
		$reRefundInfo=['0'=>'未退款','1'=>'已退款'];
		for ($row = 0; $row < count($page); $row++){
			if($page[$row]['payFrom'] =='ect'){
				$page[$row]['payFrom'] = 'ECT';
			}else if($page[$row]['payFrom'] =='wallets'){
				$page[$row]['payFrom'] = '余额';
			}else if($page[$row]['payFrom'] =='app_alipays' || $page[$row]['payFrom'] =='alipays'){
				$page[$row]['payFrom'] = '支付宝';
			}else if($page[$row]['payFrom'] =='weixinpays'){
				$page[$row]['payFrom'] = '微信';
			}else if($page[$row]['payFrom'] =='cod'){
				$page[$row]['payFrom'] = '货到付款';
			}
			$i = $row+2;
			$objPHPExcel->getActiveSheet()
			 					->setCellValue('A'.$i, $page[$row]['orderNo'])
			 					->setCellValue('B'.$i, $page[$row]['loginName'])
			 					->setCellValue('C'.$i, $page[$row]['shopName'])
			 					->setCellValue('D'.$i, $page[$row]['orderCodeTitle'])
			 					->setCellValue('E'.$i, $page[$row]['deliverType'])
								->setCellValue('F'.$i, $page[$row]['payFrom'])
								->setCellValue('G'.$i, $page[$row]['realTotalMoney'])
								->setCellValue('H'.$i, $page[$row]['backMoney'])
								->setCellValue('I'.$i, $page[$row]['createTime'])
								->setCellValue('J'.$i, $reRefundInfo[$page[$row]['isRefund']])
								->setCellValue('K'.$i, $page[$row]['refundRemark']);
		}
	
		//输出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');
	}
}