1147 行
51 KiB
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);
|
|
}
|
|
}
|