文件
mashangyoujiu/Application/CashierApi/Controller/RefundController.class.php

1147 行
51 KiB
PHP
可执行文件

<?php
namespace CashierApi\Controller;
use Common\Business\PayCoupon;
use Common\Business\PaymentRefund;
use Common\Business\Plug;
use Common\Business\Sell;
use Common\Business\SerialNumberGoods;
use Common\Model\RefundOrderModel;
use Common\Model\RetailBillDiscountModel;
use Common\Model\RetailBillOrderModel;
use Common\Model\RetailGoodsGiftsModel;
use Common\Model\RetailPayOrderModel;
use Common\Model\RetailPaySetModel;
use Common\Model\RetailSellModel;
use Pay\Controller\CloudPayController;
use Think\Controller;
//[1.9.20]
/**
* 退款接口
* Class RefundController
* @package CashierApi\Controller
*/
class RefundController extends BaseController
{
/**
* 退款查询订单
*/
public function searchOrder_v1()
{
$order_no = I('post.order_no'); //支付完成返回的order_id
if (empty($order_no)) {
$res['status'] = 0;
$res['msg'] = '缺少参数';
} else {
//根据订单编号,来查询出该订单所有的商品信息
$PayOrderModel = D('RetailPayOrder');
$map = array(
$PayOrderModel::OUT_TRADE_NO . '|' . $PayOrderModel::TRADE_NO => strval($order_no),
$PayOrderModel::ORDER_STATE => 'SUCCESS'
);
$payOrder = $PayOrderModel->getFind($map);
$BillModel = D('RetailBillOrder');
$fields = array(
$BillModel::ID,
$BillModel::ORDER_NO,
$BillModel::AMOUNT_RECEIVED,
$BillModel::FINISH_TIME,
'settlement_type',
);
if (empty($payOrder)) {
$map = array(
$BillModel::ORDER_NO => strval($order_no),
$BillModel::PAY_STATE => 1,
$BillModel::ORDER_TYPE => 1,
$BillModel::TYPE => 2
);
$billOrder = $BillModel->getFind($map, $fields);
} else {
$map = array(
$BillModel::ID => $payOrder[$PayOrderModel::BILL_ID],
$BillModel::PAY_STATE => 1,
$BillModel::TYPE => 2
);
$billOrder = $BillModel->getFind($map, $fields);
}
if (empty($billOrder)) {
$res['status'] = 0;
$res['msg'] = '订单不存在';
$this->ajaxReturn($res);
}
//查询出订单信息
$SellModel = D('RetailSell');
$map = array(
$SellModel::BILL_ID => $billOrder[$BillModel::ID]
);
$fields = array(
$SellModel::ID,
$SellModel::GOODS_TYPE,
$SellModel::PRICING_METHOD,
$SellModel::GOODS_ID,
$SellModel::PRICE,
$SellModel::ORIGINAL_PRICE,
$SellModel::NUM,
$SellModel::ALL_MONEY,
$SellModel::GOODS_NAME,
$SellModel::REFUND_NUM,
$SellModel::GOODS_IMG_ID,
$SellModel::ATTRIBUTE_STATE,
$SellModel::SKU_JSON_INFO,
$SellModel::INTEGRAL_DIS_MONEY, //积分抵扣的金额
"supplier_json",
"purchase_id_str",
"company",
"goods_gifts_id",
"goods_gifts_type",
'serial_number_state',
);
$sellOrder = $SellModel->getSelect($map, $fields);
$temp = array();
$count = 0;
$SerialClass = new SerialNumberGoods();
foreach ($sellOrder as $key => &$value) {
$value['goods_img'] = $this->getGoodsImage($value[$SellModel::GOODS_IMG_ID], '');
if ($value[$SellModel::GOODS_TYPE] == 2) {
$value[$SellModel::GOODS_NAME] = $value[$SellModel::GOODS_NAME] ? $value[$SellModel::GOODS_NAME] : '无码商品';
}
$value['goods_count'] = 0; //退款数量
//退款数量
$surplus = round($value[$SellModel::NUM] - $value['refund_num'], 3);
//退款后剩余有效可退款数量大于0
if ($surplus > 0) {
$value['now_num'] = $surplus;
$value['goods_count'] = $surplus;
$sku = array(
'name' => ''
);
if (!empty($value[$SellModel::SKU_JSON_INFO])) {
$temp1 = json_decode($value[$SellModel::SKU_JSON_INFO], true);
$sku['name'] = $temp1['name'];
}
$value[$SellModel::SKU_JSON_INFO] = $sku;
$value[$SellModel::NUM] = round($value[$SellModel::NUM], 3);
$value[$SellModel::REFUND_NUM] = round($value[$SellModel::REFUND_NUM], 3);
if (floatval($value['refund_num']) > 0) {
$map = array(
$SellModel::SELL_ID => $value[$SellModel::ID],
$SellModel::PAY_STATE => 1, //支付状态为支付
);
$value['refund_money'] = floatval($SellModel->getSum($map, $SellModel::ALL_MONEY)); //获取已退款总金额
} else {
$value['refund_money'] = 0;
}
if ($value['serial_number_state'] == 1) {
$value['refund_serial_list'] = $SerialClass->sellSerialList([
'id' => $value['id'],
'files' => 'id,main_serial_number,auxiliary_serial_number_one,auxiliary_serial_number_two',
'type' => 2
])['data']['list'];
}
unset($value[$SellModel::GOODS_IMG_ID]);
unset($value[$SellModel::GOODS_ID]);
$temp[] = $value;
$count = $count + $surplus;
}
}
if ($count > 0) {
$billOrder['goods_info'] = $temp;
$res['status'] = 1;
$res['msg'] = '查询成功';
unset($billOrder[$BillModel::ID]);
$res['data'] = $billOrder;
} else {
$res['status'] = 0;
$res['msg'] = '该订单已全部退款';
}
}
$this->ajaxReturn($res);
}
/**
* 收银员退款线下
*/
public function orderRefund_v1()
{
$order_no = I('post.order_no'); //订单编号
$goods_info = $_POST['goods_info']; //退款数组 sell表数据
$refund_code = I('post.refund_code'); //收银员退款密码
$user_type = I('post.user_type'); //登录类型 1收银员 2店长登录退款
$username = I('post.username'); //店长账号
if (empty($order_no) || empty($goods_info) || empty($refund_code) || empty($user_type)) {
$result['status'] = 0;
$result['msg'] = '缺少参数1';
$this->ajaxReturn($result);
}
if ($user_type == 2) {
if (empty($username)) {
$result['status'] = 0;
$result['msg'] = '缺少参数';
$this->ajaxReturn($result);
}
} else if ($user_type != 1) {
$result['status'] = 0;
$result['msg'] = '参数有误';
$this->ajaxReturn($result);
}
$tempGoods = json_decode($goods_info, true);
if (!is_array($tempGoods)) {
$result['status'] = 0;
$result['msg'] = '商品信息有误';
$this->ajaxReturn($result);
}
$BillModel = new RetailBillOrderModel();
$map = array(
'order_no' => $order_no,
'pay_state' => 1,
'order_type' => 1
);
$billOrder = $BillModel->getFind($map); // bill订单
if (empty($billOrder)) {
$result['status'] = 0;
$result['msg'] = '未查询到该订单';
$this->ajaxReturn($result);
}
if ($billOrder['type'] != 2) {
$result['status'] = 0;
$result['msg'] = '该接口只支持线下退款';
$this->ajaxReturn($result);
}
if (!in_array($billOrder['settlement_type'], [1, 2])) {
$this->ajaxReturn(['status' => 0, 'msg' => '退单类型有误!']);
}
// 判断是否为购买次卡
$CardOrder = D('RetailCardOrder');
$co_map = array(
$CardOrder::MERCHANT_ID => $billOrder['merchant_id'],
$CardOrder::STORE_ID => $billOrder['store_id'],
$CardOrder::VIP_ID => $billOrder['vid'],
$CardOrder::BILL_ID => $billOrder['id'],
);
$card_order = $CardOrder->getFind($co_map);
if (!empty($card_order)) {
$result['status'] = 0;
$result['msg'] = '该订单为购买次卡活动订单,无法退款';
$this->ajaxReturn($result);
}
// 判断是否送次卡
$vip_card = array();
if (!empty($billOrder['vid'])) {
$judge_refund = A('PayApi/Refund')->judgeRefund($billOrder);
if ($judge_refund['status'] == 0) {
$this->ajaxReturn($judge_refund);
} else {
$vip_card = $judge_refund['vip_card'];
}
}
$refund_time_limit = self::$store['cashier_refund_time'];
$time = time();
if ($billOrder['finish_time'] + $refund_time_limit * 86400 - $time < 0) {
$result['status'] = 0;
$result['msg'] = '该订单已超过退款时间限制范围';
$this->ajaxReturn($result);
}
/**
* 验证退款密码
*/
$res = $this->verifyRefund($user_type, $refund_code, $username);
if ($res['status'] != 1) {
$this->ajaxReturn($res);
}
if ($user_type == 1) {
//收银员退款
$cashier = self::$cashier;
$CashierModel = D('RetailCashier');
if ($cashier[$CashierModel::REFUND_STATE] == 2) {
if ($refund_code != $cashier[$CashierModel::REFUND_CODE]) {
$result['status'] = 0;
$result['msg'] = '退款密码有误';
$this->ajaxReturn($result);
}
} else {
$result['status'] = 0;
$result['msg'] = '对不起,你无权退款';
$this->ajaxReturn($result);
}
} else {
//店长退款
$ManagerModel = D('RetailManager');
$map = array(
$ManagerModel::MOBILE => $username,
$ManagerModel::STATUS => 1,
$ManagerModel::STORE_ID => self::$store_id
);
$manager = $ManagerModel->getFind($map);
if (empty($manager)) {
$result['status'] = 0;
$result['msg'] = '未找到该店长';
$this->ajaxReturn($result);
}
if (!checkPassword($manager[$ManagerModel::PASSWORD], $refund_code, $manager[$ManagerModel::ADD_TIME])) {
$result['status'] = 0;
$result['msg'] = '店长密码错误';
$this->ajaxReturn($result);
}
}
//普通退款
$supplier_type = D("RetailStore")->getFindField(array('id' => $billOrder['store_id']), 'supplier_type');
$SellModel = new RetailSellModel();
$sell_id = array();
foreach ($tempGoods as $v) {
if (empty($v[$SellModel::ID]) || empty($v['goods_count'])) {
$result['status'] = 0;
$result['msg'] = '退款商品参数有误';
$this->ajaxReturn($result);
}
$sell_id[] = intval($v[$SellModel::ID]);
}
$tempGoods = ascSortByFields($tempGoods, 'id'); //退款数据按id排序
$map = [
'id' => ['in', $sell_id],
'bill_id' => $billOrder['id']
];
$sellGoods = $SellModel->getSelect($map, '*', 'id asc'); //按照id升序获取商品
if (count($sellGoods) != count($sell_id)) {
$result['status'] = 0;
$result['msg'] = '退款商品参数有误1';
$this->ajaxReturn($result);
}
$refundData = getRefundList($tempGoods, $billOrder['id']);
if ($refundData['status'] == 0) {
$this->ajaxReturn($refundData);
}
//串号验证
$data = [
'merchant_id' => self::$merchant_id,
'store_id' => self::$store_id,
'type' => 2,
'goods_list' => $refundData['refundSellList']
];
$SellClass = new Sell();
$verifyResult = $SellClass->sellGoodsSerialVerify($data);
if ($verifyResult['status'] != 1) {
$verifyResult['msg'] = $verifyResult['message'];
$this->ajaxReturn($verifyResult);
}
$refundSellList = $refundData['refundSellList']; //存储退款商品sell数据
$allMoney = $refundData['allMoney']; //总退款金额
$new_discount = $refundData['new_discount']; //新优惠表
if (!$allMoney) {
$result['status'] = 0;
$result['msg'] = '商品退款信息错误';
$this->ajaxReturn($result);
}
//验证是否使用代金券指定商品不支持部分退款
//验证指定商品代金券不能部分退款
$PlugClass = new Plug();
$payCouponResult = $PlugClass->PlugPermissions([
'merchant_id' => self::$merchant_id,
'identification_arr' => [
'wxpaycoupon'
]
]);
if ($allMoney != $billOrder['all_money'] && !empty($payCouponResult['data']['plug']['wxpaycoupon'])) {
$PayCouponClass = new PayCoupon();
$verifyResult = $PayCouponClass->payCouponRefundVerify([
'bill_id' => $billOrder['id'],
'refund_all_money' => $allMoney,
'all_money' => $billOrder['all_money']
]);
if ($verifyResult['status'] != 1) {
$verifyResult['msg'] = $verifyResult['message'];
$this->ajaxReturn($verifyResult);
}
}
$history = S('refund_order_no_' . $billOrder['order_no']); //获取缓存
if (!empty($history)) {
$result['status'] = 0;
$result['msg'] = '请勿频繁操作!';
$this->ajaxReturn($result);
}
S('refund_order_no_' . $billOrder['order_no'], $billOrder['order_no'], 2); //写入2秒的缓存,防止用户频繁点击
$SerialClass = new SerialNumberGoods();
//插入bill退款数据
$newBill = $billOrder;
$newBill['add_time'] = time();
$newBill['refund_no'] = $billOrder['order_no'];
$newBill['order_type'] = 2;
$newBill['refund_status'] = 2;
$newBill['cashier_id'] = self::$cashier_id;
$newBill['refund_money'] = $allMoney;
$newBill['all_money'] = $allMoney;
$newBill['pay_state'] = 0;
unset($newBill['id']);
$new_bill = $BillModel->addBillOrder($newBill); //添加新的退款记录
if ($new_bill) {
//添加新的优惠记录
$BillDisModel = new RetailBillDiscountModel();
$new_discount['bill_id'] = $new_bill['id'];
$new_discount = $BillDisModel->addOrder($new_discount);
if (!$new_discount) {
$result['status'] = 0;
$result['msg'] = '数据库发生错误';
S('refund_order_no_' . $billOrder['order_no'], null);
$this->ajaxReturn($result);
}
} else {
$result['status'] = 0;
$result['msg'] = '创建退款订单失败';
S('refund_order_no_' . $billOrder['order_no'], null);
$this->ajaxReturn($result);
}
//添加退款数据
foreach ($refundSellList as &$sVal) {
if ($sVal['serial_number_state'] == 1) {
$serial_list = $sVal['serial_list'];
}
unset($sVal['id']); //删除出售记录id
unset($sVal['serial_list']);
$sVal['sku_id'] = $sVal['sku_id'] ? $sVal['sku_id'] : 0;
$sVal['sell_type'] = 2; //退款
$sVal['pay_state'] = 0; //退款
$sVal['bill_id'] = $new_bill['id']; //插入新的bill_id
$sVal['add_time'] = time(); //插入新的bill_id
$add = $SellModel->addOrder($sVal);
if ($add) {
$sVal['id'] = $add;
if ($sVal['serial_number_state'] == 1) {
$sVal['serial_list'] = $serial_list;
$SerialClass->sellSerialAdd([
'merchant_id' => self::$merchant_id,
'store_id' => self::$store_id,
'sell_list' => [$sVal],
'type' => 2
]);
}
} else {
$result['status'] = 0;
$result['msg'] = '添加商品退款明细失败';
S('refund_order_no_' . $billOrder['order_no'], null);
$this->ajaxReturn($result);
}
}
if ($billOrder['settlement_type'] == 1) {
//获取退款顺序
$RefundOrderModel = new RefundOrderModel();
$refundOrder = $RefundOrderModel->getFindOrderAsc(self::$merchant_id);
$refundRes = array(); //存储所有退款结果
$refundAllMoney = 0;
$PayOrderModel = D('RetailPayOrder');
$pay_type = 8;
$RetailPaySet = new RetailPaySetModel();
$paySet = $RetailPaySet->getFindMerchantPaySet(self::$merchant_id);
foreach ($refundOrder as $key => $value) {
$map = array(
$PayOrderModel::BILL_ID => $billOrder['id'],
$PayOrderModel::ORDER_STATE => 'SUCCESS',
$PayOrderModel::ORDER_TYPE => 1,
);
$payOrderList = array();
switch ($key) {
case 'cash_refund_order':
//现金
$map[$PayOrderModel::PAY_TYPE] = 3;
$pay_type = 1;
$payOrderList = $PayOrderModel->getSelect($map);
break;
case 'vip_refund_order':
//会员余额
$map[$PayOrderModel::PAY_TYPE] = 6;
$pay_type = 5;
$payOrderList = $PayOrderModel->getSelect($map);
break;
case 'other_refund_order':
//其他支付
$map[$PayOrderModel::PAY_TYPE] = 5;
$pay_type = 7;
$payOrderList = $PayOrderModel->getSelect($map);
break;
case 'al_refund_order':
//支付宝
$map[$PayOrderModel::PAY_TYPE] = 2;
$pay_type = 4;
$payOrderList = $PayOrderModel->getSelect($map);
break;
case 'wx_refund_order':
//微信
$map[$PayOrderModel::PAY_TYPE] = 1;
$pay_type = 3;
$payOrderList = $PayOrderModel->getSelect($map);
break;
case 'mec_refund_order':
//德育币
$map[$PayOrderModel::PAY_TYPE] = 8;
$pay_type = 9;
$payOrderList = $PayOrderModel->getSelect($map);
break;
}
if (!empty($payOrderList)) {
foreach ($payOrderList as $val) {
if ($val['pay_type'] == 1 && $val['pay_coupon_fee'] > 0) {
//微信支付
$val[$PayOrderModel::TRADE_AMOUNT] = bcadd($val[$PayOrderModel::TRADE_AMOUNT], $val['pay_coupon_fee'], 2);
$val[$PayOrderModel::REFUND_MONEY] = bcadd($val[$PayOrderModel::REFUND_MONEY], $val['refund_coupon_fee'], 2);
}
$tempMoney = bcsub($val[$PayOrderModel::TRADE_AMOUNT], $val[$PayOrderModel::REFUND_MONEY], 2);
if ($tempMoney && bcadd($refundAllMoney, $tempMoney, 2) > $allMoney) {
$tempMoney = bcsub($allMoney, $refundAllMoney, 2);
}
$tempMoney = floatval($tempMoney);//钱数转换类型
if (!empty($tempMoney)) {
$val[$PayOrderModel::BILL_ID] = $new_bill['id'];
$val['cashier_id'] = self::$cashier_id;
$refundRes[] = $this->refundMoney($billOrder, $val, $tempMoney, $paySet['config']); //去退款
}
$refundAllMoney = bcadd($refundAllMoney, $tempMoney, 2);
}
}
if (bcsub($allMoney, $refundAllMoney, 2) <= 0) {
break;
}
}
if (empty($refundRes)) {
S('refund_order_no_' . $billOrder['order_no'], null);
$this->ajaxReturn(['status' => 0, 'msg' => '退款失败']);
}
$status = 0;
$msg = '';
$success = '退款失败';
$is_fail = empty($refundRes) ? true : false; //判断是否有失败的退款
$is_success = false; //判断是否有成功的退款
$is_error = false; //判断是否有数据库更新失败的退款
$pay_coupon_fee = 0; //代金券总金额
foreach ($refundRes as $v) {
if ($v['pay_coupon_fee'] > 0 && !empty($v['pay_coupon_fee'])) {
$pay_coupon_fee += $v['pay_coupon_fee'];
}
if ($v['status'] === 0) {
//退款失败
$is_fail = true;
$msg .= ',' . $v['msg'];
} else if ($v['status'] == 1) {
$status = 1;
$success = '退款成功';
$is_success = true;
} else {
//数据库更新失败
$is_error = true;
$msg .= ',' . $v['msg'];
}
}
if ($is_fail && ($is_success && !$is_error || count($refundRes) == 1)) {
//有部分退款失败或数据库更新失败
$result = array(
'status' => $status,
'msg' => $success . $msg
);
$save = array(
'refund_status' => -1
);
$BillModel->updateOrder(['id' => $new_bill['id']], $save); //存储为退款失败订单
} else {
//全部退款成功
if (count($refundRes) != 1) {
$pay_type = 8;
}
$item = array(
'sell' => $refundSellList,
'old_bill' => $billOrder,
'new_bill' => $new_bill,
'pay_type' => $pay_type,
'supplier_type' => $supplier_type,
'pay_coupon_fee' => $pay_coupon_fee
);
// 退次卡
A('PayApi/Refund')->stillSubCard($vip_card);
$result = $this->refundGoods_v1($item);
if ($is_error) {
$result['msg'] .= ',' . $msg;
}
}
$result['refundRes'] = $refundRes;
} else {
//赊账订单
$CreditRefund = new \Credit\Business\CreditRefund();
$refundCreateRes = $CreditRefund->refundCreate([
'refund_order' => $new_bill,
'old_bill_id' => $billOrder['id'],
]);
if ($refundCreateRes['status'] != 1) {
S('refund_order_no_' . $billOrder['order_no'], null);
$this->ajaxReturn($refundCreateRes);
}
$item = [
'sell' => $refundSellList,
'old_bill' => $billOrder,
'new_bill' => $new_bill,
'pay_type' => $refundCreateRes['pay_type'],
'supplier_type' => $supplier_type
];
$result = $this->refundGoods_v1($item);
}
S('refund_order_no_' . $billOrder['order_no'], null);
$this->ajaxReturn($result);
}
/**
* 验证可否退款
* @param $user_type
* @param $refund_code
* @param $username
* @return mixed
*/
public function verifyRefund($user_type, $refund_code, $username)
{
if ($user_type == 1) {
//收银员退款
$cashier = self::$cashier;
$CashierModel = D('RetailCashier');
if ($cashier[$CashierModel::REFUND_STATE] == 2) {
if ($refund_code != $cashier[$CashierModel::REFUND_CODE]) {
$result['status'] = 0;
$result['msg'] = '退款密码有误';
return $result;
}
} else {
$result['status'] = 0;
$result['msg'] = '对不起,你无权退款';
return $result;
}
} else {
//店长退款
$ManagerModel = D('RetailManager');
$map = array(
$ManagerModel::MOBILE => $username,
$ManagerModel::STATUS => 1,
$ManagerModel::STORE_ID => self::$store_id
);
$manager = $ManagerModel->getFind($map);
if (empty($manager)) {
$result['status'] = 0;
$result['msg'] = '未找到该店长';
return $result;
}
if (!checkPassword($manager[$ManagerModel::PASSWORD], $refund_code, $manager[$ManagerModel::ADD_TIME])) {
$result['status'] = 0;
$result['msg'] = '店长密码错误';
return $result;
}
}
$result['status'] = 1;
$result['msg'] = '可以退款';
return $result;
}
/**
* 退钱
* @param $billOrder 原bill的id
* @param $payOrder 新pay_order
* @param $money 退款金额
* @param $config 支付配置
* @return mixed
*/
protected function refundMoney($billOrder, $payOrder, $money, $config)
{
$PayOrderModel = new RetailPayOrderModel();
$item = array(
$PayOrderModel::PAY_ORDER_ID => $payOrder[$PayOrderModel::ID], //'退款原订单id',
$PayOrderModel::SCENE_TYPE => 2, //'1付款 2退款',
$PayOrderModel::ORDER_TYPE => 1, //'1购买商品',
$PayOrderModel::PAY_TYPE => $payOrder[$PayOrderModel::PAY_TYPE], //'1微信 2支付宝 3现金 4小程序微信 5其他支付方式 6会员余额',
$PayOrderModel::TRADE_AMOUNT => $money, //'订单金额',
$PayOrderModel::STORE_ID => $payOrder[$PayOrderModel::STORE_ID], //'门店id',
$PayOrderModel::MERCHANT_ID => $payOrder[$PayOrderModel::MERCHANT_ID], //'商户id',
$PayOrderModel::CASHIER_ID => $payOrder[$PayOrderModel::CASHIER_ID], //'收银员id',
$PayOrderModel::VID => $payOrder[$PayOrderModel::VID], //'会员id',
$PayOrderModel::TRADE_NO => $payOrder[$PayOrderModel::TRADE_NO], //'订单微信支付宝流水号',
$PayOrderModel::ADD_TIME => time(), //'订单创建时间',
$PayOrderModel::M_PAY_TYPE => $payOrder[$PayOrderModel::M_PAY_TYPE], //'订单支付类型 1普通商户模式 2服务商模式 3新大陆模式',
$PayOrderModel::BILL_ID => $payOrder[$PayOrderModel::BILL_ID], //'bill表id',
$PayOrderModel::OTHER_PAY_ID => $payOrder[$PayOrderModel::OTHER_PAY_ID], //'其他支付id',
'pay_coupon_fee' => $payOrder['pay_coupon_fee'], //代金券总优惠金额,
);
$new_pay_order = $PayOrderModel->addPayOrder($item);
if ($new_pay_order) {
switch ($item[$PayOrderModel::PAY_TYPE]) {
case '1':
case '2':
//微信
//支付宝
$new_pay_order['before_amount'] = $payOrder[$PayOrderModel::TRADE_AMOUNT];
$new_pay_order['before_trade_no'] = $payOrder[$PayOrderModel::OUT_TRADE_NO];
if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 4) {
//云闪付
$payObj = new CloudPayController();
$res = $payObj->cloudRefund($new_pay_order, $config, $new_pay_order[$PayOrderModel::PAY_TYPE]);
} else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 3) {
//新大陆
$res = A('Pay/PayContinent')->toOrderRefund_v3($new_pay_order);
} else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 5) {
//乐返
$happyPay = new \HappyPay\Business\HappyPay();
$res = $happyPay->happyMoneyHandle($new_pay_order, $config);
if ($res['status'] == 1) {
A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 4);//乐返分润
}
} else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 6) {
//拉卡拉
$happyPay = new \LaKaLaPay\Business\LaKaLaMis();
$res = $happyPay->LaKaLaMoneyHandle($new_pay_order, $config);
if ($res['status'] == 1) {
A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 5);//拉卡拉分润
}
} else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 7) {
//钱客云
$moneyGuest = new \MoneyGuestPay\Business\MoneyGuest();
$res = $moneyGuest->moneyGuestRefund($new_pay_order, $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[$PayOrderModel::PAY_TYPE] == 1) {
//微信
$res = A('Pay/NewWxPay')->toWxRefund_v2($new_pay_order, $config);
} else {
//支付宝
$res = A('Pay/NewAliPay')->toAliRefund_v2($new_pay_order, $config);
}
break;
case '3':
case '5':
//现金
//其他支付
$res = array(
'status' => 1
);
break;
case '6':
//会员余额
$res = A('PayApi/VipPay')->refundForVip_v1($item, 1, 5);
break;
case '8':
//德育币
$MoralEducationCoinPay = new \MoralEducationCoin\Business\Pay();
$res = $MoralEducationCoinPay->refund([
'store_third_code' => self::$store['third_code'],
'amount' => $item['trade_amount'],
'third_vip_code' => $billOrder['third_vip_code'],
]);
break;
default:
$res = array(
'status' => 0,
'msg' => '数据库发生错误'
);
}
if ($res['status'] == 1) {
$BillModel = new RetailBillOrderModel();
//支付流水修改
$save = array(
$PayOrderModel::ORDER_STATE => 'REFUND',
$PayOrderModel::EXTEND_CONTENT => $res['response'] ? json_encode($res['response']) : '',
$PayOrderModel::TRADE_DATE => time(),
);
//微信支付判断是否使用代金券
if ($res['response']['coupon_refund_count'] > 0 && $item[$PayOrderModel::PAY_TYPE] == 1) {
//使用了代金券修改代金券状态且记录退款的代金券信息
$PaymentRefundClass = new PaymentRefund();
$couponResult = $PaymentRefundClass->paymentRefund(json_encode([
'merchant_id' => $item['merchant_id'],
'type' => 2,
'refund_info' => $res['response'],
'old_pay_order_id' => $item[$PayOrderModel::PAY_ORDER_ID]
]));
if ($couponResult['status'] == 1) {
$couponData = $couponResult['data'];
//减去代金券的金额
$BillModel->toSetDec([
'id' => $item['bill_id']
], 'all_money', $couponData['pay_coupon_fee']);
$BillModel->toSetDec([
'id' => $item['bill_id']
], 'refund_money', $couponData['pay_coupon_fee']);
$DisCountModel = new RetailBillDiscountModel();
$DisCountModel->updateOrder([
'bill_id' => $item['bill_id']
], [
'pay_coupon_id_str' => $couponData['pay_coupon_id_str'],
'pay_coupon_fee' => $couponData['pay_coupon_fee']
]);
$PayOrderModel->toSetInc(array($PayOrderModel::ID => $item[$PayOrderModel::PAY_ORDER_ID]), 'refund_coupon_fee', $couponData['pay_coupon_fee']); //增加原退款代金券金额
$save['pay_coupon_id_str'] = $couponData['pay_coupon_id_str'];//代金券id ,字符串拼接
$save['refund_coupon_fee'] = $couponData['pay_coupon_fee']; //代金券优惠总金额
$save['trade_amount'] = $couponData['cash_fee']; //微信退款的现金金额
$money = round($money - $couponData['pay_coupon_fee'], 2);
$result['pay_coupon_fee'] = $couponData['pay_coupon_fee'];
}
}
$PayOrderModel->updateOrder(array($PayOrderModel::ID => $new_pay_order[$PayOrderModel::ID]), $save); //更新新的pay_order数据
$PayOrderModel->toSetInc(array($PayOrderModel::ID => $item[$PayOrderModel::PAY_ORDER_ID]), $PayOrderModel::REFUND_MONEY, $money); //增加原pay_order的退款金额
$BillModel->toSetInc(array($BillModel::ID => $billOrder['id']), $BillModel::REFUND_MONEY, $money); //增加bill_order表的退款金额
$result['status'] = 1;
$result['msg'] = '退款成功';
} else {
$result['res'] = $res;
$result['status'] = 0;
$result['msg'] = $res['msg'];
}
} else {
$result['status'] = 0;
$result['msg'] = '退款订单创建失败';
}
return $result;
}
/**
* 退款提交
* @param $item
* @return mixed
*/
protected function refundGoods_v1($item)
{
$BillModel = D('RetailBillOrder');
$refundSellGoods = $item['sell'];
$money = $item['new_bill'][$BillModel::ALL_MONEY];
$new_bill = $item['new_bill']; //新bill
$old_bill = $item['old_bill']; //旧bill
$supplier_type = $item['supplier_type'] ? $item['supplier_type'] : 1;
$time = time();
$all_integral = 0; //总退还积分
$all_get_integral = 0; //总扣除积分
$SellModel = D('RetailSell');
$royaltyMoney = 0;
$plus_vip_less_money = 0;
foreach ($refundSellGoods as $key => &$value) {
$sku_id = ''; //规格id
$map = array(
$SellModel::ID => $value[$SellModel::SELL_ID]
);
$SellModel->toSetInc($map, $SellModel::REFUND_NUM, $value[$SellModel::NUM]); //修改旧sell退款数量
$SellModel->toSetInc($map, $SellModel::REFUND_MONEY, $value[$SellModel::ALL_MONEY]); //修改旧sell退款数量
//退款更新PLUS优惠金额
if ($value['plus_vip_price'] > 0 && $value['original_price'] > 0) {
$plus_vip_less_money = bcadd($plus_vip_less_money, $value['vip_less_money'], 2);
}
$all_integral += $value[$SellModel::USE_INTEGRAL]; //退还积分累加
$all_get_integral += $value[$SellModel::GET_INTEGRAL]; //扣除积分累加
$num = $value[$SellModel::NUM];
if ($value[$SellModel::ATTRIBUTE_STATE] == 2) {
//规格商品
if (!empty($value[$SellModel::SKU_JSON_INFO])) {
$sku = json_decode($value[$SellModel::SKU_JSON_INFO], true);
$sku_id = $sku['id'];
$num = round($value[$SellModel::NUM], 3);
}
}
$save = array(
$SellModel::SELL_NUMBER => $num,
$SellModel::PAY_STATE => 1
);
$map = array($SellModel::ID => $value[$SellModel::ID]);
$SellModel->updateOrder($map, $save); //更新退款记录的状态
// 添加库存记录并且加库存
if ($supplier_type == 2 && !empty($value['supplier_json']) && !empty($value['purchase_id_str'])) {
//寄售供货商
$supplier_arr = array(
'supplier_type' => 2,
'supplier_json' => $value['supplier_json'],
'purchase_id_str' => $value['purchase_id_str']
);
} else {
$supplier_arr = array();
}
$refund_arr = [
'goods_id' => $value[$SellModel::GOODS_ID],
'sku_id' => $sku_id,
'num' => $num,
'refund_money' => $value[$SellModel::ALL_MONEY],
'price' => $value[$SellModel::PRICE],
'supplier_arr' => $supplier_arr,
'goods_gifts_id' => $value['goods_gifts_id'],
'serial_list' => $value['serial_list']
];
$this->refundGoodsQuantityLogs_v1($refund_arr); //添加入库记录
$royaltyMoney += $value[$SellModel::GUIDE_ROYALTY];
}
//退款更新PLUS优惠金额
if ($plus_vip_less_money > 0) {
$RetailPlusVip = D('RetailPlusVip');
$RetailPlusVip->toSetDec(['vip_id' => $old_bill['vid']], 'total_less_money', $plus_vip_less_money);
}
//修改导购员总金额
if (!empty($old_bill[$BillModel::GUIDE_ID])) {
$GuideIncomeModel = D('RetailGuideIncome');
$guideIncome = $GuideIncomeModel->getFind(array($GuideIncomeModel::BILL_ID => $old_bill[$BillModel::ID]));
if (!empty($guideIncome)) {
if ($guideIncome['income'] > $royaltyMoney) {
$GuideIncomeModel->toSetDec(array('id' => $guideIncome['id']), "income", $royaltyMoney);
} else {
$GuideIncomeModel->updateOrder(array('id' => $guideIncome['id']), array('income' => 0));
}
}
}
//会员积分
if (!empty($old_bill[$BillModel::VID])) {
//推送退款信息
A("Vip/Mark")->refundsuccess($old_bill[$BillModel::VID], $old_bill[$BillModel::ORDER_NO], $money, $time, self::$store_id);
//扣除消费获得的积分
$VipModel = D('RetailVip');
$IntegralOrderModel = D('RetailIntegralOrder');
$vipMap = array(
$VipModel::ID => $old_bill[$BillModel::VID]
);
if ($all_get_integral > 0) {
$VipModel->toSetDec($vipMap, $VipModel::INTEGRAL, $all_get_integral); //扣除积分
$VipModel->toSetDec($vipMap, $VipModel::GRADE_INTEGRAL, $all_get_integral); //扣除等级积分
$map = array(
$IntegralOrderModel::VID => $old_bill[$BillModel::VID],
$IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID],
$IntegralOrderModel::TYPE => 2, //消费获取
);
$integralItem[$IntegralOrderModel::VID] = $old_bill[$BillModel::VID];
$integralItem[$IntegralOrderModel::TYPE] = 5;
$integralItem[$IntegralOrderModel::INTEGRAL] = $all_get_integral;
$integralItem[$IntegralOrderModel::REMARK] = '会员退款扣除' . $all_get_integral . '积分';
$integralItem[$IntegralOrderModel::STORE_ID] = self::$store_id;
$integralItem[$IntegralOrderModel::BILL_ID] = $new_bill[$BillModel::ID];
$integralItem[$IntegralOrderModel::ADD_TIME] = $time;
$integralItem[$IntegralOrderModel::REFUND_INTEGRAL] = $all_get_integral;
$IntegralOrderModel->addOrder($integralItem); // 扣除积分 并添加积分记录
$IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $all_get_integral); //原记录的退还积分增加
}
//返回抵现扣除的积分
if ($all_integral > 0) {
$map = array(
$IntegralOrderModel::VID => $old_bill[$BillModel::VID],
$IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID],
$IntegralOrderModel::TYPE => 8, //积分抵现
);
$VipModel->toSetInc($vipMap, $VipModel::INTEGRAL, $all_integral); //添加
$integralItem[$IntegralOrderModel::VID] = $old_bill[$BillModel::VID];
$integralItem[$IntegralOrderModel::TYPE] = 4;
$integralItem[$IntegralOrderModel::INTEGRAL] = $all_integral;
$integralItem[$IntegralOrderModel::REMARK] = '会员退款返回' . $all_integral . '积分';
$integralItem[$IntegralOrderModel::STORE_ID] = self::$store_id;
$integralItem[$IntegralOrderModel::BILL_ID] = $new_bill[$BillModel::ID];
$integralItem[$IntegralOrderModel::ADD_TIME] = $time;
$integralItem[$IntegralOrderModel::REFUND_INTEGRAL] = $all_integral;
$IntegralOrderModel->addOrder($integralItem); // 扣除积分 并添加积分记录
$IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $all_integral); //原记录的退还积分增加
}
}
$newBillSave = array(
$BillModel::PAY_STATE => 1,
$BillModel::PAY_TYPE => $item['pay_type'],
);
$upNewBill = $BillModel->updateOrder(array($BillModel::ID => $new_bill[$BillModel::ID]), $newBillSave);
if (!$upNewBill) {
$result['status'] = 0;
$result['msg'] = '退款订单更新失败';
return $result;
}
$new_bill['pay_coupon_fee'] = $item['pay_coupon_fee']; //代金券金额
$result['data'] = $this->getRefundDetail($new_bill, $refundSellGoods);
$result['status'] = 1;
$result['msg'] = '退款原单更新成功,新单据添加成功';
return $result;
}
/* 获取退款打印参数 */
protected function getRefundDetail($bill, $sellOrder)
{
$BillModel = D('RetailBillOrder');
$res['refund_list'] = getPayTypeList($bill[$BillModel::PAY_TYPE], $bill[$BillModel::ALL_MONEY], $bill[$BillModel::ID]);
/* 商品 */
$refundArr = [];
foreach ($sellOrder as $key => $val) {
$refundArr[] = [
'code_price_state' => $val['code_price_state'],
'price' => $val['price'],
'num' => round($val['num'], 3),
'goods_name' => $val['goods_name'] . ($val['attribute_state'] == 2 && $val['sku_json_info'] ? ('(' . json_decode($val['sku_json_info'], true)['name'] . ')') : ''),
'pricing_method' => $val['pricing_method'],
'all_money' => $val['all_money'],
'before_all_money' => $val['code_price_state'] == 1 ? round($val['all_money'] + $val['vip_dis_money'] + $val['cashier_manual_discount_money'] + $val['cashier_dis_money'] + $val['coupon_money'] + $val['small_changes_money'] + ($val['integral_marketing'] == 1 ? $val['integral_dis_money'] : 0), 2) : round($val['price'] * $val['num'], 2),
];
//扫码价: 总价+会员折扣优惠的金额+收银员单品打折的金额+收银员整单折扣的金额+优惠券优惠的金额+抹零的金额+积分抵扣的金额
//非扫码价:身份价格*数量
}
$res['goods_info'] = $refundArr;
$StoreModel = D('RetailStore');
$CashierModel = D('RetailCashier');
$res['store_name'] = self::$store[$StoreModel::STORE_NAME];
$res['refund_time'] = date('Y/m/d H:i:s', $bill[$BillModel::ADD_TIME]);
$res['order_no'] = $bill[$BillModel::ORDER_NO];
$res['all_money'] = round($bill[$BillModel::ALL_MONEY] - ($bill['pay_coupon_fee'] ? $bill['pay_coupon_fee'] : 0), 2);
$res['job_num'] = self::$cashier[$CashierModel::JOB_NUM];
$res['pay_coupon_fee'] = $bill['pay_coupon_fee'] ? floatval($bill['pay_coupon_fee']) : 0;
if ($bill[$BillModel::VID]) {
$VipModel = D('RetailVip');
$fields = array(
$VipModel::BALANCE, //余额
$VipModel::INTEGRAL, //积分
);
$vip_data = $VipModel->getFind(array($VipModel::ID => $bill[$BillModel::VID]), $fields);
$res['vip_data'] = $vip_data;
}
$res['end_time'] = time();
return $res;
}
/**
* 退款入库
* @param $param
* [
* goods_id
* sku_id
* num 数量
* refund_money 退货总价
* price 退货价
* supplier_arr 寄售供货商商品详情
* goods_gifts_id 赠品
* ]
* @return mixed
*/
public function refundGoodsQuantityLogs_v1($param)
{
$goods_id = $param['goods_id'];
$sku_id = $param['sku_id'];
$num = $param['num'];
$refund_money = $param['refund_money'];
$price = $param['price'];
$supplier_arr = $param['supplier_arr'] ? $param['supplier_arr'] : [];
$goods_gifts_id = $param['goods_gifts_id'] ? $param['goods_gifts_id'] : null;
$serial_list = $param['serial_list'] ? $param['serial_list'] : [];
if (!empty($goods_gifts_id)) {
//赠品
$price = 0;
$refund_money = 0;
$type = 19;
$GoodsGiftModel = new RetailGoodsGiftsModel();
$GoodsGiftModel->toSetInc(['id' => $goods_gifts_id], 'remain_inventory', $num);
// 以下写法是错误的 做赠品活动的时候再修改
// $gifts = new \GoodsGifts\Model\GoodsGiftsModel();
// $gifts->refundGoodsGifts($goods_gifts_id, $num);
} else {
//普通商品
A('Api/Inventory')->Inventory(1, $num, $goods_id, $sku_id);
$type = 11;
}
$data = [
'goods_id' => $goods_id,
'sku_id' => $sku_id,
'num' => $num,
'price' => $price,
'type' => $type,
'all_money' => $refund_money,
'supplier_arr' => $supplier_arr,
'serial_list' => $serial_list
];
$result = A('Api/Inventory')->goodsNumRise($data);
return $result;
}
/**
* 线上订单退款
*/
public function onlineOrderRefund_v1()
{
$order_no = I('post.order_no'); // 订单编号
$user_type = I('post.user_type'); // 1.收银员退款 2.店长登录
$refund_code = I('post.refund_code'); // 密码
$username = I('post.username'); // 店长账号
$return_delivery_fee = I('post.return_delivery_fee') == 1 ? 1 : 2; //是否退还配送费 1是 2否
if (empty($order_no) || empty($return_delivery_fee) || empty($refund_code) || empty($user_type) || ($user_type == 2 && empty($username))) {
$result['status'] = 0;
$result['msg'] = '缺少参数';
$this->ajaxReturn($result);
}
$data = array(
'store_id' => self::$store_id,
'merchant_id' => self::$merchant_id,
'cashier_id' => self::$cashier_id,
'cashier' => self::$cashier,
'order_no' => $order_no,
'user_type' => $user_type,
'username' => $username,
'refund_code' => $refund_code,
'return_delivery_fee' => $return_delivery_fee,
);
// 退款
$res = A('PayApi/Refund')->onlineOrderRefund($data);
$this->ajaxReturn($res);
}
/**
* 线上订单退款2020-3-9
* @param order_no订单号
* @param user_type 1.收银员退款 2.店长登录 3后台
* @param refund_code 密码
* @param username 店长账号
* @param return_delivery_fee 是否退还配送费 1是 2否
*/
public function onlineOrderRefund_v2()
{
$order_no = I('post.order_no');
$user_type = I('post.user_type');
$refund_code = I('post.refund_code');
$username = I('post.username');
$return_delivery_fee = I('post.return_delivery_fee') == 1 ? 1 : 2;
if (empty($order_no) || empty($return_delivery_fee) || empty($refund_code) || empty($user_type) || ($user_type == 2 && empty($username))) {
$result['status'] = 0;
$result['msg'] = '缺少参数';
$this->ajaxReturn($result);
}
$data = array(
'store_id' => self::$store_id,
'merchant_id' => self::$merchant_id,
'cashier_id' => self::$cashier_id,
'cashier' => self::$cashier,
'order_no' => $order_no,
'user_type' => $user_type,
'username' => $username,
'refund_code' => $refund_code,
'return_delivery_fee' => $return_delivery_fee,
'platform_type' => self::$merchant['platform_type']
);
// 退款
if (C('IS_SET_REDIS')) {
$ApiRedis = new \Addons\Api\RedisController();
$redis_key = "customer_" . $data['order_no'];
if ($ApiRedis::$redis->exists($redis_key)) {
$res['status'] = 0;
$res['msg'] = "正在操作该订单,请勿重复操作";
$this->ajaxReturn($res);
}
$ApiRedis::$redis->setex($redis_key, 10, $data['order_no']);
}
$res = A('PayApi/Refund')->onlineOrderRefund_v2($data);
if (C('IS_SET_REDIS')) {
$ApiRedis::$redis->delete($redis_key);
}
$this->ajaxReturn($res);
}
}