| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040 |
- <?php
- /**
- * Niushop商城系统 - 团队十年电商经验汇集巨献!
- * =========================================================
- * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
- * ----------------------------------------------
- * 官方网址: https://www.niushop.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();
- }
- }
|