You've already forked qlg.tsgz.moe
							
							
		
			
				
	
	
		
			724 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			724 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?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');
 | |
| 	}
 | |
| }
 |