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; } }