1040 lines
43 KiB
PHP
1040 lines
43 KiB
PHP
<?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' => [
|
||
'如通过“微信支付”付款订单,退款3~7个工作日到账。'
|
||
],
|
||
'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();
|
||
|
||
}
|
||
} |