| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802 |
- <?php
- namespace common\logic\order;
- use addons\PerformanceDividend\common\logic\PerformanceDividendRewardLogic;
- use addons\Store\common\enums\StoreEnum;
- use addons\Store\common\models\StoreGoodsReserve;
- use addons\Store\common\models\StoreOrder;
- use addons\Store\common\models\StoreOrderDetail;
- use addons\Store\common\models\StoreOrderMarketing;
- use addons\ValetOrder\common\service\OrderService;
- use addons\WangDianTong\common\service\OrderRefundRejectService;
- use addons\CardCoupons\common\models\CardCouponsScoreGive;
- use common\enums\AddonsEnum;
- use common\enums\EventNameEnum;
- use common\enums\OrderSourceEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\PaymentTradeOrderEnum;
- use common\enums\RefundStatusEnum;
- use common\enums\RefundTypeEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\events\order\OrderRefundChangeEvent;
- use common\events\order\OrderRefundFinishEvent;
- use common\events\order\OrderRefundUpdateEvent;
- use common\logic\statistics\StatisticsHandle;
- use common\logic\wechat\WechatMessageLogic;
- use common\models\common\PaymentTrade;
- use common\models\common\PaymentTradeOrder;
- use common\models\goods\GoodsReserve;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderMarketing;
- use common\models\order\OrderRefund;
- use common\models\order\OrderRefundStep;
- use common\models\common\Addons;
- use common\models\user\DigitalLog;
- use common\models\user\UserDigital;
- use common\traits\ErrorTrait;
- use Yii;
- use Exception;
- use services\common\UserWalletService;
- use yii\helpers\Json;
- use common\enums\PayTypeEnum;
- use common\globals\GlobalInvoke;
- use services\common\ThirdPartyRefundService;
- use common\models\common\CapitalLog;
- use addons\Boss\common\models\AddonsBossRewardLog;
- use addons\WuzhouChain\common\services\OrderService as ServicesOrderService;
- use common\enums\RabbitMqEnum;
- use common\models\common\PaymentTradeItemRefund;
- /**
- * 售后订单处理
- * Class OrderRefundLogic
- * @Author: lun
- * @DateTime: 2021/10/11 0011 14:11
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @package common\logic\order
- */
- class OrderRefundLogic
- {
- use ErrorTrait;
- /**
- * 售后处理
- * @Author: lun
- * @DateTime: 2021/10/11 0011 15:55
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $mallId
- * @param $refundId
- * @param $stepStatus
- */
- public function execute($mallId, $params)
- {
- $trans = Yii::$app->db->beginTransaction();
- try {
- $refund = OrderRefund::findOne(['id' => $params['id'], 'mall_id' => $mallId]);
- if(empty($refund)) throw new Exception("售后订单不存在或已删除");
- if ($refund->isRefundFinish()) throw new Exception('当前订单已售后');
- if(!empty($params['refund_price'])){
- $old_reality_refund_price = $refund->refund_price;
- $refund->refund_price = $params['refund_price'];
- $refund->old_reality_refund_price = $old_reality_refund_price;
- }
- if(!empty($params['refund_remark'])){
- $refund->refund_remark = (string)$params['refund_remark'];
- }
- switch ($params['step_status']) {
- case RefundStatusEnum::STEP_2:// 退货退款:已同意退货申请,等待买家处理
- $refund->saler_address = Json::encode($params['address']);
- $refund->refund_status = RefundStatusEnum::HANDEL;
- break;
- case RefundStatusEnum::STEP_4:// 退货退款:退货完成
- $refund->refund_status = RefundStatusEnum::FINISH;
- break;
- case RefundStatusEnum::STEP_6:// 仅退款:退款完成
- $refund->refund_status = RefundStatusEnum::FINISH;
- $refund_result = '售后通过';
- break;
- case RefundStatusEnum::STEP_8:// 换货:已同意换货申请,等待买家处理
- $refund->saler_address = Json::encode($params['address']);
- $refund->refund_status = RefundStatusEnum::HANDEL;
- $refund_result = '售后通过';
- break;
- case RefundStatusEnum::STEP_10:// 换货:已重新发货
- $refund->saler_express = $params['express']['saler_express'];
- $refund->saler_express_no = $params['express']['saler_express_no'];
- $refund->customer_name = $params['express']['customer_name'] ?? '';
- $refund->refund_status = RefundStatusEnum::EXCHANGE_GOODS;
- $refund->saler_express_at = time();// 重新发货时间
- break;
- case RefundStatusEnum::STEP_NEGATIVE_1:// 拒绝售后
- $refund->refund_status = RefundStatusEnum::FINISH;
- $refund_result = '售后驳回';
- break;
- case RefundStatusEnum::STEP_NEGATIVE_2:// 拒绝收货
- $refund->refund_status = RefundStatusEnum::REFUSE;
- break;
- }
- $refund_price = $refund->refund_price;
- // 自动维护主订单
- OrderDetail::updateAll(['is_feedback' => OrderStatusEnum::getIsFeedbackStatus($params['step_status']), 'updated_at' => time()], ['id' => $refund->order_detail_id]);
- $order = Order::getOne([['id' => $refund->order_id]]);
- $order_status = $order->order_status;
- $is_install = MallAddons::isInstall($mallId, AddonsEnum::ADDONS_NAME_STORE);
- Order::autoUpdateStatus($order);
- // 支付流水
- $out_trade_no = $order['out_trade_no'];
- $payment_trade = PaymentTrade::findOne(['out_trade_no' => $out_trade_no]);
- if($is_install && $order->order_source == AddonsEnum::ADDONS_NAME_STORE){
- $store_order = StoreOrder::findOne(['order_no'=>$order['order_no']]);
- if(!empty($store_order)){
- $order['out_trade_no'] = $store_order['out_trade_no'];
- StoreOrderDetail::updateAll(['is_feedback' => OrderStatusEnum::getIsFeedbackStatus($params['step_status']), 'updated_at' => time()], ['main_order_detail_id' => $refund->order_detail_id]);
- StoreOrder::autoUpdateStatus($store_order);
- }
- } elseif ($order->marketing_type == AddonsEnum::ADDONS_NAME_LAO_DA_FU && MallAddons::isInstall($mallId, AddonsEnum::ADDONS_NAME_LAO_DA_FU)) {
- $store_order = \addons\LaoDaFu\common\models\StoreOrder::findOne(['order_no'=>$order['order_no']]);
- if($store_order !== null){
- $order['out_trade_no'] = $store_order['out_trade_no'];
- \addons\LaoDaFu\common\models\StoreOrderDetail::updateAll(['is_feedback' => OrderStatusEnum::getIsFeedbackStatus($params['step_status']), 'updated_at' => time()], ['main_order_detail_id' => $refund->order_detail_id]);
- \addons\LaoDaFu\common\models\StoreOrder::autoUpdateStatus($store_order);
- }
- }
- // 操作退款-退货退款,仅退款
- $insert_wallet = []; //重置写入钱包数据
- if (in_array($params['step_status'], [RefundStatusEnum::STEP_4, RefundStatusEnum::STEP_6]) &&
- $order->marketing_type != AddonsEnum::ADDONS_NAME_WECHAT_VIDEO_SHOP) {
- // 判断是否为预约订单
- if (in_array($order->order_source, [OrderSourceEnum::SOURCE_RESERVE, OrderSourceEnum::SOURCE_STORE_RESERVE]) && empty($params['not_dec_fee'])) {
- // 如果是预约订单那么就需要判断是否需要扣点
- $orderDetail = OrderDetail::findOne(['id' => $refund->order_detail_id]);
- if ($order->order_source == OrderSourceEnum::SOURCE_STORE_RESERVE) {
- $goodsReserve = StoreGoodsReserve::findOne(['goods_id' => $orderDetail->goods_id]);
- } else {
- $goodsReserve = GoodsReserve::findOne(['goods_id' => $orderDetail->goods_id]);
- }
- $cancel_rule = !empty($goodsReserve->cancel_rule) ? Json::decode($goodsReserve->cancel_rule) : [];
- if (!empty($cancel_rule['cancel_fee_percent']) && in_array($order_status, [OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING])) {
- // 判断是否需要扣点 - 待服务/服务中
- if(empty($params['refund_price'])) {//后台有传,就用后台的
- $refund->refund_price -= bcmul(bcmul($refund->refund_price, $cancel_rule['cancel_fee_percent'], 2), 0.01, 2);
- }
- }
- }
- $wallet_type = UserWalletService::WALLET_TYPE_BALANCE;
- if ($order->payment_type == PayTypeEnum::SCORE) $wallet_type = UserWalletService::WALLET_TYPE_SCORE;
- $orderUserId = $order->user_id;
- $refundUserId = $refund->user_id;
- if ($refund->refund_price > 0) {// 只有退款金额大于0的情况下才可以进入
- $all_refund_price = $refund->refund_price;
- // 类型为后台主动退款时,处理佣金、积分数据
- if ($params['admin_handler_refund'] == UserWalletEnum::ADMIN_HANDLER_REFUND) {
- //检查该订单是否已经存在过售后完成的售后单
- // $check_order_detail_refund = OrderDetail::findOne(['order_id' => $refund->order_id, 'is_feedback' => 2]);
- $check_order_detail_refund = OrderRefund::findOne(['order_id' => $refund->order_id,'mall_id' => $mallId,'refund_status' => 1]);
- // $check_order_detail_refund = OrderDetail::find()->where(['order_id' => $refund->order_id])->asArray()->all();
- // print_r($check_order_detail_refund);exit;
- //如果不存在同订单的其他商品已经完成售后的售后单
- if(empty($check_order_detail_refund)){
- //如果为首次发起售后的,获取source_table为order的佣金,积分,余额数据
- $condition = [
- 'where'=>[
- ['source_table' => [Order::tableName()]],
- ['source_table_id' => $refund->order_id],
- ['mall_id' => $refund->mall_id],
- ['from_type' => ['Rebate']]
- ],
- ];
- $data = [
- 'condition' => $condition,
- 'params' => $params
- ];
- $insert_wallet = self::getOrderCommissionData($insert_wallet, $data, 'balance', $refund);
- $insert_wallet = self::getOrderCommissionData($insert_wallet, $data, 'commission', $refund);
- $insert_wallet = self::getOrderCommissionData($insert_wallet, $data, 'score', $refund);
- // print_r($insert_wallet);exit;
- }
- $condition = [
- 'where' => [
- ['source_table' => ['order_detail', OrderDetail::tableName()]],
- ['source_table_id' => $refund->order_detail_id],
- ['mall_id' => $refund->mall_id],
- ['from_type' => ['Agent', 'Area', 'CloudStock', 'Achievement', 'Distribution', 'EqualSubsidy', 'PerformanceDividend', 'consume']],
- ],
- ];
- // $wallet_type = $params['wallet_type'];
- // CapitalLog::$capitalType = "commission";
- // $commission_list = CapitalLog::getList($condition,0);
- //处理售后商品对应的佣金数据
- $data = [
- 'condition' => $condition,
- 'params' => $params
- ];
- //处理申请售后订单的商品对应的佣金数据
- $insert_wallet = self::getOrderCommissionData($insert_wallet, $data, 'commission', $refund);
- ////处理申请售后订单的商品对应的积分数据
- $insert_wallet = self::getOrderCommissionData($insert_wallet, $data, 'score', $refund);
- //获取已结算的积分数据
- //处理申请售后订单的商品对应的数字币数据
- $deduction_digital = self::getOrderDigital($data, $refund);
- // if (!empty($score_list)) {
- // foreach ($score_list as $k => $val) {
- // $score_refund_price = $val['change_num']*($params['refund_pre']/100) * -1;//处理为负数
- // $score_refund_price = number_format($score_refund_price, 2);
- // //admin_hander_refund 为后台主动退款时
- // $insert_wallet[] = [
- // 'mall_id' => $refund->mall_id,
- // 'user_id' => $val['user_id'],
- // 'is_frozen' => false,
- // 'wallet_type' => 'score',// 暂定退回积分
- // 'money' => $score_refund_price,
- // 'desc' => '后台主动退款',
- // 'source_table' => OrderRefund::tableName(),
- // 'source_table_id' => $refund->order_detail_id,
- // 'from_type' => UserWalletEnum::REFUND,
- // 'capital_type' => UserWalletEnum::REFUND_ORDER,
- // 'order_no' => $order->order_no,
- // 'not_add_total' => true,
- // 'admin_handler_refund' => $params['admin_handler_refund'] ? $params['admin_handler_refund'] : '',
- // ];//写入积分操作
- // }
- // }
- //处理该订单是否有boss分红
- $boss_reward_log_list = AddonsBossRewardLog::find()->where(['order_id' => $refund->order_id, 'is_settlement' => 0])->one();
- // print_r($boss_reward_log_list);exit;
- if (!empty($boss_reward_log_list)) {
- $boss_update_res = AddonsBossRewardLog::updateAll(['status' => StatusEnum::DELETE] ,['order_id' => $refund->order_id]);
- if (!$boss_update_res) throw new Exception("保存失败,msg= 处理订单boss分红数据失败");
- }
- }
- // 如果是代客下单,获取该订单是谁支付的
- if (MallAddons::isInstall($refund->mall_id, AddonsEnum::ADDONS_NAME_VALET_ORDER)) {
- $valetOrderOriginBuyUserId = (new OrderService())->getValetOrderByOrderId($order->id)['buy_user_id'] ?? null;
- if ($valetOrderOriginBuyUserId) {
- $refundUserId = $valetOrderOriginBuyUserId;
- $orderUserId = $valetOrderOriginBuyUserId;
- }
- }
- // 判断是否开启超级支付
- $tactics_collection_detail = null;
- if (MallAddons::isInstall($mallId, AddonsEnum::ADDONS_NAME_TACTICS_PAY)) {
- $tactics_setting = Yii::$app->services->setting->addons->get($mallId, AddonsEnum::ADDONS_NAME_TACTICS_PAY, 'basic');
- if (!empty($tactics_setting['is_enable'])) {
- $tactics_collection_detail = \addons\TacticsPay\common\models\TacticsPayCollectionDetail::findOne(['mall_id' => $mallId, 'trade_no' => $out_trade_no]);
- }
- }
- $list = $payment_trade->getRefundFeeList($refund->id);
- foreach ($list as $item) {
- if (in_array($item->pay_type, [PayTypeEnum::BALANCE, PayTypeEnum::SCORE])) {
- // 退款金额
- $refund_price = $item->getRefundFee($params, $refund);
- // 本地支付
- $wallet_type = $item->pay_type == PayTypeEnum::SCORE ? UserWalletService::WALLET_TYPE_SCORE : UserWalletService::WALLET_TYPE_BALANCE;
- // 如果是代付,那么就需要原路退回
- $extra_refund_price = 0;//额外抵扣金额
- if($wallet_type == UserWalletService::WALLET_TYPE_BALANCE){
- //判断是否有卡券插件
- if (MallAddons::isInstall($refund->mall_id, AddonsEnum::ADDONS_NAME_CARD_COUPONS)) {
- $card_refund_price = $refund->refund_price - $item->getRefundFee($params, $refund);
- $extra_refund_price = CardCouponsScoreGive::setOrderRefund([
- 'refund_price' => $card_refund_price,
- 'trade_id' => $item->getTradeId(),
- 'refund_id' => $refund->id
- ]);
- }
- }
- $insert_wallet[] = [
- 'mall_id' => $refund->mall_id,
- 'user_id' => $refundUserId,
- 'is_frozen' => false,
- 'wallet_type' => $wallet_type,// 暂定退回余额或积分
- 'money' => $refund_price,
- 'desc' => '订单售后退款-订单('.$refund->order_id.')',
- 'source_table' => OrderRefund::tableName(),
- 'source_table_id' => $refund->id,
- 'from_type' => UserWalletEnum::REFUND,
- 'capital_type' => UserWalletEnum::REFUND_ORDER,
- 'order_no' => $order->order_no,
- 'not_add_total' => false
- ];
- $refund_price += $extra_refund_price;
- } elseif(isset($tactics_collection_detail) && in_array($item->pay_type, [PayTypeEnum::HUIFUPAY, PayTypeEnum::JOINPAY])){
- // 策略支付退款,暂时先处理汇聚、汇付
- $refund_price = $item->getRefundFee($params, $refund);
- // 退款金额需要大于0 组合支付金额过小的情况下 分配子订单退款金额可能为0
- if ($refund_price < 0) continue;
- $res = \addons\TacticsPay\common\global_func\Payment::refund([
- 'id' => $refund->id,
- 'mall_id' => $refund->mall_id,
- 'refund' => $refund,
- 'params' => $params,
- 'order_no' => $order['order_no'],
- 'refund_order_no' => $refund['order_no'],
- 'payment_trade_id' => $item->getTradeId(),
- 'refund_price' => $refund_price,
- 'out_trade_no' => $out_trade_no,
- 'refund_reason' => '订单售后退款',
- 'pay_type' => $item->pay_type,
- 'order_user_id' => $orderUserId,
- ], $tactics_collection_detail);
- if ($res === false) throw new \Exception('退款失败');
- } elseif(in_array($item->pay_type,[PayTypeEnum::JOINPAY,PayTypeEnum::ALI,PayTypeEnum::JOINPAY_FAST_PAY,PayTypeEnum::WECHAT,PayTypeEnum::SANDPAY_FAST_PAY])){
- $refund_price = $item->getRefundFee($params, $refund);
- // 退款金额需要大于0 组合支付金额过小的情况下 分配子订单退款金额可能为0
- if ($refund_price > 0) {
- //原路返回
- $originUserId = $order->user_id;
- $order->user_id = $orderUserId;
- $res = Yii::$app->services->pay->refund(
- $refund->refund_price,
- $refund_price,
- $payment_trade->out_trade_no,
- $order,
- '订单售后退款',
- '',
- '',
- $item->pay_type
- );
- $order->user_id = $originUserId;
- if ($res === false) throw new \Exception('退款失败');
- }
- } elseif ($order->payment_type == PayTypeEnum::OFFLINE) {
- // 此支付方式为后台管理员直接支付不做任何处理
- } elseif (
- // 当res返回为false 说明没有相对于的退款方式
- $res = GlobalInvoke::exec(GlobalInvoke::INVOKE_ORDER_REFUND, $mallId, [
- 'id' => $refund->id,
- 'mall_id' => $refund->mall_id,
- 'refund' => $refund,
- 'params' => $params,
- 'order_no' => $order['order_no'],
- 'refund_order_no' => $refund['order_no'],
- 'payment_trade_id' => $item->getTradeId(),
- 'refund_price' => $item->getRefundFee($params, $refund),
- 'pay_type' => $item->pay_type,
- ])
- ) {
- // 当res不为空 进此判断
- list($boolean, $msg) = $res;
- if ($boolean === false) {
- $this->setError($msg);
- return false;
- }
- } else {
- }
- }
- if (MallAddons::isInstall($refund->mall_id, AddonsEnum::ADDONS_NAME_PERFORMANCE_DIVIDEND)) {
- //业绩分红奖励扣除
- $logic = new PerformanceDividendRewardLogic();
- $logic->getRefundReward($refund->order_detail_id, $refund, $data['params']['refund_pre']);
- }
- // 设置为已退款
- $payment_trade->setRefund($refund->id);
- }
- $refund->is_refund = StatusEnum::ENABLED;
- $refund->refund_at = time();
- !$payment_trade->isMixedPay() && $refund->refund_price = $payment_trade->getRefundFee($params, $refund);
- $refund->reality_refund_price = $refund->getRealityRefundPrice($payment_trade, $params);
- $order_detail_ids = array_column($order->detail,'id');
- // 订单营销扣减返还
- if(empty($order['store_id'])){
- $res = OrderMarketing::deductBack($order['id'],$order_detail_ids,[$refund['order_detail_id']],$refund->mall_id, $refundUserId,'订单退款',UserWalletEnum::REFUND,UserWalletEnum::REFUND_ORDER);
- if ($res == false) throw new Exception(OrderMarketing::getStaticError());
- }else{
- if(MallAddons::isInstall($order['mall_id'],AddonsEnum::ADDONS_NAME_STORE) && $order->order_source == AddonsEnum::ADDONS_NAME_STORE){
- $store_order = StoreOrder::findOne(['order_no'=>$order['order_no']]);
- if (!empty($store_order)) {
- $store_order_detail_ids = array_column($store_order->detail,'id');
- $store_order_detail_arr = array_column($store_order->detail,'id','main_order_detail_id');
- $store_order_detail_id = $store_order_detail_arr[$refund['order_detail_id']]??0;
- $res = StoreOrderMarketing::deductBack($store_order,$store_order_detail_ids,[$store_order_detail_id],$refund->mall_id, $refundUserId,'订单退款',UserWalletEnum::REFUND,UserWalletEnum::REFUND_ORDER);
- if ($res == false) throw new Exception(StoreOrderMarketing::getStaticError());
- }
- }
- }
- }
- // 保存步骤
- $params['payment_type'] = $order->payment_type;
- $step_status = self::saveStep($refund, $params);
- // 修改售后信息
- $refund->step_status = $step_status;
- if (!$refund->save()) throw new Exception("保存失败,msg=" . $refund->getErrorMessage());
- $trans->commit();
- //操作钱包的数据不为空时,发起操作钱包数据的异步
- if (!empty($insert_wallet)) {
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
- }
- // 触发售后统计
- if (in_array($params['step_status'], [RefundStatusEnum::STEP_4, RefundStatusEnum::STEP_6]) && empty($params['is_async'])) {
- $refund_event = ['id' =>$refund->id, 'type' => RefundTypeEnum::EVENT_FINISH];
- StatisticsHandle::execute(EventNameEnum::ORDER_REFUND, $refund_event);
- //触发订单售后完成
- $event = new OrderRefundFinishEvent($refund->mall_id);
- $data = [];
- $data['id'] = $refund->id;
- $data['source_table'] = 'order_detail';
- $data['source_table_id'] = $refund['order_detail_id'];
- $data['step_status'] = $params['step_status'];
- Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- }
- if($params['step_status']==RefundStatusEnum::STEP_2){
- Yii::error('退货申请审核通过开始');
- try {
- $send_data = [
- 'mall_id' => $order['mall_id'],
- 'user_id' => $order['user_id'],
- 'order_id' => $order['id'],
- 'refund_id' => $refund->id,
- 'created_at' => $order['created_at'],
- 'order_no' => $order['order_no'],
- 'mobile' => $order['mobile'],
- 'address' => $order['region_name'].$order['address'],
- 'receiver_name' => $order['receiver_name'],
- ];
- $obj = new WechatMessageLogic();
- $obj->orderRefundAgree($send_data);
- }catch (\Exception $e){
- Yii::error('退货申请审核通过Exception:'.$e->getMessage());
- }
- Yii::error('退货申请审核通过结束');
- }
- // 拒绝 - 退款
- if ($params['step_status'] == RefundStatusEnum::REFUSE) {
- // 设置为已拒绝
- $payment_trade->setRefuse($refund->id);
- }
- // 拒绝 - 需要处理ERP
- if ($params['step_status'] == RefundStatusEnum::REFUSE && MallAddons::isInstall($order['mall_id'],AddonsEnum::ADDONS_NAME_WANG_DIAN_TONG)) {
- (new OrderRefundRejectService())->sync($order['mall_id'], $refund->id);
- }
- // 是否需要触发更新事件
- if (!empty($params['is_trigger_update_event'])) {
- // 退款ID & 退款状态
- $event = new OrderRefundUpdateEvent($refund->mall_id);
- $data = [];
- $data['id'] = $refund->id;
- $data['step_status'] = $params['step_status'];
- Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- }
- $event = new OrderRefundChangeEvent($refund->mall_id);
- $data = [];
- $data['id'] = $refund->id;
- $data['refund_reason'] = $params['refund_reason'] ?? '';
- $data['step_status'] = $params['step_status'];
- $ifExistArr = ['is_expired', 'operator_id', 'is_admin', 'is_store', 'is_mch', 'is_aiyunuo', 'is_manual', 'admin_handler_refund'];
- foreach ($ifExistArr as $field) {
- if (!empty($params[$field])) {
- $data[$field] = $params[$field];
- }
- }
- Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- // 五洲供应链拒绝退款处理
- if (MallAddons::isInstall($refund->mall_id, AddonsEnum::ADDONS_NAME_WUZHOU_CHAIN)) {
- \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, ['order_id' => $refund->order_id], ServicesOrderService::class, 'orderExpressStatusHandle');
- }
- if ($refund_result) {
- //订单售后结果消息模板发送
- $service = new \common\logic\wechat\WechatMessageLogic();
- $refund_send_data = [
- 'user_id' => $refund->user_id,
- 'mall_id' => $refund->mall_id,
- 'order_id' => $refund->order_id,
- 'order_no' => $order->order_no,
- 'handle_time' => date('Y-m-d H:i:s', time()),
- 'result' => $refund_result ?? ''
- ];
- if ($order['store_id']) {
- //获取门店消息提醒配置
- $notice_wechat_config = \Yii::$app->services->setting->addons->get($store_order['mall_id'], AddonsEnum::ADDONS_NAME_STORE, 'notice');
- $notice_wechat = empty($notice_wechat_config['notice_wechat']) ? [] : json_decode($notice_wechat_config['notice_wechat'],true);
- $notice_wechat_template_message_value = $notice_wechat['template_message'] ?? [];
- //判断门店是否开启了用户消息通知
- if (!$notice_wechat['is_logging'] || empty($notice_wechat_template_message_value[StoreEnum::WECHAT_TEMPLATE_ORDER_REFUND_RESULT]['tempid'])) {
- //门店没配置 不发送
- return $refund;
- }
- $refund_send_data['template_id'] = $notice_wechat_template_message_value[StoreEnum::WECHAT_TEMPLATE_ORDER_REFUND_RESULT]['tempid'];
- }
- //发送售后结果消息模板
- $service->orderRefund($refund_send_data);
- }
- return $refund;
- } catch (Exception $e) {
- $trans->rollBack();
- $this->setError($e->getMessage() . $e->getFile() . $e->getLine());
- return false;
- }
- }
- /**
- * 保存步骤
- * @Author: lun
- * @DateTime: 2021/10/11 0011 15:55
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $refund
- * @param $stepStatus
- * @param array $params
- */
- public static function saveStep($refund, $params = [])
- {
- $return_address = '';
- if (!empty($params['address'])) {
- $return_address = $params['address']['address'] . ' ' . $params['address']['consignee'] . ' ' . $params['address']['mobile'];
- }
- $step_text = RefundStatusEnum::getStepStatusText($params['step_status']);
- $payment_map = PayTypeEnum::getMap();
- switch ($params['step_status']) {
- case RefundStatusEnum::STEP_2:
- $content = [
- $step_text['desc'],
- '退货地址:' . $return_address
- ];
- break;
- case RefundStatusEnum::STEP_4:
- $content = [
- $step_text['desc'],
- '申请退款金额:¥' . $refund->refund_price,
- '实际退款金额:¥' . $refund->reality_refund_price,
- '退款方式:' . $payment_map[$params['payment_type']],
- ];
- break;
- case RefundStatusEnum::STEP_6:
- $content = [
- $step_text['desc'],
- '申请退款金额:¥' . $refund->refund_price,
- '实际退款金额:¥' . $refund->reality_refund_price,
- '退款方式:' . $payment_map[$params['payment_type']],
- ];
- break;
- case RefundStatusEnum::STEP_8:
- $content = [
- $step_text['desc'],
- '退货地址:' . $return_address
- ];
- break;
- case RefundStatusEnum::STEP_10:
- $content = [
- $step_text['desc'],
- '物流公司:' . $refund->saler_express,
- '物流编号:' . $refund->saler_express_no,
- ];
- break;
- case RefundStatusEnum::STEP_NEGATIVE_1:
- case RefundStatusEnum::STEP_NEGATIVE_2:
- $content = [
- $step_text['desc'],
- '拒绝理由:' . $params['refund_reason'] ?? '',
- ];
- break;
- }
- $step = new OrderRefundStep();
- $step->order_refund_id = $refund->id;
- $step->role = $step_text['role'];
- $step->content = Json::encode($content);
- $step->step_num = RefundStatusEnum::getStepNumByStatus($params['step_status']);
- $step->step_status = $params['step_status'];
- if (!$step->save()) throw new Exception("退款步骤保存失败,msg=" . $refund->getErrorMessage());
- return $params['step_status'];
- }
- /**
- * 商家拒绝售后(暂供应链订单使用)
- *
- * @param integer $mall_id
- * @param integer $id
- * @param string $reason
- * @return void
- */
- public static function refuseRefundForChain(int $mall_id, int $id, string $reason = '拒绝售后')
- {
- // 售后订单
- $refund = OrderRefund::find()->where(['mall_id' => $mall_id, 'id' => $id])->one();
- if ($refund->isRefundFinish()) throw new Exception('当前订单已售后');
- $refund->refund_status = RefundStatusEnum::FINISH;
- // 自动维护主订单
- OrderDetail::updateAll(
- [
- 'is_feedback' => OrderStatusEnum::getIsFeedbackStatus(RefundStatusEnum::STEP_NEGATIVE_1),
- 'updated_at' => time()
- ],
- ['id' => $refund->order_detail_id]
- );
- $order = Order::getOne([['id' => $refund->order_id]]);
- $order->is_feedback = OrderStatusEnum::getIsFeedbackStatus(RefundStatusEnum::STEP_NEGATIVE_1);
- $order->save();
- // 更新组合支付中,订单退款状态
- $payment_trade_order_model = PaymentTradeOrder::findOne(['order_no' => $order->order_no, 'is_pay' => 1]);
- $payment_trade_model = PaymentTrade::findOne(['id' => $payment_trade_order_model['trade_id']]);
- if ($payment_trade_model && $payment_trade_model->isMixedPay()) {
- PaymentTradeItemRefund::updateAll(['refund_status' => PaymentTradeItemRefund::REFUSE, 'updated_at' => time()], ['refund_id' => $id]);
- }
- // 保存步骤
- $step_status = self::saveStep($refund, [
- 'payment_type' => $order->payment_type,
- 'address' => [
- 'address' => '',
- 'consignee' => '',
- 'mobile' => '',
- ],
- 'step_status' => RefundStatusEnum::STEP_NEGATIVE_1,
- 'refund_reason' => $reason,
- ]);
- // 修改售后信息
- $refund->step_status = $step_status;
- if (!$refund->save()) throw new Exception("保存失败,msg=" . $refund->getErrorMessage());
- // 拒绝 - 需要处理ERP
- if (MallAddons::isInstall($order['mall_id'],AddonsEnum::ADDONS_NAME_WANG_DIAN_TONG)) {
- (new OrderRefundRejectService())->sync($order['mall_id'], $refund->id);
- }
- $event = new OrderRefundChangeEvent($refund->mall_id);
- $data = [];
- $data['id'] = $refund->id;
- $data['step_status'] = RefundStatusEnum::STEP_NEGATIVE_1;
- Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- }
- /**
- * 商家拒绝售后(暂供应链订单使用)
- *
- * @param integer $mall_id
- * @param integer $id
- * @param string $reason
- * @return void
- */
- public static function refuseRefundForChainQijuhe(int $mall_id, int $id, string $reason = '拒绝售后')
- {
- // 售后订单
- $refund = OrderRefund::find()->where(['mall_id' => $mall_id, 'order_detail_id' => $id])->one();
- if ($refund->isRefundFinish()) throw new Exception('当前订单已售后');
- $refund->refund_status = RefundStatusEnum::FINISH;
- // 自动维护主订单
- OrderDetail::updateAll(
- [
- 'is_feedback' => OrderStatusEnum::getIsFeedbackStatus(RefundStatusEnum::STEP_NEGATIVE_1),
- 'updated_at' => time()
- ],
- ['id' => $refund->order_detail_id]
- );
- $order = Order::getOne([['id' => $refund->order_id]]);
- $order->is_feedback = OrderStatusEnum::getIsFeedbackStatus(RefundStatusEnum::STEP_NEGATIVE_1);
- $order->save();
- // 更新组合支付中,订单退款状态
- $payment_trade_order_model = PaymentTradeOrder::findOne(['order_no' => $order->order_no, 'is_pay' => 1]);
- $payment_trade_model = PaymentTrade::findOne(['id' => $payment_trade_order_model['trade_id']]);
- if ($payment_trade_model && $payment_trade_model->isMixedPay()) {
- PaymentTradeItemRefund::updateAll(['refund_status' => PaymentTradeItemRefund::REFUSE, 'updated_at' => time()], ['refund_id' => $id]);
- }
- // 保存步骤
- $step_status = self::saveStep($refund, [
- 'payment_type' => $order->payment_type,
- 'address' => [
- 'address' => '',
- 'consignee' => '',
- 'mobile' => '',
- ],
- 'step_status' => RefundStatusEnum::STEP_NEGATIVE_1,
- 'refund_reason' => $reason,
- ]);
- // 修改售后信息
- $refund->step_status = $step_status;
- if (!$refund->save()) throw new Exception("保存失败,msg=" . $refund->getErrorMessage());
- // 拒绝 - 需要处理ERP
- if (MallAddons::isInstall($order['mall_id'],AddonsEnum::ADDONS_NAME_WANG_DIAN_TONG)) {
- (new OrderRefundRejectService())->sync($order['mall_id'], $refund->id);
- }
- $event = new OrderRefundChangeEvent($refund->mall_id);
- $data = [];
- $data['id'] = $refund->id;
- $data['step_status'] = RefundStatusEnum::STEP_NEGATIVE_1;
- Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- }
- public static function getOrderCommissionData($insert_wallet = [], $data = [], $capitalType = 'commission', $refund = []){
- // $wallet_type = $params['wallet_type'];
- CapitalLog::$capitalType = "{$capitalType}";
- $list = CapitalLog::getList($data['condition'],0);
- $refund_pre = $data['params']['refund_pre'];
- if ($capitalType === 'score') {
- $refund_pre = $data['params']['score_pre'];
- }
- // print_r($list);exit;
- if (!empty($list)) {
- foreach ($list as $k => $val) {
- $score_refund_price = $val['change_num']*($refund_pre/100) * -1;//处理为负数
- $score_refund_price = bcmul($score_refund_price, 1, 2);
- //admin_hander_refund 为后台主动退款时
- $insert_wallet[] = [
- 'mall_id' => $refund->mall_id,
- 'user_id' => $val['user_id'],
- 'is_frozen' => false,
- 'wallet_type' => $capitalType,// 暂定退回积分
- 'money' => $score_refund_price,
- 'desc' => '后台主动退款-订单('.$refund->order_id.')',
- 'source_table' => OrderRefund::tableName(),
- 'source_table_id' => $refund->id,
- 'from_type' => UserWalletEnum::REFUND,
- 'capital_type' => UserWalletEnum::REFUND_ORDER,
- 'order_no' => $refund->order_no,
- 'not_add_total' => true,
- 'admin_handler_refund' => $data['params']['admin_handler_refund'] ? $data['params']['admin_handler_refund'] : '',
- ];//写入积分操作
- }
- }
- return $insert_wallet;
- }
- public static function getOrderDigital($data, $refund)
- {
- //数字币
- $condition = [
- 'where' => [
- ['source_table' => ['order_detail', OrderDetail::tableName()]],
- ['source_table_id' => $refund->order_detail_id],
- ['mall_id' => $refund->mall_id],
- ['from_type' => ['Agent', 'Area', 'CloudStock', 'Achievement', 'Distribution', 'EqualSubsidy', 'PerformanceDividend', 'consume']],
- ['send_status' => DigitalLog::SEND_STATUS_NORMAL]
- ],
- ];
- $list = DigitalLog::lists($condition);
- if ($list) {
- foreach ($list as $item) {
- $price = $item['change_num'] * ($data['params']['digital_pre'] / 100) * -1;//处理为负数
- $price = bcmul($price, 1, 2);
- UserDigital::handleUserDigital($item['mall_id'], $item['user_id'], $price, false, [
- 'from_type' => UserWalletEnum::REFUND,
- 'capital_type' => UserWalletEnum::REFUND_ORDER,
- 'desc' => '后台主动退款-订单(' . $refund->order_id . ')',
- ]);
- }
- }
- return true;
- }
- }
|