906 行
43 KiB
PHP
可执行文件
906 行
43 KiB
PHP
可执行文件
<?php
|
|
|
|
namespace PayApi\Controller;
|
|
|
|
use Common\Business\PayCoupon;
|
|
use Common\Business\PaymentRefund;
|
|
use Common\Model\RetailBillDiscountModel;
|
|
use LittleGift\Business\Order;
|
|
use Think\Controller;
|
|
use Think\Hook;
|
|
|
|
//[1.8.95]
|
|
|
|
/**
|
|
* 线上退款接口
|
|
* @package PayApi\Controller
|
|
*/
|
|
class RefundController extends Controller
|
|
{
|
|
/**
|
|
* 查询订单是否能够退款
|
|
* @param array $bill_order
|
|
* @return array
|
|
*/
|
|
public function judgeRefund($bill_order)
|
|
{
|
|
// 是否赠送次卡
|
|
$VipCard = D('VipCard');
|
|
$BillOrder = D('RetailBillOrder');
|
|
// 查询
|
|
$map = array(
|
|
'vip_id' => $bill_order[$BillOrder::VID],
|
|
'merchantid' => $bill_order[$BillOrder::MERCHANT_ID],
|
|
'bill_id' => $bill_order[$BillOrder::ID],
|
|
);
|
|
$vip_card = $VipCard->toSelect($map);
|
|
if (empty($vip_card)) {
|
|
$res = array(
|
|
'status' => 1,
|
|
'msg' => '暂无可退还次卡'
|
|
);
|
|
return $res;
|
|
}
|
|
$num = 0; //使用次数
|
|
foreach ($vip_card as $value) {
|
|
if ($value['use_num']) {
|
|
$num += round($value['use_num']);
|
|
}
|
|
}
|
|
if ($num > 0) {
|
|
$res = array(
|
|
'status' => 0,
|
|
'msg' => '消费赠送的次卡已经使用,无法退款'
|
|
);
|
|
} else {
|
|
// 未使用
|
|
$res = array(
|
|
'status' => 1,
|
|
'vip_card' => $vip_card
|
|
);
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 退还次卡 卡包
|
|
* @param array $vip_card
|
|
* @return array
|
|
*/
|
|
public function stillSubCard($vip_card)
|
|
{
|
|
$VipCard = D('VipCard');
|
|
foreach ($vip_card as $key => &$val) {
|
|
// 删除用户次卡
|
|
$vip_card_del = $VipCard->deleteOrder(array('id' => $val['id'])); //删除次卡
|
|
if (empty($vip_card_del)) {
|
|
$res = array(
|
|
'status' => 0,
|
|
'msg' => '用户次卡退回失败'
|
|
);
|
|
return $res;
|
|
}
|
|
// 判断
|
|
if ($val['type'] == 1) {
|
|
// 增加次卡库存
|
|
$SubCard = D('SubCard');
|
|
$sub_map = array(
|
|
$SubCard::ID => $val['sub_card_id'],
|
|
$SubCard::MERCHANT_ID => $val['merchantid'],
|
|
);
|
|
$SubCard->toSetInc($sub_map, $SubCard::SUR_PLUS, 1);
|
|
} else {
|
|
// 增加卡包库存
|
|
$CardBag = D('CardBag');
|
|
$bag_map = array(
|
|
$CardBag::ID => $val['card_bag_id'],
|
|
$CardBag::MERCHANT_ID => $val['merchantid'],
|
|
);
|
|
$CardBag->toSetInc($bag_map, $CardBag::SUR_PLUS, 1);
|
|
}
|
|
}
|
|
$res = array(
|
|
'status' => 1,
|
|
'msg' => '退还成功'
|
|
);
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 线上订单退款2020/3/4
|
|
*/
|
|
public function onlineOrderRefund($data)
|
|
{
|
|
$store_id = $data['store_id']; // 门店id
|
|
$merchant_id = $data['merchant_id']; // 商户id
|
|
$cashier_id = $data['cashier_id'] ? $data['cashier_id'] : 0; // 收银员id
|
|
$cashier = $data['cashier'] ? $data['cashier'] : array(); // 收银员信息
|
|
$order_no = $data['order_no']; // 订单编号
|
|
$user_type = $data['user_type']; // 1.收银员 2.店长 3.后台
|
|
$username = $data['username'] ? $data['username'] : ''; // 店长账号
|
|
$refund_code = $data['refund_code'] ? $data['refund_code'] : ''; // 收银员权限码,或店长密码
|
|
$return_delivery_fee = $data['return_delivery_fee'] == 1 ? 1 : 2; // 是否退还配送费 1是 2否
|
|
// 查询退款原订单
|
|
$BillModel = D('RetailBillOrder');
|
|
$bMap = array(
|
|
$BillModel::ORDER_NO => strval($order_no),
|
|
$BillModel::STORE_ID => $store_id,
|
|
$BillModel::MERCHANT_ID => $merchant_id,
|
|
$BillModel::ORDER_TYPE => 2, // 退款订单
|
|
$BillModel::REFUND_STATUS => 1, // 状态 1.申请退款
|
|
$BillModel::TYPE => 1, // 订单类型 1.商城订单
|
|
);
|
|
$billOrder = $BillModel->getFind($bMap);
|
|
// 判断订单
|
|
if (empty($billOrder)) {
|
|
$result = array('status' => 0, 'msg' => '未查询到该订单');
|
|
return $result;
|
|
}
|
|
// 获取缓存
|
|
$history = S('refund_order_no_' . $order_no);
|
|
if (!empty($history)) {
|
|
$result = array('status' => 0, 'msg' => '请勿频繁操作!');
|
|
return $result;
|
|
}
|
|
// 写入2秒的缓存,防止用户频繁点击
|
|
S('refund_order_no_' . $order_no, $billOrder[$BillModel::ORDER_NO], 2);
|
|
// 判断是否可以退款
|
|
$res = $this->verifyRefund($user_type, $cashier, $username, $refund_code, $store_id);
|
|
if ($res['status'] == 0) {
|
|
return $res;
|
|
}
|
|
// 查询退款订单
|
|
$obMap = array(
|
|
$BillModel::ORDER_NO => strval($billOrder[$BillModel::REFUND_NO])
|
|
);
|
|
$old_bill = $BillModel->getFind($obMap);
|
|
// 判断是否送次卡
|
|
$vip_card = array();
|
|
if (!empty($old_bill[$BillModel::VID])) {
|
|
$judge_refund = $this->judgeRefund($old_bill);
|
|
if ($judge_refund['status'] == 0) {
|
|
$this->ajaxReturn($judge_refund);
|
|
} else {
|
|
$vip_card = $judge_refund['vip_card'];
|
|
}
|
|
}
|
|
$OnlineModel = D('RetailBillOnline');
|
|
$delivery_fee = 0;
|
|
if ($return_delivery_fee == 1) {
|
|
// 退还配送费
|
|
$onlineOrder = $OnlineModel->getFind(array($OnlineModel::BILL_ID => $old_bill[$BillModel::ID]));
|
|
if ($onlineOrder[$OnlineModel::PICKUP_TYPE] == 1) {
|
|
$result = array('status' => 0, 'msg' => '自提订单没有配送费,请检查参数');
|
|
return $result;
|
|
}
|
|
$delivery_fee = $onlineOrder[$OnlineModel::DELIVERY_FEE];//配送费
|
|
if ($onlineOrder[$OnlineModel::STATUS] == 3) {
|
|
// 已收货 查找是否已退还配送费
|
|
$orbMap = array(
|
|
$BillModel::REFUND_NO => strval($old_bill[$BillModel::ORDER_NO]),
|
|
$BillModel::REFUND_STATUS => 3,
|
|
$BillModel::PAY_STATE => 1,
|
|
);
|
|
$refund_bill_id = $BillModel->getFindField($orbMap, $BillModel::ID, true);
|
|
if (!empty($refund_bill_id)) {
|
|
//有退款记录 查询退还配送费
|
|
$old_delivery_fee = $OnlineModel->getSum(array($OnlineModel::BILL_ID => array('in', $refund_bill_id)), $OnlineModel::DELIVERY_FEE);
|
|
if ($old_delivery_fee > 0) {
|
|
$result = array('status' => 0, 'msg' => '原订单已退还配送费,不可重复退还');
|
|
return $result;
|
|
}
|
|
}
|
|
}
|
|
$billOrder[$BillModel::ALL_MONEY] = round($billOrder[$BillModel::ALL_MONEY] + $delivery_fee, 2);
|
|
}
|
|
$refund = A('PayApi/Pay')->onlineRefund_v1($billOrder, $old_bill, $cashier_id);
|
|
$result['refund'] = $refund;
|
|
if ($refund['status'] == 1) {
|
|
//钱退成功
|
|
$RetailGuideModel = D('RetailGuideIncome');
|
|
$SellModel = D('RetailSell');
|
|
$sMap = array(
|
|
$SellModel::BILL_ID => $billOrder[$BillModel::ID]
|
|
);
|
|
$sellOrder = $SellModel->getSelect($sMap);
|
|
$guideArr = $RetailGuideModel->getFind(array($RetailGuideModel::BILL_ID => $old_bill[$BillModel::ID]));
|
|
if ($guideArr) {
|
|
//退还佣金
|
|
$this->refundCommission($guideArr, $sellOrder);
|
|
}
|
|
$use_integral = 0;
|
|
$get_integral = 0;
|
|
$time = time();
|
|
$GoodsModel = D('RetailGoods');
|
|
$SkuGoodsModel = D('RetailSkuGoods');
|
|
foreach ($sellOrder as $value) {
|
|
$sku_id = '';
|
|
$map = array(
|
|
$SellModel::ID => $value[$SellModel::ID]
|
|
);
|
|
$save = array(
|
|
$SellModel::PAY_STATE => 1,
|
|
$SellModel::PAY_TYPE => $refund['pay_type']
|
|
);
|
|
$SellModel->updateOrder($map, $save);//修改退款记录
|
|
$nMap = array(
|
|
$SellModel::ID => $value[$SellModel::SELL_ID]
|
|
);
|
|
$use_integral += $value[$SellModel::USE_INTEGRAL];//使用积分累加
|
|
$get_integral += $value[$SellModel::GET_INTEGRAL];//获得积分累加
|
|
$num = $value[$SellModel::NUM];
|
|
/*修改原订单*/
|
|
$SellModel->toSetDec($nMap, $SellModel::WAIT_REFUND_NUM, $num);//减少待退款数量
|
|
$SellModel->toSetInc($nMap, $SellModel::REFUND_NUM, $num);//增加已退款数量
|
|
$SellModel->toSetInc($nMap, $SellModel::REFUND_MONEY, $value[$SellModel::ALL_MONEY]);//增加已退款数量
|
|
/*修改库存*/
|
|
if (!empty($value[$SellModel::SKU_JSON_INFO])) {
|
|
//规格商品
|
|
$sku = json_decode($value[$SellModel::SKU_JSON_INFO], true);
|
|
$sku_id = $sku['id'];
|
|
$SkuGoodsModel->toSetInc(array($SkuGoodsModel::ID => $sku[$SkuGoodsModel::ID]), $SkuGoodsModel::GOODS_NUM, $num);
|
|
$num = $num * $sku[$SkuGoodsModel::SKU_NUM];
|
|
}
|
|
$gMap = array(
|
|
$GoodsModel::ID => $value[$SellModel::GOODS_ID],
|
|
);
|
|
$GoodsModel->toSetDec($gMap, $GoodsModel::SELL_NUM, $num);//减少出售数量
|
|
// 添加库存记录并且减库存
|
|
$this->addRefundQuantityLogs($value[$SellModel::GOODS_ID], $sku_id, $num, $value[$SellModel::ALL_MONEY], $value[$SellModel::TYPE], $value[$SellModel::BILL_ID], $value[$SellModel::PRICE]);
|
|
}
|
|
if (!empty($billOrder[$BillModel::VID])) {
|
|
// 退次卡
|
|
$this->stillSubCard($vip_card);
|
|
//推送退款信息
|
|
$VipModel = D('RetailVip');
|
|
$vipMap = array(
|
|
$VipModel::ID => $billOrder[$BillModel::VID],
|
|
);
|
|
A("Vip/Mark")->refundsuccess($billOrder[$BillModel::VID], $billOrder[$BillModel::ORDER_NO], $billOrder[$BillModel::ALL_MONEY], $time, $store_id);
|
|
$IntegralOrderModel = D('RetailIntegralOrder');
|
|
if ($use_integral > 0) {
|
|
// 退还使用积分
|
|
$map = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID],
|
|
$IntegralOrderModel::TYPE => 8,//积分抵现
|
|
);
|
|
$VipModel->toSetInc($vipMap, $VipModel::INTEGRAL, $use_integral); //添加
|
|
$integralItem = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::TYPE => 4,
|
|
$IntegralOrderModel::INTEGRAL => $use_integral,
|
|
$IntegralOrderModel::REMARK => '会员退款返回' . $use_integral . '积分',
|
|
$IntegralOrderModel::STORE_ID => $store_id,
|
|
$IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID],
|
|
$IntegralOrderModel::ADD_TIME => $time,
|
|
$IntegralOrderModel::REFUND_INTEGRAL => $use_integral,
|
|
);
|
|
$IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录
|
|
$IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $use_integral);//原记录的退还积分增加
|
|
}
|
|
if ($get_integral > 0) {
|
|
// 退还获得积分
|
|
$IntegralOrderModel = D('RetailIntegralOrder');
|
|
$map = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID],
|
|
$IntegralOrderModel::TYPE => 2,//积分抵现
|
|
);
|
|
$VipModel->toSetDec($vipMap, $VipModel::INTEGRAL, $get_integral); //退还
|
|
$VipModel->toSetDec($vipMap, $VipModel::GRADE_INTEGRAL, $get_integral); //退还
|
|
$integralItem = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::TYPE => 5,
|
|
$IntegralOrderModel::INTEGRAL => $get_integral,
|
|
$IntegralOrderModel::REMARK => '会员退款扣除' . $get_integral . '积分',
|
|
$IntegralOrderModel::STORE_ID => $store_id,
|
|
$IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID],
|
|
$IntegralOrderModel::ADD_TIME => $time,
|
|
$IntegralOrderModel::REFUND_INTEGRAL => $get_integral,
|
|
);
|
|
$IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录
|
|
$IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $get_integral);//原记录的退还积分增加
|
|
}
|
|
|
|
}
|
|
// 修改bill_order表
|
|
$BillModel->updateOrder($bMap, array($BillModel::REFUND_STATUS => 2, $BillModel::FINISH_TIME => time(), $BillModel::PAY_TYPE => $refund['pay_type'], $BillModel::ALL_MONEY => $billOrder[$BillModel::ALL_MONEY]));
|
|
// 记录配送费
|
|
if ($delivery_fee && $delivery_fee > 0) {
|
|
$OnlineModel->updateOrder(array($OnlineModel::BILL_ID => $billOrder[$BillModel::ID]), array($OnlineModel::DELIVERY_FEE => $delivery_fee));
|
|
}
|
|
$refund_money = round($billOrder[$BillModel::ALL_MONEY] + $old_bill[$BillModel::REFUND_MONEY], 2);//原订单总退款金额
|
|
if (round($old_bill[$BillModel::ALL_MONEY] - $refund_money, 2) > 0) {
|
|
//部分退款
|
|
$BillModel->updateOrder($obMap, array($BillModel::REFUND_STATUS => 3, $BillModel::REFUND_MONEY => $refund_money));
|
|
} else {
|
|
//全部退款
|
|
$BillModel->updateOrder($obMap, array($BillModel::REFUND_STATUS => 2, $BillModel::REFUND_MONEY => $refund_money));
|
|
}
|
|
// 退款成功
|
|
$result = array('status' => 1, 'msg' => '退款成功');
|
|
} else {
|
|
$result = $refund;
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 线上订单退款2020/3/9
|
|
* @data $store_id
|
|
* @data $merchant_id
|
|
* @data $cashier_id
|
|
* @data platform_type 商户平台类型 1默认系统 2微礼平台
|
|
* @data $cashier // 收银员信息
|
|
* @data $order_no // // 订单编号
|
|
* @data $user_type //1.收银员 2.店长 3.后台
|
|
* @data $username // 店长账号
|
|
* @data $refund_code //退款权限码或店长密码
|
|
* @data $return_delivery_fee // 是否退还配送费 1是 2否
|
|
*/
|
|
public function onlineOrderRefund_v2($data)
|
|
{
|
|
$platform_type = $data['platform_type'];
|
|
$store_id = $data['store_id'];
|
|
$merchant_id = $data['merchant_id'];
|
|
$cashier_id = $data['cashier_id'] ? $data['cashier_id'] : 0;
|
|
$cashier = $data['cashier'] ? $data['cashier'] : array();
|
|
$order_no = $data['order_no'];
|
|
$user_type = $data['user_type'];
|
|
$username = $data['username'] ? $data['username'] : '';
|
|
$refund_code = $data['refund_code'] ? $data['refund_code'] : '';
|
|
$return_delivery_fee = $data['return_delivery_fee'] == 1 ? 1 : 2;
|
|
$BillModel = D('RetailBillOrder');
|
|
$AdvanceOrderModel = D("RetailBillAdvance");
|
|
$bMap = array(
|
|
$BillModel::ORDER_NO => strval($order_no),
|
|
$BillModel::STORE_ID => $store_id,
|
|
$BillModel::MERCHANT_ID => $merchant_id,
|
|
$BillModel::ORDER_TYPE => 2, // 退款订单
|
|
$BillModel::REFUND_STATUS => 5, // 状态 5.待退款
|
|
$BillModel::TYPE => 1, // 订单类型 1.商城订单
|
|
);
|
|
$billOrder = $BillModel->getFind($bMap);
|
|
if (empty($billOrder)) {
|
|
$result = array('status' => 0, 'msg' => '未查询到该订单');
|
|
return $result;
|
|
}
|
|
// 获取缓存
|
|
$history = S('refund_order_no_' . $order_no);
|
|
if (!empty($history)) {
|
|
$result = array('status' => 0, 'msg' => '请勿频繁操作!');
|
|
return $result;
|
|
}
|
|
// 写入2秒的缓存,防止用户频繁点击
|
|
S('refund_order_no_' . $order_no, $billOrder[$BillModel::ORDER_NO], 2);
|
|
// 判断是否可以退款
|
|
$res = $this->verifyRefund($user_type, $cashier, $username, $refund_code, $store_id);
|
|
if ($res['status'] == 0) {
|
|
return $res;
|
|
}
|
|
// 查询原付款订单
|
|
$obMap = array(
|
|
'order_no' => strval($billOrder[$BillModel::REFUND_NO]),
|
|
'type' => 1,
|
|
'order_type' => 1
|
|
);
|
|
$old_bill = $BillModel->getFind($obMap);
|
|
if (empty($old_bill)) {
|
|
$res['status'] = 0;
|
|
$res['msg'] = '原订单状态已改变,请刷新重试';
|
|
$this->ajaxReturn($res);
|
|
}
|
|
$supplier_type = D("RetailStore")->getFindField(array('id' => $store_id), "supplier_type");
|
|
// 判断是否送次卡
|
|
$vip_card = array();
|
|
if (!empty($old_bill[$BillModel::VID])) {
|
|
$judge_refund = $this->judgeRefund($old_bill);
|
|
if ($judge_refund['status'] == 0) {
|
|
$this->ajaxReturn($judge_refund);
|
|
} else {
|
|
$vip_card = $judge_refund['vip_card'];
|
|
}
|
|
}
|
|
$OnlineModel = D('RetailBillOnline');
|
|
$onlineOrder = $OnlineModel->getFind(array($OnlineModel::BILL_ID => $old_bill[$BillModel::ID]));
|
|
$delivery_fee = 0;
|
|
if ($onlineOrder['order_genre'] == 4) {
|
|
//预售订单
|
|
$advance_info = $AdvanceOrderModel->getFind(array("bill_id" => $old_bill['id']));
|
|
}
|
|
if ($return_delivery_fee == 1) {
|
|
// 退还配送费
|
|
if ($onlineOrder[$OnlineModel::PICKUP_TYPE] == 1) {
|
|
$result = array('status' => 0, 'msg' => '自提订单没有配送费,请检查参数');
|
|
return $result;
|
|
}
|
|
$delivery_fee = $onlineOrder[$OnlineModel::DELIVERY_FEE];//配送费
|
|
if ($onlineOrder[$OnlineModel::STATUS] == 3) {
|
|
// 已收货 查找是否已退还配送费
|
|
$orbMap = array(
|
|
$BillModel::REFUND_NO => strval($old_bill[$BillModel::ORDER_NO]),
|
|
$BillModel::REFUND_STATUS => 2,
|
|
$BillModel::PAY_STATE => 1,
|
|
$BillModel::ORDER_TYPE => 2
|
|
);
|
|
$refund_bill_id = $BillModel->getFindField($orbMap, $BillModel::ID, true);
|
|
if (!empty($refund_bill_id)) {
|
|
//有退款记录 查询退还配送费
|
|
$old_delivery_fee = $OnlineModel->getSum(array($OnlineModel::BILL_ID => array('in', $refund_bill_id)), $OnlineModel::DELIVERY_FEE);
|
|
if ($old_delivery_fee > 0) {
|
|
$result = array('status' => 0, 'msg' => '原订单已退还配送费,不可重复退还');
|
|
return $result;
|
|
}
|
|
}
|
|
}
|
|
if ($onlineOrder['order_genre'] == 4 && $advance_info['state'] == 1) {
|
|
//退定金
|
|
$delivery_fee = 0;
|
|
}
|
|
$billOrder[$BillModel::ALL_MONEY] = round($billOrder[$BillModel::ALL_MONEY] + $delivery_fee, 2);
|
|
}
|
|
// file_put_contents('./all.txt', json_encode($billOrder) . PHP_EOL, FILE_APPEND);
|
|
// file_put_contents('./all2.txt', json_encode($old_bill) . PHP_EOL, FILE_APPEND);
|
|
$refund = A('PayApi/Pay')->onlineRefund_v1($billOrder, $old_bill, $cashier_id);
|
|
// file_put_contents('./all3.txt', json_encode($refund) . PHP_EOL, FILE_APPEND);
|
|
$result['refund'] = $refund;
|
|
if ($refund['status'] == 1) {
|
|
if ($platform_type == 2) {
|
|
//第三方平台
|
|
$ThirdOrderClass = new Order();
|
|
$ThirdOrderClass->orderPayment([
|
|
'merchant_id' => $billOrder['merchant_id'],
|
|
'third_order' => $billOrder['third_order'],
|
|
'pay_type' => $billOrder['pay_type']
|
|
]);
|
|
}
|
|
//钱退成功
|
|
$RetailGuideModel = D('RetailGuideIncome');
|
|
$SellModel = D('RetailSell');
|
|
$sMap = array(
|
|
$SellModel::BILL_ID => $billOrder[$BillModel::ID]
|
|
);
|
|
$sellOrder = $SellModel->getSelect($sMap);
|
|
$guideArr = $RetailGuideModel->getFind(array($RetailGuideModel::BILL_ID => $old_bill[$BillModel::ID]));
|
|
if ($guideArr) {
|
|
//退还佣金
|
|
$this->refundCommission($guideArr, $sellOrder);
|
|
}
|
|
$use_integral = 0;
|
|
$get_integral = 0;
|
|
$time = time();
|
|
$GoodsModel = D('RetailGoods');
|
|
$plus_vip_less_money = 0;
|
|
$old_sell_id = [];//目前分销专用
|
|
$new_sell_id = [];//目前分销专用
|
|
foreach ($sellOrder as $value) {
|
|
$sku_id = '';
|
|
$new_sell_id[] = $value[$SellModel::ID];
|
|
$old_sell_id[] = $value[$SellModel::SELL_ID];
|
|
$map = array(
|
|
$SellModel::ID => $value[$SellModel::ID]
|
|
);
|
|
$save = array(
|
|
$SellModel::PAY_STATE => 1,
|
|
$SellModel::PAY_TYPE => $refund['pay_type']
|
|
);
|
|
$SellModel->updateOrder($map, $save);//修改退款记录
|
|
$nMap = array(
|
|
$SellModel::ID => $value[$SellModel::SELL_ID]
|
|
);
|
|
$use_integral += $value[$SellModel::USE_INTEGRAL];//使用积分累加
|
|
$get_integral += $value[$SellModel::GET_INTEGRAL];//获得积分累加
|
|
$num = $value[$SellModel::NUM];
|
|
/*修改原订单*/
|
|
$SellModel->toSetDec($nMap, $SellModel::WAIT_REFUND_NUM, $num);//减少待退款数量
|
|
$SellModel->toSetInc($nMap, $SellModel::REFUND_NUM, $num);//增加已退款数量
|
|
$SellModel->toSetInc($nMap, $SellModel::REFUND_MONEY, $value[$SellModel::ALL_MONEY]);//退款金额增加
|
|
switch ($onlineOrder['order_genre']) {
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
//普通订单拼团订单秒杀订单
|
|
if ($onlineOrder['status'] == 1) {
|
|
//未收到货取消订单退款或者不需要客户发货的退款单
|
|
/*修改库存*/
|
|
if (!empty($value[$SellModel::SKU_JSON_INFO])) {
|
|
//规格商品
|
|
$sku = json_decode($value[$SellModel::SKU_JSON_INFO], true);
|
|
$sku_id = $sku['id'];
|
|
}
|
|
$gMap = array(
|
|
$GoodsModel::ID => $value[$SellModel::GOODS_ID],
|
|
);
|
|
$GoodsModel->toSetDec($gMap, $GoodsModel::SELL_NUM, $num);//减少出售数量
|
|
// 添加库存记录并且加库存
|
|
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();
|
|
}
|
|
$this->addRefundQuantityLogs($value[$SellModel::GOODS_ID], $sku_id, $num, $value[$SellModel::ALL_MONEY], $value[$SellModel::TYPE], $value[$SellModel::BILL_ID], $value[$SellModel::PRICE], $supplier_arr, $value['goods_gifts_id'], $onlineOrder['order_genre']);
|
|
}
|
|
break;
|
|
case 4:
|
|
if ($advance_info['state'] == 2 && $onlineOrder['status'] == 1) {
|
|
//支付成功未发货
|
|
$parameter = array(
|
|
'advance_id' => $advance_info['advance_id'],
|
|
'goods_id' => $advance_info['goods_id'],
|
|
'num' => $num
|
|
);
|
|
D("AdvanceGoods")->StockSetInc($parameter);
|
|
if (!empty($advance_info['sku_id'])) {
|
|
$parameter['sku_id'] = $advance_info['sku_id'];
|
|
D("AdvanceSkuGoods")->StockSetInc($parameter);
|
|
}
|
|
// 添加库存记录并且加库存
|
|
// 添加库存记录并且加库存
|
|
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();
|
|
}
|
|
$sku_id = $advance_info['sku_id'];
|
|
$this->addRefundQuantityLogs($value[$SellModel::GOODS_ID], $sku_id, $num, $value[$SellModel::ALL_MONEY], $value[$SellModel::TYPE], $value[$SellModel::BILL_ID], $value[$SellModel::PRICE], $supplier_arr, $value['goods_gifts_id'], $onlineOrder['order_genre']);
|
|
} else if ($advance_info['state'] == 1 && $advance_info['tail_end_time'] > time()) {
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis = new \Addons\Api\RedisController();
|
|
$advance_id = $advance_info['advance_id'];
|
|
$goods_id = $advance_info['goods_id'];
|
|
$sku_id = $advance_info['sku_id'];
|
|
if ($value['attribute_state'] == 2) {
|
|
$redis_key = 'retail_advance_frozen_goods_' . $advance_id . '_goods_id_' . $goods_id . '_sku_id_' . $sku_id;
|
|
} else {
|
|
$redis_key = 'retail_advance_frozen_goods_' . $advance_id . '_goods_id_' . $goods_id;
|
|
}
|
|
$redis_time = ($advance_info['tail_end_time'] - time()) * 1; //redis 保存时间秒
|
|
$frozen_param = array(
|
|
'id' => $advance_id,
|
|
'goods_id' => $goods_id,
|
|
'sku_id' => $sku_id,
|
|
'attribute_state' => $value['attribute_state']
|
|
);
|
|
$frozen_num = D("AdvanceGoods")->frozen_num($frozen_param);
|
|
if ($frozen_num >= $num) {
|
|
$frozen_num = round($frozen_num - $num, 3);
|
|
$redis_save = array(
|
|
'advance_id' => $advance_info['advance_id'],
|
|
'num' => $frozen_num
|
|
);
|
|
$ApiRedis::$redis->setex($redis_key, $redis_time, json_encode($redis_save));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
//退款更新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);
|
|
}
|
|
}
|
|
//退款更新PLUS优惠金额
|
|
if ($plus_vip_less_money > 0 && $old_bill['vid']) {
|
|
$RetailPlusVip = D('RetailPlusVip');
|
|
$RetailPlusVip->toSetDec(['vip_id' => $old_bill['vid']], 'total_less_money', $plus_vip_less_money);
|
|
}
|
|
if (!empty($billOrder[$BillModel::VID])) {
|
|
// 退次卡
|
|
$this->stillSubCard($vip_card);
|
|
//推送退款信息
|
|
$VipModel = D('RetailVip');
|
|
$vipMap = array(
|
|
$VipModel::ID => $billOrder[$BillModel::VID],
|
|
);
|
|
A("Vip/Mark")->refundsuccess($billOrder[$BillModel::VID], $billOrder[$BillModel::ORDER_NO], $billOrder[$BillModel::ALL_MONEY], $time, $store_id);
|
|
$IntegralOrderModel = D('RetailIntegralOrder');
|
|
if ($use_integral > 0) {
|
|
// 退还使用积分
|
|
$map = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID],
|
|
$IntegralOrderModel::TYPE => 8,//积分抵现
|
|
);
|
|
$VipModel->toSetInc($vipMap, $VipModel::INTEGRAL, $use_integral); //添加
|
|
$integralItem = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::TYPE => 4,
|
|
$IntegralOrderModel::INTEGRAL => $use_integral,
|
|
$IntegralOrderModel::REMARK => '会员退款返回' . $use_integral . '积分',
|
|
$IntegralOrderModel::STORE_ID => $store_id,
|
|
$IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID],
|
|
$IntegralOrderModel::ADD_TIME => $time,
|
|
$IntegralOrderModel::REFUND_INTEGRAL => $use_integral,
|
|
);
|
|
$IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录
|
|
$IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $use_integral);//原记录的退还积分增加
|
|
}
|
|
if ($get_integral > 0) {
|
|
// 退还获得积分
|
|
$IntegralOrderModel = D('RetailIntegralOrder');
|
|
$map = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID],
|
|
$IntegralOrderModel::TYPE => 2,//积分抵现
|
|
);
|
|
$VipModel->toSetDec($vipMap, $VipModel::INTEGRAL, $get_integral); //退还
|
|
$VipModel->toSetDec($vipMap, $VipModel::GRADE_INTEGRAL, $get_integral); //退还
|
|
$integralItem = array(
|
|
$IntegralOrderModel::VID => $billOrder[$BillModel::VID],
|
|
$IntegralOrderModel::TYPE => 5,
|
|
$IntegralOrderModel::INTEGRAL => $get_integral,
|
|
$IntegralOrderModel::REMARK => '会员退款扣除' . $get_integral . '积分',
|
|
$IntegralOrderModel::STORE_ID => $store_id,
|
|
$IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID],
|
|
$IntegralOrderModel::ADD_TIME => $time,
|
|
$IntegralOrderModel::REFUND_INTEGRAL => $get_integral,
|
|
);
|
|
$IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录
|
|
$IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $get_integral);//原记录的退还积分增加
|
|
}
|
|
|
|
}
|
|
|
|
// 分销订单退款金额
|
|
$calculate = [
|
|
'old_bill_id' => $old_bill['id'],
|
|
'new_bill_id' => $billOrder['id'],
|
|
'new_sell_id' => $new_sell_id,
|
|
];
|
|
Hook::listen('refund_commission', $calculate);
|
|
|
|
|
|
// 修改bill_order表
|
|
if (!empty($refund['pay_coupon_info'])) {
|
|
//使用了代金券
|
|
$billOrder[$BillModel::ALL_MONEY] = round($billOrder[$BillModel::ALL_MONEY] - $refund['pay_coupon_info']['refund_coupon_fee'], 2);
|
|
$BillDisModel = new RetailBillDiscountModel();
|
|
$BillDisModel->updateOrder([
|
|
'bill_id' => $billOrder['id']
|
|
], [
|
|
'pay_coupon_id_str' => $refund['pay_coupon_info']['pay_coupon_id_str'],
|
|
'pay_coupon_fee' => $refund['pay_coupon_info']['refund_coupon_fee']
|
|
]);
|
|
}
|
|
$BillModel->updateOrder($bMap, array($BillModel::REFUND_STATUS => 2, $BillModel::FINISH_TIME => time(), $BillModel::PAY_TYPE => $refund['pay_type'], $BillModel::ALL_MONEY => $billOrder[$BillModel::ALL_MONEY], 'refund_money' => $billOrder[$BillModel::ALL_MONEY]));
|
|
// 记录配送费
|
|
$OnlineModel->updateOrder(array($OnlineModel::BILL_ID => $billOrder[$BillModel::ID]), array($OnlineModel::DELIVERY_FEE => $delivery_fee));
|
|
$refund_money = round($billOrder[$BillModel::ALL_MONEY] + $old_bill[$BillModel::REFUND_MONEY], 2);//原订单总退款金额
|
|
$BillModel->updateOrder($obMap, array($BillModel::REFUND_STATUS => 1, $BillModel::REFUND_MONEY => $refund_money));
|
|
|
|
// 退款成功后,取消关联的骑手订单
|
|
$riderOrderModel = M('rider_order');
|
|
$riderOrder = $riderOrderModel->where(array('bill_id' => $old_bill[$BillModel::ID]))->find();
|
|
if ($riderOrder && $riderOrder['order_status'] != 6 && $riderOrder['order_status'] != 8) {
|
|
// 如果骑手订单存在且未送达、未取消,则将其状态改为已取消
|
|
$riderOrderModel->where(array('id' => $riderOrder['id']))->save(array(
|
|
'order_status' => 8, // 已取消
|
|
'cancel_reason' => '售后订单退款',
|
|
'cancel_time' => date('Y-m-d H:i:s'),
|
|
'update_time' => date('Y-m-d H:i:s')
|
|
));
|
|
|
|
// 如果骑手已接单,恢复骑手为在线状态
|
|
if ($riderOrder['rider_id'] > 0 && $riderOrder['order_status'] > 0) {
|
|
$riderInfoModel = M('rider_info');
|
|
$riderInfoModel->where(array('id' => $riderOrder['rider_id']))->save(array('work_status' => 1));
|
|
|
|
// 发送取消通知给骑手(重要:实时通知)
|
|
$this->notifyRiderOrderCancelled($riderOrder['rider_id'], $riderOrder['id'], $order_no);
|
|
}
|
|
}
|
|
|
|
// 退款成功
|
|
$result = array('status' => 1, 'msg' => '退款成功');
|
|
} else {
|
|
$result = $refund;
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 通知骑手订单已取消
|
|
* @param int $riderId 骑手ID
|
|
* @param int $riderOrderId 骑手订单ID
|
|
* @param string $orderNo 订单号
|
|
*/
|
|
private function notifyRiderOrderCancelled($riderId, $riderOrderId, $orderNo) {
|
|
try {
|
|
// 1. 记录系统消息
|
|
$messageModel = M('rider_message');
|
|
if ($messageModel) {
|
|
$messageData = array(
|
|
'rider_id' => $riderId,
|
|
'type' => 'order_cancelled',
|
|
'title' => '订单已取消',
|
|
'content' => "订单 {$orderNo} 因售后退款已被取消,请留意",
|
|
'related_id' => $riderOrderId,
|
|
'status' => 0, // 未读
|
|
'add_time' => date('Y-m-d H:i:s')
|
|
);
|
|
$messageModel->add($messageData);
|
|
}
|
|
|
|
// 2. 如果有推送服务,可以在这里发送推送通知
|
|
// 例如:极光推送、个推等
|
|
// $this->sendPushNotification($riderId, '订单已取消', "订单 {$orderNo} 因售后退款已被取消");
|
|
|
|
} catch (\Exception $e) {
|
|
// 记录日志但不影响退款流程
|
|
\Think\Log::record('通知骑手订单取消失败:' . $e->getMessage(), \Think\Log::WARN);
|
|
}
|
|
}
|
|
|
|
/**导购员佣金退还
|
|
* @param $guideArr 佣金记录
|
|
* @param $sell_list 退款商品
|
|
*/
|
|
public function refundCommission($guideArr, $sell_list)
|
|
{
|
|
$RetailGuideModel = D('RetailGuideIncome');
|
|
$SellModel = D('RetailSell');
|
|
if (empty($guideArr) || empty($sell_list)) {
|
|
return;
|
|
}
|
|
$income = 0; //扣除的佣金
|
|
foreach ($sell_list as $value) {
|
|
$income += $value['guide_royalty'];
|
|
}
|
|
$income = round($income, 2);
|
|
if ($guideArr['income'] > $income) {
|
|
$RetailGuideModel->toSetDec(array('id' => $guideArr['id']), "income", $income);
|
|
} else {
|
|
$RetailGuideModel->updateOrder(array('id' => $guideArr['id']), array('income' => 0));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证可否退款
|
|
* @param $user_type int 操作人员类型 1.收银员 2.店长 3.后台
|
|
* @param $cashier array 收银员信息
|
|
* @param $username int 店长账号
|
|
* @param $refund_code int 收银端输入的退款码,店长密码
|
|
* @param $store_id int 门店id
|
|
* @return mixed
|
|
*/
|
|
public function verifyRefund($user_type, $cashier, $username, $refund_code, $store_id)
|
|
{
|
|
// 判断类型
|
|
switch ($user_type) {
|
|
case 1:
|
|
// 判断收银员信息
|
|
$CashierModel = D('RetailCashier');
|
|
if (empty($cashier)) {
|
|
$res = array('status' => 0, 'msg' => '未知收银员,请重新登录');
|
|
}
|
|
// 判断退款权限
|
|
if ($cashier[$CashierModel::REFUND_STATE] != 2) {
|
|
$res = array('status' => 0, 'msg' => '对不起,你无权退款');
|
|
}
|
|
// 判断权限码
|
|
if ($cashier[$CashierModel::REFUND_CODE] != $refund_code) {
|
|
$res = array('status' => 0, 'msg' => '退款密码错误');
|
|
}
|
|
break;
|
|
case 2:
|
|
// 判断店长登陆
|
|
$ManagerModel = D('RetailManager');
|
|
// 查询店长信息
|
|
$map = array(
|
|
$ManagerModel::MOBILE => $username,
|
|
$ManagerModel::STATUS => 1,
|
|
$ManagerModel::STORE_ID => $store_id
|
|
);
|
|
$manager = $ManagerModel->getFind($map);
|
|
if (empty($manager)) {
|
|
$res = array('status' => 0, 'msg' => '店长账号异常,请联系商户');
|
|
}
|
|
// 判断密码
|
|
if (!checkPassword($manager[$ManagerModel::PASSWORD], $refund_code, $manager[$ManagerModel::ADD_TIME])) {
|
|
$res = array('status' => 0, 'msg' => '店长密码错误');
|
|
}
|
|
break;
|
|
case 3:
|
|
// 后台退款
|
|
$res = array('status' => 1, 'msg' => '可以退款');
|
|
break;
|
|
default:
|
|
// 未知操作人员
|
|
$res = array('status' => 0, 'msg' => '未知操作人员,请重新登录');
|
|
}
|
|
if (!empty($res) && $res['status'] == 0) {
|
|
return $res;
|
|
}
|
|
$res = array('status' => 1, 'msg' => '可以退款');
|
|
return $res;
|
|
}
|
|
|
|
/*
|
|
* @param $goods_id 商品id
|
|
* @param $sku_id 规格id
|
|
* @param $num 退货数量
|
|
* @param $all_money 退款金额
|
|
* @param $type 1 商城 2店内
|
|
* @param $bill_id 订单id
|
|
* @param $supplier_arr 寄售供货商
|
|
* @param $goods_gifts_id 赠品
|
|
* @$order_genre 1.普通订单 2.拼团订单 3.秒杀订单 4预售订单
|
|
*/
|
|
protected function addRefundQuantityLogs($goods_id, $sku_id, $num, $all_money, $type, $bill_id, $price, $supplier_arr, $goods_gifts_id = 0, $order_genre = 1)
|
|
{
|
|
$where = array();
|
|
if (!empty($sku_id)) {
|
|
$where['sku_id'] = $sku_id;
|
|
}
|
|
$where['goods_id'] = $goods_id;
|
|
if (!empty($goods_gifts_id)) {
|
|
$gifts = new \GoodsGifts\Model\GoodsGiftsModel();
|
|
$gifts->refundGoodsGifts($goods_gifts_id, $num);
|
|
} else if (empty($goods_gifts_id) && ($type == 2 || ($type == 1 && $order_genre == 1))) {
|
|
//非赠品的商品库存增加
|
|
D('SSaleMGoods')->updateSetInc($where, "goods_num", $num);
|
|
}
|
|
switch ($type) {
|
|
case 1:
|
|
//商城
|
|
$onlineOrder = D('RetailBillOnline');
|
|
$order_genre = $onlineOrder->getFindField(array($onlineOrder::BILL_ID => $bill_id), $onlineOrder::ORDER_GENRE);
|
|
switch ($order_genre) {
|
|
case 1:
|
|
if (!empty($goods_gifts_id)) {
|
|
//赠品
|
|
$warehouseType = 20;
|
|
$price = 0;
|
|
$all_money = 0;
|
|
} else {
|
|
//正常商品
|
|
$warehouseType = 12;
|
|
}
|
|
break;
|
|
case 2:
|
|
$warehouseType = 8;
|
|
break;
|
|
case 3:
|
|
$warehouseType = 9;
|
|
break;
|
|
case 4:
|
|
$warehouseType = 17;
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
//店内
|
|
if (!empty($goods_gifts_id)) {
|
|
//赠品
|
|
$warehouseType = 19;
|
|
$price = 0;
|
|
$all_money = 0;
|
|
} else {
|
|
$warehouseType = 11;
|
|
}
|
|
break;
|
|
}
|
|
$data = [
|
|
'goods_id' => $goods_id,
|
|
'sku_id' => $sku_id,
|
|
'num' => $num,
|
|
'price' => $price,
|
|
'type' => $warehouseType,
|
|
'all_money' => $all_money,
|
|
'supplier_arr' => $supplier_arr,
|
|
];
|
|
$res = A('Api/Inventory')->goodsNumRise($data);
|
|
return $res;
|
|
}
|
|
} |