| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- <?php
- namespace addons\Course\common\logic;
- use addons\Course\common\enums\CourseEnum;
- use addons\Course\common\models\AddonsCourseBought;
- use addons\Course\common\models\AddonsCourseOrders;
- use common\enums\AddonsEnum;
- use common\enums\PayTypeEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\globals\GlobalInvoke;
- use common\models\common\CapitalLog;
- use common\models\common\PaymentTrade;
- use common\models\common\PaymentTradeOrder;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderRefund;
- use common\traits\ErrorTrait;
- use Exception;
- use services\common\UserWalletService;
- class OrderRefuseLogic
- {
- use ErrorTrait;
- //实体店订单退单
- public function refuseOrder($params)
- {
- $trans = \Yii::$app->db->beginTransaction();
- try {
- //获取订单数据
- $order = AddonsCourseOrders::getOne([
- ['mall_id' => $params['mall_id']],
- ['id' => $params['order_id']],
- ['refund_status' => 1],
- ]);
- if (empty($order)) throw new Exception('查无此退单订单数据');
- if ($order['pay_type'] > 0 && $params['refund_price'] > 0) {
- //获取trade_order数据
- $trade_order = PaymentTradeOrder::getOne([
- ['order_type' => 'Course'],
- ['order_no' => $order['order_no']],
- ], true, [], 'id desc');
- if (empty($trade_order)) throw new Exception('查无此退单订单数据');
- //查找流水单号
- $payment_trade = PaymentTrade::findOne([
- 'id' => $trade_order['trade_id'],
- 'mall_id' => $params['mall_id'],
- 'is_pay' => StatusEnum::ENABLED
- ]);
- if (empty($payment_trade)) throw new Exception('未查询到支付记录');
- //组合支付生成流水支付退款数据
- $mallOrder = new Order();
- $mallOrder->mall_id = $params['mall_id'];
- //实例化售后信息
- $refund = new OrderRefund();
- $refund->mall_id = $params['mall_id'];
- $refund->id = $order->id;
- $refund->order_id = $order->id;
- $refund->order_no = $order->order_no;
- $refund->refund_price = $params['refund_price'];
- $refund->reality_refund_price = $params['refund_price'];
- $insert_wallet = [];
- $condition = [
- 'where'=>[
- ['source_table' => [AddonsCourseOrders::tableName(), '%addons_course_orders']],
- ['source_table_id' => $params['order_id']],
- ['mall_id' => $params['mall_id']],
- ],
- ];
- $data = [
- 'condition' => $condition,
- 'params' => $params
- ];
- $insert_wallet = self::getOrderCommissionData($insert_wallet, $data, 'commission', $order);
- $payment_trade->addRefundItem($refund, $mallOrder, CourseEnum::ADDONS_NAME);
- //系统、第三方支付方式支付
- $list = $payment_trade->getRefundFeeList($order->id, CourseEnum::ADDONS_NAME);
- foreach ($list as $item) {
- if (in_array($item->pay_type, [PayTypeEnum::BALANCE, PayTypeEnum::SCORE, 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,
- '课程订单主动退款',
- UserWalletEnum::REFUND,
- UserWalletEnum::REFUND_ORDER,
- $item->pay_type
- );
- $order->user_id = $originUserId;
- if ($res === false) throw new \Exception('退款失败');
- }
- } elseif (
- // 当res返回为false 说明没有相对于的退款方式
- $res = GlobalInvoke::exec(GlobalInvoke::INVOKE_ORDER_REFUND, $params['mall_id'], [
- '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 {
-
- }
- }
- // 设置为已退款
- $payment_trade->setRefund($refund->id, CourseEnum::ADDONS_NAME);
-
- }
- //退款成功
- $order->refund_status = 2;
- $order->refund_at = time();
- $order->order_status = -2;
- if (!$order->save()) throw new Exception('修改售后状态失败'. AddonsCourseOrders::$static_error);
- //删除用户购买课程记录
- AddonsCourseBought::updateAll(['status' => StatusEnum::DELETE, 'is_pay' => 0], ['mall_id' => $params['mall_id'], 'order_id' => $order->id, 'user_id' => $order->user_id]);
- $trans->commit();
- //操作钱包的数据不为空时,发起操作钱包数据的异步
- if (!empty($insert_wallet)) {
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
- }
- return true;
- } catch (\Exception $e) {
- $trans->rollBack();
- throw new Exception($e->getMessage());
- }
- }
- public static function getOrderCommissionData($insert_wallet = [], $data = [], $capitalType = 'commission', $order){
- // $wallet_type = $params['wallet_type'];
- CapitalLog::$capitalType = "{$capitalType}";
- $list = CapitalLog::getList($data['condition'],0);
- // print_r($list);exit;
- if (!empty($list)) {
- foreach ($list as $k => $val) {
- $score_refund_price = $val['change_num'] * ($data['params']['balance_pre'] / 100) * -1;//处理为负数
- $score_refund_price = bcmul($score_refund_price, 1, 2);
- //admin_hander_refund 为后台主动退款时
- $insert_wallet[] = [
- 'mall_id' => $order['mall_id'],
- 'user_id' => $val['user_id'],
- 'is_frozen' => false,
- 'wallet_type' => $capitalType,// 暂定退回积分
- 'money' => $score_refund_price,
- 'desc' => '后台主动退款-订单('.$order['id'].')',
- 'source_table' => AddonsCourseOrders::tableName(),
- 'source_table_id' => $order['id'],
- 'from_type' => UserWalletEnum::REFUND,
- 'capital_type' => UserWalletEnum::REFUND_ORDER,
- 'order_no' => $order['order_no'],
- 'not_add_total' => true,
- 'admin_handler_refund' => UserWalletEnum::ADMIN_HANDLER_REFUND,
- ];//写入积分操作
- }
- }
- return $insert_wallet;
- }
- }
|