admin/addon/store/model/cashier/CashierOrderRefund.php

1040 lines
43 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace addon\store\model\cashier;
use addon\memberrecharge\model\RechargeOrder;
use addon\store\model\member\MemberOnceCard;
use addon\store\model\store\Store;
use app\model\BaseModel;
use app\model\member\Member;
use app\model\member\MemberAccount;
use app\model\member\MemberLevelOrder;
use app\model\order\OrderCommon;
use app\model\order\OrderCreateTool;
use app\model\order\OrderGoods;
use app\model\site\Site;
use app\model\system\Pay;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Queue;
/**
* 收银订单
*
* @author Administrator
*
*/
class CashierOrderRefund extends BaseModel
{
/*********************************************************************************订单退款状态*****************************************************/
// 卖家关闭退款
const REFUND_CLOSE = 'refund_close';
//已完成
const REFUND_COMPLETE = 'refund_complete';
public $order_refund_status = [
self::REFUND_COMPLETE => [
'status' => self::REFUND_COMPLETE,
'name' => '退款成功',
'action' => [
],
'member_action' => [
],
'remind' => [
'如通过“微信支付”付款订单退款37个工作日到账。'
],
'member_remind' => [
]
],
self::REFUND_CLOSE => [
'status' => self::REFUND_CLOSE,
'name' => '退款关闭',
'action' => [
],
'member_action' => [
],
'remind' => [
],
'member_remind' => [
// '“买家主动/客服/系统”撤销申请,退款关闭',
'如果后续仍有问题,你可再次发起售后申请。'
]
],
];
/**
* 退款转账方式
* @param int $online_money
* @return array
*/
public function getRefundTransferType($online_money = -1){
$list = array(
'cash' =>['name' => '现金退款','desc' => '与客户协商一致, 以现金的形式退款给客户'],
'offline' => ['name' => '线下退款','desc' => '与客户协商一致, 在线下以支付宝或微信等形式退款给客户'],
);
if($online_money != 0){
$list['back'] = ['name' => '原路退款','desc' => '与客户协商一致,原路退款给客户'];
}
return $list;
}
/**
* 退款类型
* @return array
*/
public function getRefundTradeType(){
$list = array(
'order' => '订单退款',
'balance' => '储值退款',
);
return $list;
}
/**
* 数据转化
* @param $item
* @return mixed
*/
public function tran($item){
$refund_transfer_type = $item['refund_transfer_type'] ?? '';
if(!empty($refund_transfer_type)){
$refund_transfer_type_list = $this->getRefundTransferType();
$item['refund_transfer_type_name'] = $refund_transfer_type_list[$refund_transfer_type]['name'] ?? '';
}
$refund_status = $item['refund_status'] ?? '';
if(!empty($refund_status)){
$refund_status_list = $this->order_refund_status;
$item['refund_status_name'] = $refund_status_list[$refund_status]['name'] ?? '';
}
$refund_trade_type = $item['refund_trade_type'] ?? '';
if(!empty($refund_trade_type)){
$refund_trade_type_list = $this->getRefundTradeType();
$item['refund_trade_type_name'] = $refund_trade_type_list[$refund_trade_type] ?? '';
}
return $item;
}
public function refund($params){
$refund_array = $params['refund_array'] ?? [];
$site_id = $params['site_id'] ?? 0;
$member_id = $params['member_id'] ?? 0;
$store_id = $params['store_id'] ?? 0;
$item_array = [];
$operator = $params['operator'] ?? [];
$operator_id = $operator['uid'] ?? 0;
$operator_name = $operator['username'] ?? '';
$params['operator_id'] = $operator_id;
$params['operator_name'] = $operator_name;
foreach($refund_array as $k => $v){
$item_params = $params;
$item_params['order_id'] = $k;
$item_params['order_goods_params'] = $v;
$item_result = $this->orderRefund($item_params);
if($item_result['code'] < 0){
return $item_result;
}
}
return $this->success();
}
public function orderRefund($params){
$site_id = $params['site_id'] ?? 0;
$member_id = $params['member_id'] ?? 0;
$store_id = $params['store_id'] ?? 0;
$order_id = $params['order_id'];
$order_goods_params = $params['order_goods_params'];
$refund_transfer_type = $params['refund_transfer_type'] ?? '';
$item_params = array(
'order_id' => $order_id,
'order_goods_ids' => array_keys($order_goods_params),
'site_id' => $site_id,
'store_id' => $store_id,
'member_id' => $member_id,
);
$order_refund_result = $this->getRefundApplyOrderData($item_params);
if($order_refund_result['code'] < 0){
return $order_refund_result;
}
$order_refund_data = $order_refund_result['data'];
$online_money = $order_refund_data['online_money'];
$refund_transfer_type_list = $this->getRefundTransferType($online_money);
if(empty($refund_transfer_type_list[$refund_transfer_type])){
return $this->error([], '退款方式不支持!');
}
$item_order_goods_list = $order_refund_data['order_goods_list'];
$pay_model = new Pay();
$refund_no = $pay_model->createRefundNo();
$refund_reason = $params['refund_reason'] ?? '';
$refund_remark = $params['refund_remark'] ?? '';
$insert_data = array(
'order_id' => $order_id,
'member_id' => $member_id,
'refund_no' => $refund_no,
'store_id' => $store_id,
'site_id' => $site_id,
'refund_point' => $order_refund_data['total_refund_point'],
'refund_point_money' => $order_refund_data['total_refund_point_money'],
'refund_balance_money' => $order_refund_data['total_refund_balance'],
'refund_balance' => $order_refund_data['total_refund_balance_money'],
'refund_money' => $order_refund_data['total_refund_money'],
'refund_reason' => $refund_reason,
'refund_remark' => $refund_remark,
'create_time' => time(),
'refund_status' => self::REFUND_COMPLETE,
'refund_transfer_type' => $refund_transfer_type,
'refund_trade_type' => 'order',
'operator_id' => $params['operator_id'] ?? 0,
'operator_name' => $params['operator_name'] ?? '',
);
$insert_data = $this->tran($insert_data);
//实际退款
$refund_id = model('store_cashier_order_refund')->add($insert_data);
$total_refund_transfer_money = 0;
foreach($item_order_goods_list as $order_goods_k => $order_goods_v){
$item_order_goods_id = $order_goods_v['order_goods_id'];
$temp_item = $order_goods_params[$item_order_goods_id];
$item_order_goods_data = $order_goods_v;
$item_order_goods_data['refund_id'] = $refund_id;
$item_order_goods_data['item_order_goods_params'] = $temp_item;
$item_order_goods_data['refund_transfer_type'] = $refund_transfer_type;
$order_goods_result = $this->orderGoodsRefund($item_order_goods_data);
if($order_goods_result['code'] < 0){
return $order_goods_result;
}
$total_refund_transfer_money += $order_goods_result['data']['refund_transfer_money'];
}
$update_data = array(
'refund_pay_money' => $total_refund_transfer_money
);
model('store_cashier_order_refund')->update($update_data, [['refund_id', '=', $refund_id]]);
$insert_data['refund_id'] = $refund_id;
$insert_data['refund_id'] = $refund_id;
$this->complete($insert_data);
return $this->success();
}
public function orderGoodsRefund($params){
$item_order_goods_params = $params['item_order_goods_params'];
$item_refund_transfer_money = $item_order_goods_params['refund_transfer_money'] ?? 0;
$item_refund_num = $item_order_goods_params['refund_num'] ?? $params['num'];
$item_refund_money = $params['refund_money'] ?? 0;
$item_refund_pay_money = $params['refund_pay_money'] ?? 0;
$item_refund_point = $params['refund_point'] ?? 0;
$item_refund_point_money = $params['refund_point_money'] ?? 0;
$item_refund_balance = $params['refund_balance'] ?? 0;
$item_refund_balance_money = $params['refund_balance_money'] ?? 0;
$refund_id = $params['refund_id'];
$store_id = $params['store_id'];
$order_goods_id = $params['order_goods_id'];
$refund_transfer_type = $params['refund_transfer_type'] ?? '';
if($item_refund_transfer_money == 'total'){
$item_refund_transfer_money = $item_refund_pay_money;
}
if($item_refund_transfer_money > $item_refund_pay_money){
return $this->error([], '退款金额不能大于订单支付金额');
}
$pay_model = new Pay();
$refund_transfer_no = $pay_model->createRefundNo();
$insert_data = array(
'order_goods_id' => $params['order_goods_id'],
'order_id' => $params['order_id'],
'member_id' => $params['member_id'],
'refund_transfer_no' => $refund_transfer_no,
'site_id' => $params['site_id'],
'store_id' => $store_id,
'refund_num' => $item_refund_num,
'refund_pay_money' => $item_refund_pay_money,
'refund_point' => $item_refund_point,
'refund_point_money' => $item_refund_point_money,
'refund_balance_money' => $item_refund_balance_money,
'refund_balance' => $item_refund_balance,
'refund_money' => $item_refund_money,
'refund_id' => $refund_id,
'name' => $params['goods_name'],
'img' => $params['goods_image'],
);
//实际退款
$refund_goods_id = model('store_cashier_order_goods_refund')->add($insert_data);
$result = $this->refundAccount(['refund_goods_id' => $refund_goods_id, 'refund_transfer_type' => $refund_transfer_type]);
$this->setOrderGoodsRefund(['order_goods_id' => $order_goods_id]);
return $this->success(['refund_transfer_money' => $item_refund_transfer_money]);
}
/**
* 设置订单项的维权状态
* @param $params
* @return mixed
*/
public function setOrderGoodsRefund($params){
$order_goods_id = $params['order_goods_id'];
$condition = array(
['order_goods_id', '=', $order_goods_id]
);
$data = array(
'refund_status' => 'refund_complete',
'is_can_refund' => 0//这个订单项不可以再退了
);
model('store_cashier_order_goods')->update($data, $condition);
return $this->success();
}
/**
* 设置订单的维权状态
* @param $params
* @return mixed
*/
public function setOrderRefund($params){
$order_id = $params['order_id'];
$condition = array(
['order_id', '=', $order_id]
);
$data = array(
'is_can_refund' => 0//这个订单项不可以再退了
);
model('store_cashier_order')->update($data, $condition);
return $this->success();
}
/**
* 交易退款
* @param $params
* @return array
*/
public function refundAccount($params){
$refund_goods_id = $params['refund_goods_id'];
$refund_transfer_type = $params['refund_transfer_type'] ?? '';
//退还积分、余额 ....
$refund_condition = array(
['refund_goods_id', '=', $refund_goods_id]
);
$info = model('store_cashier_order_goods_refund')->getInfo($refund_condition);
$info['refund_transfer_type'] = $refund_transfer_type;
$order_goods_id = $info['order_goods_id'];
$order_goods_condition = array(
['order_goods_id', '=', $order_goods_id]
);
$order_goods_info = model('store_cashier_order_goods')->getInfo($order_goods_condition);
$info['order_goods_info'] = $order_goods_info;
$order_id = $info['order_id'];
$order_condition = array(
['order_id', '=', $order_id]
);
$order_info = model('store_cashier_order')->getInfo($order_condition);
$info['order_info'] = $order_info;
//退积分
$point_result = $this->refundPoint($info);
if ($point_result['code'] < 0) {
return $point_result;
}
//退余额
$balance_result = $this->refundBalance($info);
if ($balance_result['code'] < 0) {
return $balance_result;
}
//退真实支付金额
$pay_result = $this->refundPayMoney($info);
if ($pay_result['code'] < 0) {
return $pay_result;
}
return $this->success();
}
/**
* 退款真实金额
* @param $params
* @return array
*/
public function refundPayMoney($params){
$refund_pay_money = $params['refund_pay_money'];
$refund_transfer_type = $params['refund_transfer_type'] ?? '';
if($refund_pay_money > 0){
if($refund_transfer_type == 'back'){
$refund_transfer_no = $params['refund_transfer_no'];
$order_info = $params['order_info'];
$pay_money = $order_info['pay_money'];
$out_trade_no = $order_info['out_trade_no'];
//根据订单的支付方式来退款
//尝试退真实金额,或开启退款步骤
$pay_model = new Pay();
$result = $pay_model->refund($refund_transfer_no, $refund_pay_money, $out_trade_no, '', $pay_money, $order_info[ 'site_id' ], 1, 'CashierOrderPayRefund');
if($result['code'] < 0){
return $result;
}
//改变退款转账状态
$refund_data = array(
'refund_transfer_status' => 'transfer_ing'
);
$refund_condition = array(
['refund_transfer_no', '=', $refund_transfer_no]
);
model('store_cashier_order_goods_refund')->update($refund_data, $refund_condition);
}
}
return $this->success();
}
/**
* 退还积分
* @param $params
* @return array
*/
public function refundPoint($params)
{
$member_account_model = new MemberAccount();
$member_id = $params['member_id'];
$site_id = $params['site_id'];
$refund_point = $params['refund_point'] ?? 0;
if ($refund_point > 0) {
$from_type = 'refund';
$relate_tag = '积分返还';
$remark = '订单退款,退还积分:' . $refund_point;
$account_title = '订单退款,退还积分:' . $refund_point;
$result = $member_account_model->addMemberAccount($site_id, $member_id, 'point', $refund_point, $from_type, $relate_tag, $remark, $account_title);
if ($result['code'] < 0) {
return $result;
}
}
return $this->success();
}
/**
* 退还积分
* @param $params
* @return array
*/
public function refundBalance($params)
{
$member_account_model = new MemberAccount();
$member_id = $params['member_id'];
$site_id = $params['site_id'];
$refund_balance_money = $params['refund_balance_money'];//可退不可提现拥佣金
$refund_balance = $params['refund_balance'];//可退可提现佣金
if ($refund_balance_money > 0) {
$from_type = 'refund';
$relate_tag = '现金余额退还';
$remark = '订单退款,退还现金余额:' . $refund_balance_money;
$account_title = '订单退款,退还现金余额';
$result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance_money', $refund_balance_money, $from_type, $relate_tag, $remark, $account_title);
if ($result['code'] < 0) {
return $result;
}
}
if ($refund_balance > 0) {
$from_type = 'refund';
$relate_tag = '储值余额退还';
$remark = '订单退款,退还储值余额:' . $refund_balance;
$account_title = '订单退款,退还储值余额';
$result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance', $refund_balance, $from_type, $relate_tag, $remark, $account_title);
if ($result['code'] < 0) {
return $result;
}
}
return $this->success();
}
/**
* 退款到账通知事件
* @param $params
*/
public function refundPayNotify($params){
$refund_transfer_no = $params['refund_no'];
$refund_condition = array(
['refund_transfer_no', '=', $refund_transfer_no]
);
$refund_info = model('order_refund')->getInfo($refund_condition);
if(empty($refund_info))
return $this->error();
//改变退款转账状态
$refund_data = array(
'refund_transfer_status' => 'transfer_complete'
);
$refund_condition = array(
['refund_transfer_no', '=', $refund_transfer_no]
);
model('store_cashier_order_goods_refund')->update($refund_data, $refund_condition);
return $this->success();
}
public function getRefundApplyData($params){
$item_array = $params['refund_array'] ?? [];
$site_id = $params['site_id'] ?? 0;
$member_id = $params['member_id'] ?? 0;
$store_id = $params['store_id'] ?? 0;
$order_goods_id_array = [];
$refund_data = [];
$refund_array = [];
$total_refund_money = 0;
$total_refund_pay_money = 0;
$total_refund_point = 0;
$total_refund_point_money = 0;
$total_refund_balance = 0;
$total_refund_balance_money = 0;
$total_online_money = 0;
foreach($item_array as $k => $v){
$item_params = array(
'order_id' => $k,
'order_goods_ids' => $v,
'site_id' => $site_id,
'store_id' => $store_id,
'member_id' => $member_id,
);
$order_refund_result = $this->getRefundApplyOrderData($item_params);
if($order_refund_result['code'] < 0){
return $order_refund_result;
}
$order_refund = $order_refund_result['data'];
$item_total_refund_money = $order_refund['total_refund_money'] ?? 0;
$item_total_refund_pay_money = $order_refund['total_refund_pay_money'] ?? 0;
$item_total_refund_point = $order_refund['total_refund_point'] ?? 0;
$item_total_refund_point_money = $order_refund['total_refund_point_money'] ?? 0;
$item_total_refund_balance = $order_refund['total_refund_balance'] ?? 0;
$item_total_refund_balance_money = $order_refund['total_refund_balance_money'] ?? 0;
$total_refund_money += $item_total_refund_money;
$total_refund_pay_money += $item_total_refund_pay_money;
$total_refund_point += $item_total_refund_point;
$total_refund_point_money += $item_total_refund_point_money;
$total_refund_balance += $item_total_refund_balance;
$total_refund_balance_money += $item_total_refund_balance_money;
$refund_array[] = $order_refund;
$total_online_money += $order_refund['online_money'];
}
$refund_data['refund_list'] = $refund_array;
$refund_data['total_refund_money'] = $total_refund_money;
$refund_data['total_refund_pay_money'] = $total_refund_pay_money;
$refund_data['total_refund_point'] = $total_refund_point;
$refund_data['total_refund_point_money'] = $total_refund_point_money;
$refund_data['total_refund_balance'] = $total_refund_balance;
$refund_data['total_refund_balance_money'] = $total_refund_balance_money;
$refund_data['total_online_money'] = $total_online_money;
$refund_transfer_type = $this->getRefundTransferType($total_online_money);
$refund_data['refund_transfer_type'] = $refund_transfer_type;
return $this->success($refund_data);
}
public function getRefundApplyOrderData($params){
$order_id = $params['order_id'] ?? 0;
$site_id = $params['site_id'] ?? 0;
$member_id = $params['member_id'] ?? 0;
$store_id = $params['store_id'] ?? 0;
$order_condition = array(
['order_id', '=', $order_id]
);
if($site_id > 0){
$order_condition[] = ['site_id', '=', $site_id];
}
if($member_id > 0){
$order_condition[] = ['member_id', '=', $member_id];
}
if($store_id > 0){
$order_condition[] = ['store_id', '=', $store_id];
}
$order_info = model('store_cashier_order')->getInfo($order_condition);
if(empty($order_info))
return $this->error();
//订单整体项
//查询正处于退款中和退款成功的退款记录,计算已经退的钱以及退的余额 积分 红包
$refund_temp_condition = array(
['order_id', '=', $order_id],
['refund_status', '<>', self::REFUND_CLOSE],
);
$refund_temp_list = model('store_cashier_order_refund')->getList($refund_temp_condition);
//统计已经扣除的
$over_refund_money = 0;
$over_refund_pay_money = 0;//已退款真实退款金额
$over_refund_balance_money = 0;//已退款退款现金余额
$over_refund_balance = 0;//已退款退款储值余额
$over_refund_point_money = 0;//已退积分金额
$over_refund_point = 0;//已退积分
foreach ($refund_temp_list as $k => $v) {
$over_refund_money += $v['refund_money'];
$over_refund_pay_money += $v['refund_pay_money'];
$over_refund_point += $v['refund_point'];//退的积分
$over_refund_point_money += $v['refund_point_money'];//退的积分金额
$over_refund_balance += $v['refund_balance'];//储值余额
$over_refund_balance_money += $v['refund_balance_money'];//现金余额
}
$order_goods_ids = $params['order_goods_ids'] ?? '';
$order_goods_condition = array(
['order_goods_id', 'in', $order_goods_ids],
);
$order_goods_list = model('store_cashier_order_goods')->getList($order_goods_condition);
$order_offset_model = new CashierOrderOffset();
//订单的抵扣信息
$offset_array = $order_offset_model->getOrderOffset(['order_id' => $order_id]) ?? [];
$total_point = $offset_array['point'];
$total_point_money = $offset_array['point_money'];
$total_balance_money = $offset_array['balance_money'];
$total_balance = $offset_array['balance'];
$total_refund_money = 0;
$total_refund_pay_money = 0;
$total_refund_point = 0;
$total_refund_point_money = 0;
$total_refund_balance = 0;
$total_refund_balance_money = 0;
foreach($order_goods_list as $k => $v){
$refund_params = array(
'over_refund_money' => $over_refund_money,
'over_refund_pay_money' => $over_refund_pay_money,
'over_refund_point' => $over_refund_point,
'over_refund_point_money' => $over_refund_point_money,
'over_refund_balance' => $over_refund_balance,
'over_refund_balance_money' => $over_refund_balance_money,
'order_goods_info' => $v,
'total_point' => $total_point,
'total_point_money' => $total_point_money,
'total_balance_money' => $total_balance_money,
'total_balance' => $total_balance,
);
$refund_params = array_merge($order_info, $refund_params);
$item_refund_data = $this->getRefundApplyRefundMoney($refund_params);
$item_refund_money = $item_refund_data['refund_money'] ?? 0;
$item_refund_pay_money = $item_refund_data['refund_pay_money'] ?? 0;
$item_refund_point = $item_refund_data['refund_point'] ?? 0;
$item_refund_point_money = $item_refund_data['refund_point_money'] ?? 0;
$item_refund_balance = $item_refund_data['refund_balance'] ?? 0;
$item_refund_balance_money = $item_refund_data['refund_balance_money'] ?? 0;
$over_refund_money -= $item_refund_money;
$over_refund_pay_money -= $item_refund_pay_money;
$over_refund_point -= $item_refund_point;
$over_refund_point_money -= $item_refund_point_money;
$over_refund_balance -= $item_refund_balance;
$over_refund_balance_money -= $item_refund_balance_money;
$total_refund_money += $item_refund_money;
$total_refund_pay_money += $item_refund_pay_money;
$total_refund_point += $item_refund_point;
$total_refund_point_money += $item_refund_point_money;
$total_refund_balance += $item_refund_balance;
$total_refund_balance_money += $item_refund_balance_money;
$order_goods_list[$k] = array_merge($v, $item_refund_data);//todo 订单和订单项重复的字段会被覆盖
}
$order_info['order_goods_list'] = $order_goods_list;
$order_info['total_refund_money'] = $total_refund_money;
$order_info['total_refund_pay_money'] = $total_refund_pay_money;
$order_info['total_refund_point'] = $total_refund_point;
$order_info['total_refund_point_money'] = $total_refund_point_money;
$order_info['total_refund_balance'] = $total_refund_balance;
$order_info['total_refund_balance_money'] = $total_refund_balance_money;
return $this->success($order_info);
}
public function getRefundApplyRefundMoney($params){
$order_goods_info = $params['order_goods_info'] ?? [];
$over_refund_money = $params['over_refund_money'];
$over_refund_pay_money = $params['over_refund_pay_money'];
$over_refund_point = $params['over_refund_point'];//退的积分
$over_refund_point_money = $params['over_refund_point_money'];//退的积分金额
$over_refund_balance = $params['over_refund_balance'];//储值余额
$over_refund_balance_money = $params['over_refund_balance_money'];//现金余额
$order_id = $order_goods_info['order_id'];
$order_goods_id = $order_goods_info['order_goods_id'];
$order_money = $params['order_money'];
$pay_money = $params['pay_money'];
$total_point = $params['point'];
$total_point_money = $params['point_money'];
$total_balance_money = $params['balance_money'];
$total_balance = $params['balance'];
$cashier_order_goods_model = new CashierOrderGoods();
//订单项真实商品金额
$refund_goods_real_goods_money = $cashier_order_goods_model->getOrderGoodsRealMoney($order_goods_info);
$refund_commission_rate = $refund_array['refund_commission_rate'] ?? 0;//退款手续费比率
if($refund_goods_real_goods_money > 0){
$surplus_order_money = $order_money - $over_refund_money;//剩余还能退的钱
$surplus_pay_money = $pay_money - $over_refund_pay_money;//剩余真实金额
$surplus_point = $total_point - $over_refund_point;//剩余可退积分
$surplus_point_money = $total_point_money - $over_refund_point_money;//剩余积分可抵金额
$surplus_balance_money = $total_balance_money - $over_refund_balance_money;//剩余现金余额
$surplus_balance = $total_balance - $over_refund_balance;//剩余真储值余额
$refund_shipping_money = 0;
if ($refund_shipping_money > 0) {
$refund_shipping_money = $refund_shipping_money > $surplus_order_money ? $surplus_order_money : $refund_shipping_money;
$surplus_order_money -= $refund_shipping_money;
}
//真实金额所占比率
$refund_goods_real_goods_money = $refund_goods_real_goods_money > $surplus_order_money ? $surplus_order_money : $refund_goods_real_goods_money;
$refund_money = $refund_goods_real_goods_money + $refund_shipping_money;
$refund_goods_real_goods_rate = $refund_goods_real_goods_money / ($refund_money+1);
$real_rate = $refund_money / $order_money;
$refund_balance = $total_balance * $real_rate;
$refund_balance = $refund_balance > $surplus_balance ? $surplus_balance : $refund_balance;
$refund_balance_money = round($total_balance_money * $real_rate, 2);
$refund_balance_money = $refund_balance_money > $surplus_balance_money ? $surplus_balance_money : $refund_balance_money;
$refund_point = round($total_point * $real_rate);
$refund_point = $refund_point > $surplus_point ? $surplus_point : $refund_point;
$refund_point_money = round($total_point_money * $real_rate, 2);
$refund_point_money = $refund_point_money > $surplus_point_money ? $surplus_point_money : $refund_point_money;
$refund_pay_money = round($pay_money * $real_rate, 2);
$refund_pay_money = $refund_pay_money > $surplus_pay_money ? $surplus_pay_money : $refund_pay_money;
//计算退款手续费
if ($refund_pay_money > 0) {
$refund_goods_pay_money = $refund_pay_money * $refund_goods_real_goods_rate;
$refund_commission = $refund_goods_pay_money * $refund_commission_rate / 100;//
}
}
$refund_array['refund_money'] = $refund_money ?? 0;
$refund_array['refund_shipping_money'] = $refund_shipping_money ?? 0;
$refund_array['refund_balance'] = $refund_balance ?? 0;
$refund_array['refund_balance_money'] = $refund_balance_money ?? 0;
$refund_array['refund_point'] = $refund_point ?? 0;
$refund_array['refund_point_money'] = $refund_point_money ?? 0;
$refund_array['refund_pay_money'] = $refund_pay_money ?? 0;
$refund_array['refund_commission'] = $refund_commission ?? 0;
return $refund_array;
}
/**
* 收银订单退款
* @param $params
*/
public function activeOrderRefund($params)
{
$order_id = $params['order_id'];
$cashier_condition = array(
['order_id', '=', $order_id]
);
$cashier_order_info = model('store_cashier_order')->getInfo($cashier_condition, '*');
$site_id = $cashier_order_info['site_id'];
$out_trade_no = $cashier_order_info['out_trade_no'];
$online_money = $cashier_order_info['online_money'];
//如果存在支付金额的话
if ($online_money > 0) {
$pay_model = new Pay();
//退款编号
$refund_no = $pay_model->createRefundNo();
$pay_model->refund($refund_no, $online_money, $out_trade_no, '收银订单' . $cashier_order_info . '关闭,退款:' . $online_money, $online_money, $site_id, 1);
}
$member_id = $cashier_order_info['member_id'];
//单纯退优惠券
$offset_limit = ['balance', 'balance_money', 'point'];
$order_offset_model = new CashierOrderOffset();
$discount_params = array(
'site_id' => $site_id,
'member_id' => $member_id,
'order_id' => $order_id,
'limit' => $offset_limit
);
$discount_result = $order_offset_model->orderOffsetRefund($discount_params);
if ($discount_result['code'] < 0) {
return $discount_result;
}
$cashier_common_model = new CashierOrderCommon();
$close_result = $cashier_common_model->orderClose([['order_id', '=', $order_id]]);
if($close_result['code'] < 0)
return $close_result;
return $this->success();
}
/**
* 获取退款分页列表
* @param array $condition
* @param bool $field
* @param string $order
* @param int $page
* @param int $list_rows
* @param string $alias
* @param array $join
* @return array
*/
public function getRefundPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
{
$data = model('store_cashier_order_refund')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
return $this->success($data);
}
/**
* 获取退款信息
* @param array $condition
* @param bool $field
* @param string $alias
* @param array $join
* @return array
*/
public function getRefundInfo($condition = [], $field = true, $alias = 'a', $join = [])
{
$data = model('store_cashier_order_refund')->getInfo($condition, $field, $alias, $join);
return $this->success($data);
}
/**
* 获取退款项列表
* @param array $condition
* @param bool $field
* @param string $order
* @param string $alias
* @param array $join
* @return array
*/
public function getRefundGoodsList($condition = [], $field = true, $order = '', $alias = 'a', $join = [])
{
$data = model('store_cashier_order_goods_refund')->getList($condition, $field, $order, $alias, $join);
return $this->success($data);
}
/**
* 查询储值可退
* @param $params
* @return array
*/
public function getMemberBalanceRefundData($params){
$site_id = $params['site_id'] ?? 0;
$member_id = $params['member_id'] ?? 0;
// $store_id = $params['store_id'] ?? 0;
//统计查询会员在充值上花的钱
$recharge_condition = array(
['site_id', '=', $site_id],
['member_id', '=', $member_id],
['status', '=','complete', ]
// ['store_id', '=', $store_id],
);
$refund_total_balance = model('store_cashier_order')->getSum( $recharge_condition, Db::raw('pay_money - refund_pay_money'));
$use_condition = array(
['site_id', '=', $site_id],
['member_id', '=', $member_id],
['is_deduct_balance', '=', 1]
);
$use_total_balance = model('store_cashier_order')->getSum( $use_condition, 'total_balance');
$member_account_condition = array(
['site_id', '=', $site_id],
['member_id', '=', $member_id],
);
$member_account_model =new MemberAccount();
$member_account_result = $member_account_model->getMemberAccount($member_account_condition);
$member_account = $member_account_result['data'] ?? [];
$can_refund_balance = $refund_total_balance - $use_total_balance;
if($can_refund_balance < 0){
$can_refund_balance = 0;
}
$return_data = array(
'refund_total_balance' => $refund_total_balance,
'member_account' => $member_account,
'use_total_balance' => $use_total_balance,
'can_refund_balance' => $can_refund_balance,
'refund_transfer_type_list' => $this->getRefundTransferType(0)
);
return $this->success($return_data);
}
/**
* 退款
* @param $params
* @return array
*/
public function memberRefundBalance($params){
$result = $this->getMemberBalanceRefundData($params);
if($result['code'] < 0)
return $result;
$refund_data = $result['data'];
$site_id = $params['site_id'] ?? 0;
$member_id = $params['member_id'] ?? 0;
$store_id = $params['store_id'];
$member_account = $refund_data['member_account'] ?? [];
$can_refund_balance = $refund_data['can_refund_balance'];
if($can_refund_balance <= 0){
return $this->error([], '没有可退的余额');
}
$refund_total_balance = $refund_data['refund_total_balance'];
$refund_transfer_type = $params['refund_transfer_type'] ?? '';
$refund_balance = $params['refund_balance'] ?? 0;
if($refund_balance > $can_refund_balance){
return $this->error([], '申请退款不能大于可退金额');
}
$pay_model = new Pay();
$refund_no = $pay_model->createRefundNo();
$refund_reason = $params['refund_reason'] ?? '';
$refund_remark = $params['refund_remark'] ?? '';
$operator = $params['operator'] ?? [];
$operator_id = $operator['uid'] ?? 0;
$operator_name = $operator['username'] ?? '';
$insert_data = array(
'order_id' => 0,
'member_id' => $member_id,
'refund_no' => $refund_no,
'store_id' => $store_id,
'site_id' => $site_id,
'refund_pay_money' => $refund_balance,
'refund_money' => $refund_balance,
'refund_reason' => $refund_reason,
'refund_remark' => $refund_remark,
'create_time' => time(),
'refund_status' => self::REFUND_COMPLETE,
'refund_transfer_type' => $refund_transfer_type,
'refund_trade_type' => 'balance',
'operator_id' => $operator_id,
'operator_name' => $operator_name,
);
$insert_data = $this->tran($insert_data);
//实际退款
$refund_id = model('store_cashier_order_refund')->add($insert_data);
$pay_model = new Pay();
$refund_transfer_no = $pay_model->createRefundNo();
$refund_name = '储值退款';
$refund_img = 'upload/cashier/member-recharge-icon.png';
$insert_goods_data = array(
'member_id' => $params['member_id'],
'refund_transfer_no' => $refund_transfer_no,
'site_id' => $site_id,
'store_id' => $store_id,
'refund_num' => 1,
'refund_pay_money' => $refund_balance,
'refund_money' => $refund_balance,
'refund_id' => $refund_id,
'name' => $refund_name,
'img' => $refund_img,
);
//实际退款
$refund_goods_id = model('store_cashier_order_goods_refund')->add($insert_goods_data);
//todo 这儿可以调用实际退款
$this->refundPayMoney($insert_goods_data);
//余额清零
$member_account_model = new MemberAccount();
$refund_balance = $member_account['balance'];
$refund_balance_money = $member_account['balance_money'];
if ($refund_balance_money > 0) {
$from_type = 'refund';//todo 需要改
$relate_tag = '现金余额清零';
$remark = '订单退款,退还现金余额:' . $refund_balance_money;
$account_title = '订单退款,退还现金余额';
$result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance_money', -$refund_balance_money, $from_type, $relate_tag, $remark, $account_title);
if ($result['code'] < 0) {
return $result;
}
}
if ($refund_balance > 0) {
$from_type = 'refund';
$relate_tag = '储值余额清零';
$remark = '订单退款,退还储值余额:' . $refund_balance;
$account_title = '订单退款,退还储值余额';
$result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance', -$refund_balance, $from_type, $relate_tag, $remark, $account_title);
if ($result['code'] < 0) {
return $result;
}
}
$insert_data['refund_id'] = $refund_id;
$this->complete($insert_data);
return $this->success();
}
/**
* 退款完毕
* @param $params
*/
public function complete($params){
$order_id = $params['order_id'];
$refund_id = $params['refund_id'];
$refund_info = $this->getRefundInfo([['refund_id', '=', $refund_id]])['data'] ?? [];
$refund_trade_type = $params['refund_trade_type'];
if($refund_trade_type == 'order'){
//累加订单退款
$refund_data = array(
'refund_money' => Db::raw('refund_money + '.$refund_info['refund_money']),
'refund_pay_money' => Db::raw('refund_pay_money + '.$refund_info['refund_pay_money']),
'refund_point' => Db::raw('refund_point + '.$refund_info['refund_point']),
'refund_point_money' => Db::raw('refund_point_money + '.$refund_info['refund_point_money']),
'refund_balance_money' => Db::raw('refund_balance_money + '.$refund_info['refund_balance_money']),
'refund_balance' => Db::raw('refund_balance + '.$refund_info['refund_balance']),
);
model('store_cashier_order')->update($refund_data, [['order_id', '=', $order_id]]);
//核验订单
$this->checkOrderRefund(['order_id' => $order_id]);
}
event('SiteStat', [
'site_id' => $refund_info['site_id'],
'store_id' => $refund_info['store_id'] ?? 0,
'stat_type' => 'order_refund',
'stat_data' => $refund_info['refund_pay_money'],
]);
return $this->success();
}
/**
* 核验订单是否全部退完
* @param $params
* @return array
*/
public function checkOrderRefund($params){
$order_id = $params['order_id'];
$refund_order_goods_condition = array(
['order_id', '=', $order_id],
['refund_status', '=', 'refund_complete']
);
$refund_goods_count = model('store_cashier_order_goods')->getCount($refund_order_goods_condition);
$order_goods_condition = array(
['order_id', '=', $order_id],
// ['is_can_refund', '=', 1],
);
$order_goods_count = model('store_cashier_order_goods')->getCount($order_goods_condition);
if($refund_goods_count == $order_goods_count){//如果订单项全部都退完的话,订单会关闭
$this->setOrderRefund(['order_id' => $order_id]);
$cashier_order_model = new CashierOrderCommon();
$order_close_condition = array(
['order_id', '=', $order_id]
);
$cashier_order_model->orderClose($order_close_condition);
}
return $this->success();
}
}