[ '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(); } }