diff --git a/app/Http/Controllers/User/OrderController.php b/app/Http/Controllers/User/OrderController.php index 83f80a74..e5cc7a92 100755 --- a/app/Http/Controllers/User/OrderController.php +++ b/app/Http/Controllers/User/OrderController.php @@ -63,69 +63,10 @@ class OrderController extends Controller ]); } - private function isNotCompleteOrderByUserId($userId) - { - $order = Order::whereIn('status', [0, 1]) - ->where('user_id', $userId) - ->first(); - if (!$order) { - return false; - } - return true; - } - - // surplus value - private function getSurplusValue(User $user, Order $order) - { - if ($user->expired_at === NULL) { - $this->getSurplusValueByOneTime($user, $order); - } else { - $this->getSurplusValueByCycle($user, $order); - } - } - - private function getSurplusValueByOneTime(User $user, Order $order) - { - $plan = Plan::find($user->plan_id); - $trafficUnitPrice = $plan->onetime_price / $plan->transfer_enable; - if ($user->discount && $trafficUnitPrice) { - $trafficUnitPrice = $trafficUnitPrice - ($trafficUnitPrice * $user->discount / 100); - } - $notUsedTrafficPrice = $plan->transfer_enable - (($user->u + $user->d) / 1073741824); - $result = $trafficUnitPrice * $notUsedTrafficPrice; - $orderModel = Order::where('user_id', $user->id)->where('status', 3); - $order->surplus_amount = $result > 0 ? $result : 0; - $order->surplus_order_ids = json_encode(array_map(function ($v) { return $v['id'];}, $orderModel->get()->toArray())); - } - - private function getSurplusValueByCycle(User $user, Order $order) - { - $strToMonth = [ - 'month_price' => 1, - 'quarter_price' => 3, - 'half_year_price' => 6, - 'year_price' => 12 - ]; - $orderModel = Order::where('user_id', $user->id)->where('status', 3); - - $totalValue = $orderModel->sum('total_amount') + $orderModel->sum('balance_amount'); - if ($totalValue <= 0) { - return; - } - $totalMonth = 0; - foreach ($orderModel->get() as $item) { - $totalMonth = $totalMonth + $strToMonth[$item->cycle]; - } - $unitPrice = $totalValue / $totalMonth; - $remainingMonth = ($user->expired_at - time()) / 2678400; - $result = $unitPrice * $remainingMonth; - $order->surplus_amount = $result > 0 ? $result : 0; - $order->surplus_order_ids = json_encode(array_map(function ($v) { return $v['id'];}, $orderModel->get()->toArray())); - } - public function save(OrderSave $request) { - if ($this->isNotCompleteOrderByUserId($request->session()->get('id'))) { + $userService = new UserService(); + if ($userService->isNotCompleteOrderByUserId($request->session()->get('id'))) { abort(500, '存在未付款订单,请取消后再试'); } @@ -148,15 +89,15 @@ class OrderController extends Controller abort(500, '该订阅周期无法进行购买,请选择其他周期'); } - DB::beginTransaction(); $order = new Order(); + $orderService = new OrderService($order); $order->user_id = $request->session()->get('id'); $order->plan_id = $plan->id; $order->cycle = $request->input('cycle'); $order->trade_no = Helper::guid(); $order->total_amount = $plan[$request->input('cycle')]; - // coupon start + if ($request->input('coupon_code')) { $couponService = new CouponService($request->input('coupon_code')); if (!$couponService->use($order)) { @@ -164,43 +105,11 @@ class OrderController extends Controller abort(500, '优惠券使用失败'); } } - // coupon complete - // discount start - if ($user->discount) { - $order->discount_amount = $order->discount_amount + ($order->total_amount * ($user->discount / 100)); - } - // discount end - $order->total_amount = $order->total_amount - $order->discount_amount; - // renew and change subscribe process - if ($user->plan_id !== NULL && $order->plan_id !== $user->plan_id) { - if (!(int)config('v2board.plan_change_enable', 1)) abort(500, '目前不允许更改订阅,请联系客服或提交工单'); - $order->type = 3; - $this->getSurplusValue($user, $order); - if ($order->surplus_amount >= $order->total_amount) { - $order->refund_amount = $order->surplus_amount - $order->total_amount; - $order->total_amount = 0; - } else { - $order->total_amount = $order->total_amount - $order->surplus_amount; - } - } else if ($user->expired_at > time() && $order->plan_id == $user->plan_id) { - $order->type = 2; - } else { - $order->type = 1; - } - // invite process - if ($user->invite_user_id && $order->total_amount > 0) { - $order->invite_user_id = $user->invite_user_id; - $commissionFirstTime = (int)config('v2board.commission_first_time_enable', 1); - if (!$commissionFirstTime || ($commissionFirstTime && !Order::where('user_id', $user->id)->where('status', 3)->first())) { - $inviter = User::find($user->invite_user_id); - if ($inviter && $inviter->commission_rate) { - $order->commission_balance = $order->total_amount * ($inviter->commission_rate / 100); - } else { - $order->commission_balance = $order->total_amount * (config('v2board.invite_commission', 10) / 100); - } - } - } - // use balance + + $orderService->setVipDiscount($user); + $orderService->setOrderType($user); + $orderService->setInvite($user); + if ($user->balance && $order->total_amount > 0) { $remainingBalance = $user->balance - $order->total_amount; $userService = new UserService(); diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 55acd56d..53c94815 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -3,6 +3,8 @@ namespace App\Services; use App\Models\Order; +use App\Models\Plan; +use App\Models\User; use Illuminate\Support\Facades\DB; class OrderService @@ -38,4 +40,99 @@ class OrderService { } + + public function setOrderType(User $user) + { + $order = $this->order; + if ($user->plan_id !== NULL && $order->plan_id !== $user->plan_id) { + if (!(int)config('v2board.plan_change_enable', 1)) abort(500, '目前不允许更改订阅,请联系客服或提交工单'); + $order->type = 3; + $this->getSurplusValue($user, $order); + if ($order->surplus_amount >= $order->total_amount) { + $order->refund_amount = $order->surplus_amount - $order->total_amount; + $order->total_amount = 0; + } else { + $order->total_amount = $order->total_amount - $order->surplus_amount; + } + } else if ($user->expired_at > time() && $order->plan_id == $user->plan_id) { + $order->type = 2; + } else { + $order->type = 1; + } + } + + public function setVipDiscount(User $user) + { + $order = $this->order; + if ($user->discount) { + $order->discount_amount = $order->discount_amount + ($order->total_amount * ($user->discount / 100)); + } + $order->total_amount = $order->total_amount - $order->discount_amount; + } + + public function setInvite(User $user) + { + $order = $this->order; + if ($user->invite_user_id && $order->total_amount > 0) { + $order->invite_user_id = $user->invite_user_id; + $commissionFirstTime = (int)config('v2board.commission_first_time_enable', 1); + if (!$commissionFirstTime || ($commissionFirstTime && !Order::where('user_id', $user->id)->where('status', 3)->first())) { + $inviter = User::find($user->invite_user_id); + if ($inviter && $inviter->commission_rate) { + $order->commission_balance = $order->total_amount * ($inviter->commission_rate / 100); + } else { + $order->commission_balance = $order->total_amount * (config('v2board.invite_commission', 10) / 100); + } + } + } + } + + private function getSurplusValue(User $user, Order $order) + { + if ($user->expired_at === NULL) { + $this->getSurplusValueByOneTime($user, $order); + } else { + $this->getSurplusValueByCycle($user, $order); + } + } + + + private function getSurplusValueByOneTime(User $user, Order $order) + { + $plan = Plan::find($user->plan_id); + $trafficUnitPrice = $plan->onetime_price / $plan->transfer_enable; + if ($user->discount && $trafficUnitPrice) { + $trafficUnitPrice = $trafficUnitPrice - ($trafficUnitPrice * $user->discount / 100); + } + $notUsedTrafficPrice = $plan->transfer_enable - (($user->u + $user->d) / 1073741824); + $result = $trafficUnitPrice * $notUsedTrafficPrice; + $orderModel = Order::where('user_id', $user->id)->where('status', 3); + $order->surplus_amount = $result > 0 ? $result : 0; + $order->surplus_order_ids = json_encode(array_map(function ($v) { return $v['id'];}, $orderModel->get()->toArray())); + } + + private function getSurplusValueByCycle(User $user, Order $order) + { + $strToMonth = [ + 'month_price' => 1, + 'quarter_price' => 3, + 'half_year_price' => 6, + 'year_price' => 12 + ]; + $orderModel = Order::where('user_id', $user->id)->where('status', 3); + + $totalValue = $orderModel->sum('total_amount') + $orderModel->sum('balance_amount'); + if ($totalValue <= 0) { + return; + } + $totalMonth = 0; + foreach ($orderModel->get() as $item) { + $totalMonth = $totalMonth + $strToMonth[$item->cycle]; + } + $unitPrice = $totalValue / $totalMonth; + $remainingMonth = ($user->expired_at - time()) / 2678400; + $result = $unitPrice * $remainingMonth; + $order->surplus_amount = $result > 0 ? $result : 0; + $order->surplus_order_ids = json_encode(array_map(function ($v) { return $v['id'];}, $orderModel->get()->toArray())); + } } diff --git a/app/Services/UserService.php b/app/Services/UserService.php index 08889ba2..9050fb16 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -2,6 +2,7 @@ namespace App\Services; +use App\Models\Order; use App\Models\User; class UserService @@ -63,4 +64,15 @@ class UserService } return true; } + + public function isNotCompleteOrderByUserId(int $userId):bool + { + $order = Order::whereIn('status', [0, 1]) + ->where('user_id', $userId) + ->first(); + if (!$order) { + return false; + } + return true; + } }