653 行
34 KiB
PHP
可执行文件
653 行
34 KiB
PHP
可执行文件
<?php
|
||
|
||
namespace Api\Controller;
|
||
|
||
use Common\Business\PayCoupon;
|
||
use Common\Model\InstallAccountModel;
|
||
use Common\Model\RetailRechargeOrderModel;
|
||
use Common\Model\RetailVipRechargeModel;
|
||
use Pay\Controller\CloudPayController;
|
||
use Think\Controller;
|
||
use Think\Page;
|
||
|
||
//[1.9.5]
|
||
|
||
/**
|
||
* 会员充值退款
|
||
* Class RechargeRefundController
|
||
* @package Api\Controller
|
||
*/
|
||
class RechargeRefundController extends Controller
|
||
{
|
||
/**
|
||
* 会员充值列表
|
||
* @param $id retail_vip表id
|
||
* @param $merchant_id 商户id
|
||
* @param $store_id 门店id
|
||
* @param $cashier_id 收银员id
|
||
* @param $type 1:商户 2:门店 3:收银端
|
||
* @param $page
|
||
* @param $limit
|
||
* @return mixed
|
||
*/
|
||
public function rechargeList($id, $merchant_id, $store_id, $cashier_id, $type, $page, $limit)
|
||
{
|
||
$RechargeOrderModel = new RetailRechargeOrderModel();
|
||
$VipModel = D('RetailVip');
|
||
if ($type == 2) {
|
||
$where['store_id'] = $store_id;
|
||
} elseif ($type == 3) {
|
||
$where['user_type'] = 3;
|
||
$where['cashier_id'] = $cashier_id;
|
||
$where['scene_type'] = 1;
|
||
}
|
||
$where['vid'] = $id;
|
||
$where['status'] = 1;
|
||
$where['merchant_id'] = $merchant_id;
|
||
$where['type'] = 1;;
|
||
$where['refund_status'] = 1;
|
||
$where['recharge_order_id'] = 0;
|
||
$list = $RechargeOrderModel->getSelect($where, $field = '*', $order = 'id desc', $page = $page . ',' . $limit);
|
||
$count = $RechargeOrderModel->getCount($where);
|
||
foreach ($list as $k => &$v) {
|
||
$v['index'] = $k + 1;
|
||
$vip_name = $VipModel->getFindField(array($VipModel::ID => $v['vid']), $VipModel::NAME);
|
||
if (empty($vip_name)) {
|
||
$vip_name = $VipModel->getFindField(array($VipModel::ID => $v['vid']), $VipModel::NICK_NAME);
|
||
}
|
||
$v['vip_name'] = $vip_name;
|
||
$v['add_time'] = date('Y-m-d H:i:s', $v['add_time']);
|
||
if ($v['repay_name'] == 0) {
|
||
$v['aging_repay_name'] = '直接到账';
|
||
} elseif ($v['repay_name'] == 1) {
|
||
$v['aging_repay_name'] = '分期到账';
|
||
} else {
|
||
$v['aging_repay_name'] = '未知类型';
|
||
}
|
||
|
||
if ($v['user_type'] == 1) {
|
||
$v['user_type'] = '商家';
|
||
} elseif ($v['user_type'] == 2) {
|
||
$v['user_type'] = '店长';
|
||
} elseif ($v['user_type'] == 3) {
|
||
$v['user_type'] = '收银员';
|
||
} else {
|
||
if ($v['scene_type'] == 5) {
|
||
$v['user_type'] = '公众号';
|
||
} else {
|
||
$v['user_type'] = '小程序';
|
||
}
|
||
}
|
||
if ($v['scene_type'] == 1) {
|
||
$v['scene_type'] = '收银机';
|
||
} elseif ($v['scene_type'] == 2) {
|
||
$v['scene_type'] = '商户后台';
|
||
} elseif ($v['scene_type'] == 3) {
|
||
$v['scene_type'] = '门店后台';
|
||
} elseif ($v['scene_type'] == 4) {
|
||
$v['scene_type'] = '小程序';
|
||
} elseif ($v['scene_type'] == 5) {
|
||
$v['scene_type'] = '公众号';
|
||
} elseif ($v['scene_type'] == 6) {
|
||
$v['scene_type'] = '小助手';
|
||
}
|
||
}
|
||
$res['data'] = $list;
|
||
$res['count'] = $count;
|
||
$res['status'] = 1;
|
||
$res['msg'] = '获取成功';
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 会员充值退款
|
||
* @param $merchant_id 商户id
|
||
* @param $id retail_vip表id
|
||
* @param $scene_Type 1收银机 2商户后台 3门店后台
|
||
* @return mixed
|
||
*/
|
||
public function refundMoney($merchant_id, $id, $scene_Type)
|
||
{
|
||
$RechargeOrderModel = D('RetailRechargeOrder');
|
||
$IntegralOrderModel = D('RetailIntegralOrder');
|
||
$VipMCouponModel = D('RetailVipMCoupon');
|
||
$VipModel = D('RetailVip');
|
||
$MCouponModel = D('RetailMCoupon');
|
||
$VipCardModel = D('RetailVipCard');
|
||
$CardBagModel = D('CardBag');
|
||
$subCardModel = D('SubCard');
|
||
$where = array(
|
||
$RechargeOrderModel::ID => $id,
|
||
$RechargeOrderModel::MERCHANT_ID => $merchant_id,
|
||
$RechargeOrderModel::STATUS => 1,
|
||
$RechargeOrderModel::TYPE => 1,
|
||
$RechargeOrderModel::REFUND_STATUS => 1,
|
||
$RechargeOrderModel::RECHARGE_ORDER_ID => 0,
|
||
);
|
||
$rechargeOrder = $RechargeOrderModel->getFind($where);
|
||
if ($rechargeOrder) {
|
||
if ($rechargeOrder[$RechargeOrderModel::VIP_RECHARGE_ID] > 0) { //判断是否从常规会员变成plus会员
|
||
$RVRModel = D('RetailVipRecharge');
|
||
$vipRecharge = $RVRModel->getFind(array($RVRModel::ID => $rechargeOrder[$RechargeOrderModel::VIP_RECHARGE_ID]));
|
||
if ($vipRecharge[$RVRModel::SCENE_TYPE] == 2) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '该充值为升级Plus活动,不能退款';
|
||
return $res;
|
||
} else if ($vipRecharge[$RVRModel::SCENE_TYPE] == 3) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '该充值为续费Plus活动,不能退款';
|
||
return $res;
|
||
}
|
||
}
|
||
//减少retail_vip表balance值
|
||
$VMap[$VipModel::ID] = $rechargeOrder[$RechargeOrderModel::VID];
|
||
$vip = $VipModel->getFind($VMap);
|
||
if (empty($vip)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '数据出错';
|
||
return $res;
|
||
}
|
||
//判断retail_vip表balance
|
||
if ($vip[$VipModel::BALANCE] < $rechargeOrder[$RechargeOrderModel::ALL_MONEY]) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '会员余额不足,退款失败';
|
||
return $res;
|
||
}
|
||
//积分
|
||
$integralDetail = $IntegralOrderModel->getFind(array($IntegralOrderModel::RECHARGE_ORDER_ID => $id));
|
||
if (!empty($integralDetail) && ($vip[$VipModel::INTEGRAL] < $integralDetail[$IntegralOrderModel::INTEGRAL])) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '积分已被使用,不能退款';
|
||
return $res;
|
||
}
|
||
//优惠券券包
|
||
$map = array(
|
||
$VipMCouponModel::RECHARGE_ORDER_ID => $id,
|
||
);
|
||
$couponList = $VipMCouponModel->getSelect($map);
|
||
if (!empty($couponList)) {
|
||
foreach ($couponList as $v) {
|
||
if ($v[$VipMCouponModel::IS_USE] == 2) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '优惠券已被使用,不能退款';
|
||
return $res;
|
||
}
|
||
}
|
||
}
|
||
//次卡
|
||
$subCardList = $VipCardModel->getFind(array($VipCardModel::TYPE => 1, $VipCardModel::RECHARGE_ORDER_ID => $id));
|
||
if (!empty($subCardList)) {
|
||
if ($subCardList[$VipCardModel::USE_NUM] > 0) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '次卡已被使用,不能退款';
|
||
return $res;
|
||
}
|
||
}
|
||
//卡包
|
||
$bagCardList = $VipCardModel->getSelect(array($VipCardModel::TYPE => 2, $VipCardModel::RECHARGE_ORDER_ID => $id));
|
||
if (!empty($bagCardList)) {
|
||
foreach ($bagCardList as $v) {
|
||
if ($v[$VipCardModel::USE_NUM] > 0) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '卡包已被使用,不能退款';
|
||
return $res;
|
||
}
|
||
}
|
||
}
|
||
//添加pay_order数据
|
||
$RPOModel = D('RetailPayOrder');
|
||
$PMap[$RPOModel::ID] = $rechargeOrder[$RechargeOrderModel::PAY_ORDER_ID];
|
||
$paySuccess = $RPOModel->getFind($PMap);
|
||
//加上代金券金额
|
||
$paySuccess[$RPOModel::TRADE_AMOUNT] = $paySuccess['pay_coupon_fee'] >0?round($paySuccess[$RPOModel::TRADE_AMOUNT] + $paySuccess['pay_coupon_fee'],2):$paySuccess[$RPOModel::TRADE_AMOUNT];
|
||
$item = array(
|
||
$RPOModel::PAY_ORDER_ID => $paySuccess[$RPOModel::ID], //'退款原订单id',
|
||
$RPOModel::ORDER_TYPE => 2, //'1购买商品 2会员充值',
|
||
$RPOModel::SCENE_TYPE => 2, //'1付款 3退款,
|
||
$RPOModel::PAY_TYPE => $paySuccess[$RPOModel::PAY_TYPE], //'1微信 2支付宝 3现金 4小程序微信 5其他支付方式 6会员余额',
|
||
$RPOModel::TRADE_AMOUNT => $paySuccess[$RPOModel::TRADE_AMOUNT], //'订单金额',
|
||
$RPOModel::STORE_ID => $paySuccess[$RPOModel::STORE_ID], //'门店id',
|
||
$RPOModel::MERCHANT_ID => $paySuccess[$RPOModel::MERCHANT_ID], //'商户id',
|
||
$RPOModel::CASHIER_ID => $paySuccess[$RPOModel::CASHIER_ID], //'收银员id',
|
||
$RPOModel::VID => $paySuccess[$RPOModel::VID], //'会员id',
|
||
$RPOModel::TRADE_NO => $paySuccess[$RPOModel::TRADE_NO], //'订单微信支付宝流水号',
|
||
$RPOModel::ADD_TIME => time(), //'订单创建时间',
|
||
$RPOModel::M_PAY_TYPE => $paySuccess[$RPOModel::M_PAY_TYPE], //'订单支付类型 1普通商户模式 2服务商模式 3新大陆模式',
|
||
$RPOModel::BILL_ID => $paySuccess[$RPOModel::BILL_ID], //'bill表id',
|
||
$RPOModel::OTHER_PAY_ID => $paySuccess[$RPOModel::OTHER_PAY_ID], //'其他支付id',
|
||
);
|
||
$new_pay_order = $RPOModel->addPayOrder($item);
|
||
//分期到账状态修改
|
||
$InstallAccountModel = new InstallAccountModel();
|
||
$InstallAccountModel->updateOrder(['order_id' => $rechargeOrder['id']], ['state' => 1]);
|
||
|
||
$PaySetModel = D('RetailPaySet');
|
||
$paySet = $PaySetModel->getFindMerchantPaySet($merchant_id); //支付设置
|
||
if ($new_pay_order) {
|
||
$new_pay_order['before_amount'] = $paySuccess[$RPOModel::TRADE_AMOUNT];
|
||
$new_pay_order['before_trade_no'] = $paySuccess[$RPOModel::OUT_TRADE_NO];
|
||
|
||
if ($item[$RPOModel::PAY_TYPE] == 1 || $item[$RPOModel::PAY_TYPE] == 2) { //'1微信 2支付宝
|
||
if ($new_pay_order[$RPOModel::M_PAY_TYPE] == 3) {
|
||
//新大陆
|
||
$res = A('Pay/PayContinent')->toOrderRefund_v3($new_pay_order);
|
||
} else if ($new_pay_order[$RPOModel::M_PAY_TYPE] == 4) {
|
||
//云闪付
|
||
$payObj = new CloudPayController();
|
||
$res = $payObj->cloudRefund($new_pay_order, $paySet['config'], $item[$RPOModel::PAY_TYPE]);
|
||
} else if ($new_pay_order[$RPOModel::M_PAY_TYPE] == 7) {
|
||
//钱客云
|
||
$moneyGuest = new \MoneyGuestPay\Business\MoneyGuest();
|
||
$res = $moneyGuest->moneyGuestRefund($new_pay_order, $paySet['config']);
|
||
if($res['status'] == 1){
|
||
//退钱分润
|
||
A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 6);//钱客云分润
|
||
}
|
||
} else if ($new_pay_order[$RPOModel::PAY_TYPE] == 1) {
|
||
//微信
|
||
$res = A('Pay/NewWxPay')->toWxRefund_v2($new_pay_order, $paySet['config']);
|
||
} else {
|
||
//支付宝
|
||
$res = A('Pay/NewAliPay')->toAliRefund_v2($new_pay_order, $paySet['config']);
|
||
}
|
||
if ($res['status'] != 1) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '退款失败';
|
||
return $res;
|
||
} else {
|
||
$pMap = array($RPOModel::ID => $new_pay_order[$RPOModel::ID]);
|
||
$save = array(
|
||
$RPOModel::ORDER_STATE => 'REFUND',
|
||
$RPOModel::TRADE_DATE => time()
|
||
);
|
||
$RPOModel->updateOrder($pMap, $save);
|
||
}
|
||
} else if ($item[$RPOModel::PAY_TYPE] == 4) {
|
||
//小程序
|
||
if ($new_pay_order[$RPOModel::M_PAY_TYPE] == 3) {
|
||
$res = A('Pay/PayContinent')->toOrderRefund_v3($new_pay_order);
|
||
if ($res['status'] == 1) {
|
||
$pMap = array($RPOModel::ID => $new_pay_order[$RPOModel::ID]);
|
||
$save = array(
|
||
$RPOModel::ORDER_STATE => 'REFUND',
|
||
$RPOModel::TRADE_DATE => time()
|
||
);
|
||
$RPOModel->updateOrder($pMap, $save);
|
||
} else {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '退款失败';
|
||
return $res;
|
||
}
|
||
} else if ($new_pay_order[$RPOModel::M_PAY_TYPE] == 4) {
|
||
//云闪付
|
||
$payObj = new CloudPayController();
|
||
$res = $payObj->cloudRefund($new_pay_order, $paySet['config'], 1);
|
||
if ($res['status'] == 1) {
|
||
$pMap = array($RPOModel::ID => $new_pay_order[$RPOModel::ID]);
|
||
$save = array(
|
||
$RPOModel::ORDER_STATE => 'REFUND',
|
||
$RPOModel::TRADE_DATE => time()
|
||
);
|
||
$RPOModel->updateOrder($pMap, $save);
|
||
} else {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '退款失败';
|
||
return $res;
|
||
}
|
||
} else if ($new_pay_order[$RPOModel::M_PAY_TYPE] == 7) {
|
||
//钱客云
|
||
$moneyGuest = new \MoneyGuestPay\Business\MoneyGuest();
|
||
$res = $moneyGuest->moneyGuestRefund($new_pay_order, $paySet['config']);
|
||
if($res['status'] == 1){
|
||
//退钱分润
|
||
A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 6);//钱客云分润
|
||
}
|
||
} else {
|
||
$out_refund_no = $new_pay_order[$RPOModel::OUT_TRADE_NO];
|
||
$payConfig = $paySet['config'];
|
||
if ($paySuccess[$RPOModel::M_PAY_TYPE] == 1 || $paySuccess[$RPOModel::M_PAY_TYPE] == 0) {
|
||
$key = $payConfig[$PaySetModel::XCX_SECRET_KEY];
|
||
$post['appid'] = $payConfig[$PaySetModel::XCX_APPID];
|
||
$post['mch_id'] = $payConfig[$PaySetModel::XCX_MCH_ID];
|
||
$apiclient_cert = $payConfig[$PaySetModel::XCX_AC_CERT];
|
||
$apiclient_key = $payConfig[$PaySetModel::XCX_AC_KEY];
|
||
} else {
|
||
$SystemConfigModel = D('SystemConfig');
|
||
$systemConfig = $payConfig['systemConfig'];
|
||
$post['appid'] = $systemConfig[$SystemConfigModel::WX_APPID];
|
||
$post['mch_id'] = $systemConfig[$SystemConfigModel::MCH_ID];
|
||
$post['sub_mch_id'] = $payConfig[$PaySetModel::XCX_SUB_MCH_ID];
|
||
$post['sub_appid'] = $payConfig[$PaySetModel::XCX_SUB_APPID];
|
||
$key = $systemConfig[$SystemConfigModel::WX_KEY];
|
||
$apiclient_cert = $systemConfig[$SystemConfigModel::WX_AC_CERT];
|
||
$apiclient_key = $systemConfig[$SystemConfigModel::WX_AC_KEY];
|
||
}
|
||
$post['nonce_str'] = createKey();
|
||
$post['out_refund_no'] = $out_refund_no;
|
||
$post['out_trade_no'] = $paySuccess[$RPOModel::OUT_TRADE_NO];
|
||
$post['spbill_create_ip'] = $_SERVER['SERVER_ADDR']; //服务器终端的ip
|
||
$post['total_fee'] = $paySuccess[$RPOModel::TRADE_AMOUNT] * 100; //总金额 最低为一分钱 必须是整数
|
||
$post['refund_fee'] = $paySuccess[$RPOModel::TRADE_AMOUNT] * 100;
|
||
$sign = createSign($post, $key); //生成签名
|
||
$post['sign'] = $sign;
|
||
|
||
$post_xml = arrToXml($post);
|
||
$url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
|
||
$xml = http_cert_request($url, $post_xml, $apiclient_cert, $apiclient_key); //POST方式请求http
|
||
$array = xmlToArray($xml);
|
||
if ($array['return_code'] == "SUCCESS" && $array['result_code'] == "SUCCESS") {
|
||
if ($paySuccess[$RPOModel::M_PAY_TYPE] == 1 || $paySuccess[$RPOModel::M_PAY_TYPE] == 0) {
|
||
$search['appid'] = $payConfig[$PaySetModel::XCX_APPID];
|
||
$search['mch_id'] = $payConfig[$PaySetModel::XCX_MCH_ID];
|
||
} else {
|
||
$search['appid'] = $systemConfig[$SystemConfigModel::WX_APPID];
|
||
$search['mch_id'] = $systemConfig[$SystemConfigModel::MCH_ID];
|
||
$search['sub_mch_id'] = $payConfig[$PaySetModel::XCX_SUB_MCH_ID];
|
||
$search['sub_appid'] = $payConfig[$PaySetModel::XCX_SUB_APPID];
|
||
}
|
||
$search['nonce_str'] = createKey();
|
||
$search['transaction_id'] = $array['transaction_id'];
|
||
$sign = createSign($search, $key); //签名
|
||
$search['sign'] = $sign;
|
||
$search_xml = arrToXml($search);
|
||
|
||
$url = 'https://api.mch.weixin.qq.com/pay/refundquery';
|
||
$xml = http_request($url, $search_xml, $apiclient_cert, $apiclient_key); //POST方式请求http
|
||
$search_res = xmlToArray($xml);
|
||
if ($search_res['return_code'] == "SUCCESS" && $search_res['result_code'] == "SUCCESS") {
|
||
switch ($search_res['refund_status_0']) {
|
||
case 'SUCCESS':
|
||
case 'PROCESSING':
|
||
$result['status'] = 1;
|
||
$result['refund_no'] = $search_res['refund_id_0'];
|
||
$result['msg'] = '退款成功';
|
||
$pMap = array($RPOModel::ID => $new_pay_order[$RPOModel::ID]);
|
||
$save = array(
|
||
$RPOModel::TRADE_NO => $search_res['refund_id_0'],
|
||
$RPOModel::ORDER_STATE => 'REFUND',
|
||
$RPOModel::TRADE_DATE => time()
|
||
);
|
||
$RPOModel->updateOrder($pMap, $save);
|
||
break;
|
||
case 'REFUNDCLOSE':
|
||
$result['status'] = 0;
|
||
$result['msg'] = '退款关闭';
|
||
break;
|
||
case 'CHANGE':
|
||
$result['status'] = 0;
|
||
$result['msg'] = '退款异常,请到商户品台手动处理';
|
||
default:
|
||
$result['status'] = 0;
|
||
$result['msg'] = '退款失败';
|
||
}
|
||
if ($result['status'] != 1) {
|
||
return $result;
|
||
}
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '退款失败';
|
||
return $result;
|
||
}
|
||
} else {
|
||
$result['return'] = $array;
|
||
$result['status'] = 0;
|
||
$result['msg'] = $array['err_code_des'] ? $array['err_code_des'] : ($array['return_msg'] ? $array['return_msg'] : '退款失败');
|
||
return $result;
|
||
}
|
||
}
|
||
} else if ($item[$RPOModel::PAY_TYPE] == 3) {
|
||
//现金
|
||
$pMap = array($RPOModel::ID => $new_pay_order[$RPOModel::ID]);
|
||
$save = array(
|
||
$RPOModel::ORDER_STATE => 'REFUND',
|
||
$RPOModel::TRADE_DATE => time()
|
||
);
|
||
$RPOModel->updateOrder($pMap, $save);
|
||
}
|
||
} else {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '退款订单创建失败';
|
||
return $res;
|
||
}
|
||
//微信代金券状态修改
|
||
if ($res['response']['coupon_refund_count'] > 0 || $search_res['refund_count'] > 0) {
|
||
if (!empty($res['response']['coupon_refund_count'])) {
|
||
$pay_info = $res['response'];
|
||
} else if ($search_res['refund_count'] > 0) {
|
||
$pay_info = $search_res;
|
||
$pay_info['coupon_refund_count'] = $search_res['refund_count'];
|
||
$pay_info['coupon_refund_id_0'] = $search_res['coupon_refund_id_0_0'];
|
||
$pay_info['cash_refund_fee'] = $search_res['cash_fee'];
|
||
}
|
||
$PayCouponClass = new PayCoupon();
|
||
$couponResult = $PayCouponClass->couponVerification_v1(json_encode( [
|
||
'pay_info' => $pay_info,
|
||
'merchant_id' => $item['merchant_id'],
|
||
'coupon_way' => 2
|
||
])); //修改代金券状态
|
||
if ($couponResult['status'] == 1) {
|
||
//记录代金券退款金额
|
||
$RPOModel->updateOrder([
|
||
'id' => $new_pay_order['id']
|
||
], [
|
||
'pay_coupon_fee' => $paySuccess['pay_coupon_fee'],
|
||
'pay_coupon_id_str' => $couponResult['data']['pay_coupon_id_str'],
|
||
'refund_coupon_fee' => $couponResult['data']['pay_coupon_fee'],
|
||
'trade_amount' => $couponResult['data']['cash_fee'],
|
||
]);
|
||
$RPOModel->toSetInc([
|
||
'id' => $paySuccess['id']
|
||
], 'refund_coupon_fee', $couponResult['data']['pay_coupon_fee']);
|
||
$recharge_data = [
|
||
'pay_coupon_id_str'=>$couponResult['data']['pay_coupon_id_str'],
|
||
'pay_coupon_fee'=>$couponResult['data']['pay_coupon_fee']
|
||
];
|
||
//更新实际付款的金额
|
||
$paySuccess[$RPOModel::TRADE_AMOUNT] = round($paySuccess[$RPOModel::TRADE_AMOUNT] - $couponResult['data']['pay_coupon_fee'],2);
|
||
}
|
||
}
|
||
//退积分
|
||
if (!empty($integralDetail)) {
|
||
$integralReduce = $VipModel->toSetDec($VMap, $VipModel::INTEGRAL, $integralDetail[$IntegralOrderModel::INTEGRAL]); //减少retail_vip积分
|
||
if (empty($integralReduce)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '积分退回失败';
|
||
return $res;
|
||
}
|
||
unset($integralDetail[$IntegralOrderModel::ID]);
|
||
$integralDetail[$IntegralOrderModel::TYPE] = 10;
|
||
$integralDetail[$IntegralOrderModel::ADD_TIME] = time();
|
||
$integralDetail[$IntegralOrderModel::REMARK] = '退款' . $integralDetail[$IntegralOrderModel::INTEGRAL] . '积分';
|
||
$integralAdd = $IntegralOrderModel->addOrder($integralDetail); //添加integral_order记录
|
||
if (empty($integralAdd)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '积分退回失败';
|
||
return $res;
|
||
}
|
||
}
|
||
//退优惠券 券包
|
||
if (!empty($couponList)) {
|
||
$map[$VipMCouponModel::MCOUPON_GROUP_ID] = array('exp', 'is null');
|
||
$couponIds = $VipMCouponModel->getFindField($map, $VipMCouponModel::MCOUPON_ID, true); //发放的所有优惠券id
|
||
$map[$VipMCouponModel::MCOUPON_GROUP_ID] = array('gt', 0);
|
||
$couponGroupId = $VipMCouponModel->getFindField($map, $VipMCouponModel::MCOUPON_GROUP_ID); //发放的所有券包id
|
||
if ($couponIds || $couponGroupId) {
|
||
$couponUpdate = $VipMCouponModel->deleteOrder(array($VipMCouponModel::RECHARGE_ORDER_ID => $id)); //删除优惠券
|
||
if (empty($couponUpdate)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '优惠券退回失败';
|
||
return $res;
|
||
}
|
||
if ($couponIds) {
|
||
$couponInc = $MCouponModel->toSetInc(array($MCouponModel::ID => array('in', $couponIds)), $MCouponModel::COUPON_NUM, 1); //增加剩余数量
|
||
if (empty($couponInc)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '优惠券退回失败';
|
||
return $res;
|
||
}
|
||
}
|
||
if ($couponGroupId) {
|
||
$RMCGModel = D('RetailMCouponGroup');
|
||
$couponGroupInc = $RMCGModel->toSetInc(array($RMCGModel::ID => $couponGroupId), $RMCGModel::COUPON_GROUP_NUM, 1); //增加剩余数量
|
||
if (empty($couponGroupInc)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '优惠券退回失败';
|
||
return $res;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//退次卡
|
||
if (!empty($subCardList)) {
|
||
$subDel = $VipCardModel->deleteOrder(array($VipCardModel::ID => $subCardList[$VipCardModel::ID])); //删除次卡
|
||
if (!$subDel) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '次卡退回失败';
|
||
return $res;
|
||
}
|
||
$subAddNum = $subCardModel->toSetInc(array($subCardModel::ID => $subCardList[$VipCardModel::SUB_CARD_ID]), $subCardModel::SUR_PLUS, 1); //次卡加库存
|
||
if (!$subAddNum) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '次卡退回失败';
|
||
return $res;
|
||
}
|
||
}
|
||
//退卡包
|
||
if (!empty($bagCardList)) {
|
||
$bagDel = $VipCardModel->deleteOrder(array($VipCardModel::TYPE => 2, $VipCardModel::RECHARGE_ORDER_ID => $id)); //该卡包下面的次卡删除
|
||
if (empty($bagDel)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '卡包退回失败';
|
||
return $res;
|
||
}
|
||
$bagAdd = $CardBagModel->toSetInc(array($CardBagModel::ID => $bagCardList[0][$VipCardModel::CARD_BAG_ID]), $CardBagModel::SUR_PLUS, 1);
|
||
if (empty($bagAdd)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '卡包退回失败';
|
||
return $res;
|
||
}
|
||
}
|
||
//减少会员余额
|
||
$balance = $VipModel->toSetDec($VMap, $VipModel::BALANCE, $rechargeOrder['all_money']);
|
||
if (empty($balance)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '金额退回失败';
|
||
return $res;
|
||
}
|
||
//修改refund_status为2
|
||
$recharge_data['refund_status'] = 2;
|
||
$updateStatus = $RechargeOrderModel->updateOrder($where, $recharge_data);
|
||
if (empty($updateStatus)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '退款失败';
|
||
return $res;
|
||
}
|
||
//添加recharge_order表退款记录
|
||
$addRechargeOrder = $rechargeOrder;
|
||
unset($addRechargeOrder[$RechargeOrderModel::ID]);
|
||
switch ($scene_Type) {
|
||
case 1:
|
||
$addRechargeOrder[$RechargeOrderModel::USER_TYPE] = 3;
|
||
break;
|
||
case 2:
|
||
$addRechargeOrder[$RechargeOrderModel::USER_TYPE] = 1;
|
||
break;
|
||
case 3:
|
||
$addRechargeOrder[$RechargeOrderModel::USER_TYPE] = 2;
|
||
break;
|
||
}
|
||
$addRechargeOrder['pay_order_id'] = $new_pay_order['id'];
|
||
$addRechargeOrder[$RechargeOrderModel::SCENE_TYPE] = $scene_Type;
|
||
$addRechargeOrder[$RechargeOrderModel::TYPE] = 9;
|
||
$addRechargeOrder[$RechargeOrderModel::ADD_TIME] = time();
|
||
$addRechargeOrder[$RechargeOrderModel::REMARK] = '充值退款' . $rechargeOrder['all_money'] . '元';
|
||
$addRechargeOrder[$RechargeOrderModel::RECHARGE_ORDER_ID] = $rechargeOrder[$RechargeOrderModel::ID];
|
||
$addRecharge = $RechargeOrderModel->addOrder($addRechargeOrder);
|
||
if (empty($addRecharge)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '退款失败';
|
||
return $res;
|
||
}
|
||
//修改pay_order表refund_money
|
||
if ($paySuccess[$RPOModel::TRADE_AMOUNT] != 0) {
|
||
$update = $RPOModel->updateOrder($PMap, array($RPOModel::REFUND_MONEY => $paySuccess[$RPOModel::TRADE_AMOUNT]));
|
||
if (empty($update)) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '退款失败';
|
||
return $res;
|
||
}
|
||
}
|
||
$printArr = $this->printData($paySuccess);
|
||
A('PayApi/Printer')->balanceRefundPrint($printArr);
|
||
$res['status'] = 1;
|
||
$res['msg'] = '退款成功';
|
||
$res['data'] = $printArr;
|
||
} else {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '数据出错';
|
||
}
|
||
return $res;
|
||
}
|
||
|
||
/*
|
||
* 充值退款打印数据
|
||
*/
|
||
public function printData($paySuccess)
|
||
{
|
||
$VipModel = D('RetailVip');
|
||
$merchant_id = $paySuccess['merchant_id'];
|
||
$vip_info = $VipModel->getFind(array('id' => $paySuccess['vid']));
|
||
$vip_number = $vip_info['mobile_phone'] ? $vip_info['mobile_phone'] : $vip_info['cardnum'];
|
||
$vip_number = substr($vip_number, 0, 3) . '****' . substr($vip_number, -3);
|
||
if ($vip_info['plus_type'] == 2) {
|
||
$grade_name = 'PLUS';
|
||
} else {
|
||
$VipIntegralModel = D('RetailVipIntegral');
|
||
$where = array(
|
||
$VipIntegralModel::MERCHANT_ID => $merchant_id,
|
||
$VipIntegralModel::DISCOUNT => array('gt', 0),
|
||
$VipIntegralModel::MIN_INTEGRAL => array('ELT', $vip_info[$VipModel::GRADE_INTEGRAL])
|
||
);
|
||
$grade = $VipIntegralModel->getOrderFind($where, '*', $VipIntegralModel::MIN_INTEGRAL . ' desc');
|
||
if (empty($grade)) {
|
||
$grade_name = '普通会员';
|
||
} else {
|
||
$grade_name = $grade[$VipIntegralModel::CARD_NAME];
|
||
}
|
||
}
|
||
switch ($paySuccess['pay_type']) {
|
||
case 1:
|
||
$pay_name = '微信';
|
||
break;
|
||
case 2:
|
||
$pay_name = '支付宝 ';
|
||
break;
|
||
case 3:
|
||
$pay_name = '现金';
|
||
break;
|
||
case 4:
|
||
$pay_name = '小程序微信 ';
|
||
break;
|
||
case 5:
|
||
$pay_name = '其他支付方式 ';
|
||
break;
|
||
}
|
||
$StoreModel = D('RetailStore');
|
||
$store_name = $StoreModel->getFindField(array($StoreModel::ID => $paySuccess['store_id']), $StoreModel::STORE_NAME); //门店名称
|
||
$printArr = array(
|
||
'store_id' => $paySuccess['store_id'], //门店id
|
||
'store_name' => $store_name, //门店名称
|
||
'order_number' => $paySuccess['out_trade_no'], //退款订单
|
||
'trade_amount' => round($paySuccess['trade_amount'], 2), //退款金额
|
||
'pay_name' => $pay_name, //退款方式
|
||
'grade_name' => $grade_name, //等级
|
||
'vip_number' => $vip_number, //会员号
|
||
'balance' => round($vip_info['balance'], 2), //余额
|
||
'time' => date('Y-m-d H:i:s', time()), //退款时间
|
||
'name' => $vip_info['name'] ? $vip_info['name'] : ($vip_info['nickname'] ? $vip_info['nickname'] : '未设置'), //会员名称
|
||
'integral' => $vip_info['integral'] ? $vip_info['integral'] : 0
|
||
);
|
||
return $printArr;
|
||
}
|
||
}
|