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');
|
||
}
|
||
}
|