''], [['desc'], 'trim'], [['type', 'desc', 'order_detail_id'], 'required'], [['type',], 'in', 'range' => [1, 2]], [['pic_list',], 'string'], [['stbz_apply_data',], 'safe'], ]; } public function save() { if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } $order_detail_id = Json::decode(post_params('order_detail_id')); if (!$order_detail_id) { return [ 'code' => 1, 'msg' => '参数错误', ]; } $order_detail = OrderDetail::findOne([ 'id' => $order_detail_id[0], 'is_delete' => 0, ]); $order = Order::findOne([ 'id' => $order_detail->order_id, 'is_delete' => 0, ]); $order_detail_info = OrderDetail::find() ->where(['id' => $order_detail_id]) ->select('id, num')->asArray()->all(); $order_detail_id = []; foreach ($order_detail_info as $order_detail_item) { $cancel_num = OrderGoodsCancel::find()->where(['order_detail_id' => $order_detail_item['id'], 'status' => [ OrderGoodsCancel::STATUS_PASS, OrderGoodsCancel::STATUS_PAY, OrderGoodsCancel::STATUS_PAY_FAIL ]])->sum('num'); if ($cancel_num < $order_detail_item['num']) { $order_detail_id[] = $order_detail_item['id']; } } $refund_price = 0; if (is_array($order_detail_id) && !empty($order_detail_id)) { foreach ($order_detail_id as $detail_id) { $order_detail = OrderDetail::findOne([ 'id' => $detail_id, 'is_delete' => 0, ]); if (!$order_detail) { return [ 'code' => 1, 'msg' => '订单商品不存在,无法申请售后', ]; } $orderGoodsCancel = OrderGoodsCancel::find()->where([ 'order_id' => $order_detail->order_id, 'order_detail_id' => $detail_id, 'status' => [ OrderGoodsCancel::STATUS_PASS, OrderGoodsCancel::STATUS_PAY, OrderGoodsCancel::STATUS_PAY_FAIL ] ])->groupBy('order_detail_id')->select('SUM(num) as num, SUM(refund_price) as refund_price') ->asArray()->one(); if ($orderGoodsCancel) { $order_detail->total_price = bcsub($order_detail->total_price, $orderGoodsCancel['refund_price'], 2); $order_detail->num = bcsub($order_detail->num, $orderGoodsCancel['num']); } $order = Order::findOne([ // 秒杀订单没有详情 'id' => $order_detail->order_id, 'is_delete' => 0, ]); $notAllow = !in_array($this->user_id, [$order->user_id, $order->giving_gifts_received_user_id]); if (!$order || $notAllow) { return [ 'code' => 1, 'msg' => '订单不存在,无法申请售后', ]; } if (intval($order->is_sale) !== 0) { return [ 'code' => 1, 'msg' => '订单已经过售后期,无法申请售后', ]; } if ($order->is_pay != 1) { return [ 'code' => 1, 'msg' => '订单尚未支付,无法申请售后', ]; } if($order->share_hold_pay_up == 1){ return [ 'code' => 1, 'msg' => '股东升级订单不能退换货', ]; } $refund_price = bcadd($refund_price, $order_detail->total_price, 2); //计算立减 $orderDetail = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->asArray()->all(); $num = array_sum(array_column($orderDetail, 'num')); $rand_discount = sprintf('%.2f', (($order->rand_discount ?: 0) * (($order_detail->num ?: 1) / ($num ?: 1)))); $refund_price -= $rand_discount; } } if ($refund_price <= 0) { return [ 'code' => 1, 'msg' => '退款金额错误', ]; } $queryOrderRefund = OrderRefund::find(); $queryOrderRefund->where([ 'store_id' => $this->store_id, 'user_id' => $this->user_id, 'is_delete' => 0, ]); $existRefund = $queryOrderRefund->andWhere(['order_detail_id' => json_encode($order_detail_id, JSON_UNESCAPED_UNICODE)])->one(); if ($existRefund) { return [ 'code' => 1, 'msg' => '该商品已申请过售后,请不要重复申请', ]; } $refund = new OrderRefund(); $refund->store_id = $this->store_id; $refund->user_id = $this->user_id; $refund->order_id = $order->id; $refund->order_detail_id = Json::encode($order_detail_id); $refund->type = $this->type; $refund->order_refund_no = $this->getOrderRefundNo(); if ($order->md_id) { $refund->md_id = $order->md_id; } if ($refund->type == 1) { $refund->refund_price = $refund_price; } elseif ($refund->type == 2) { $refund->refund_price = 0; } else { return [ 'code' => 1, 'msg' => '未知售后类型' ]; } $refund->desc = $this->desc; $this->pic_list = json_decode($this->pic_list); $pic_list = []; if (is_array($this->pic_list)) { foreach ($this->pic_list as $item) { if (is_string($item)) { $pic_list[] = Html::encode(trim($item)); } } } $refund->pic_list = json_encode($pic_list, JSON_UNESCAPED_UNICODE); $refund->status = 0; $orderTransit = \app\models\OrderTransit::findOne(['order_id' => $order->id, 'is_delete' => 0]); if($orderTransit && $this->stbz_apply_data){ $form = new \app\modules\admin\models\MerchantForm(); $form->store_id = $this->store_id; $form->order_id = $orderTransit->cloud_order_id; $form->apply_data = $this->stbz_apply_data ?? []; $form->apply_data['type'] = $this->type; $form->apply_data['desc'] = $this->desc; $form->apply_data['pic_list'] = $this->pic_list; $mchOrderRefundApply = $form->mchOrderRefundApply(); if($mchOrderRefundApply['code']){ return $mchOrderRefundApply; } } if ($refund->save()) { // 标记商品申请过售后 foreach ($order_detail_id as $value) { $order_detail = OrderDetail::findOne($value); $order_detail->is_refund = 1; $order_detail->save(); } // 售后订单申请成功之后,相关操作 $form = new OrderComplete(); $form->order_id = $order->id; $form->order_type = 0; $form->form_id = $this->form_id; $form->order_refund_no = $refund->order_refund_no; $form->store_id = $order->store_id; $form->refund(); $merchant = new MerchantForm(); $merchant->order_id = $order->id; $merchant->syncMchOrderRefundStatus(1); return [ 'code' => 0, 'msg' => '售后订单提交成功', ]; } else { return [ 'code' => 1, 'msg' => implode(';', array_values($refund->firstErrors)) ]; } } private function getOrderRefundNo() { $order_refund_no = null; while (true) { $order_refund_no = date('YmdHis') . mt_rand(100000, 999999); $exist_order_refund_no = OrderRefund::find()->where(['order_refund_no' => $order_refund_no])->exists(); if (!$exist_order_refund_no) { break; } } return $order_refund_no; } }