From 82807fdfae432886706a176e225e282ba25dbc8f Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Wed, 13 Apr 2022 10:17:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=A0=8D=E4=BB=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Order/OrderVerifyController.php | 3 + app/Models/User.php | 9 +- app/Services/OrderService.php | 89 ++++++++++++++++--- 3 files changed, 88 insertions(+), 13 deletions(-) diff --git a/app/Endpoint/Api/Http/Controllers/Order/OrderVerifyController.php b/app/Endpoint/Api/Http/Controllers/Order/OrderVerifyController.php index 1ef5c5ed..5da8b8ed 100644 --- a/app/Endpoint/Api/Http/Controllers/Order/OrderVerifyController.php +++ b/app/Endpoint/Api/Http/Controllers/Order/OrderVerifyController.php @@ -20,6 +20,7 @@ class OrderVerifyController extends Controller $rules = [ 'coupon_id' => ['bail', 'nullable', 'int'], 'shipping_address_id' => ['bail', 'nullable', 'int'], + 'baragain_order_id' => ['bail', 'nullable', 'int'], ]; // 快速下单 @@ -40,6 +41,7 @@ class OrderVerifyController extends Controller 'product.quantity' => '数量', 'coupon_id' => '优惠券', 'shipping_address_id' => '收货地址', + 'bargain_order_id'=> '砍价', ]); $user = $request->user(); @@ -52,6 +54,7 @@ class OrderVerifyController extends Controller $request->input('product.quantity'), $request->input('shipping_address_id'), $request->input('coupon_id'), + $request->input('bargain_order_id'), ) : $orderService->verifyShoppingCartOrder( $user, $request->input('shopping_cart'), diff --git a/app/Models/User.php b/app/Models/User.php index c99f856e..ee205250 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,7 +2,6 @@ namespace App\Models; -use App\Exceptions\BizException; use Dcat\Admin\Traits\HasDateTimeFormatter; use Illuminate\Auth\Authenticatable; use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; @@ -410,6 +409,14 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac return $this->belongsToMany(User::class, 'user_infos', 'inviter_id', 'user_id'); } + /** + * 用户的砍价单 + */ + public function bargainOrders() + { + return $this->hasMany(BargainOrder::class); + } + /** * 获取我的粉丝总数 * diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 45067009..efc34f46 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -253,8 +253,8 @@ class OrderService $sku = $product['sku']; $qty = $product['quantity']; - // 支付金额 = 商品总额 - 优惠券折扣金额- 会员折扣金额 - $totalAmount = $product['total_amount'] - $product['coupon_discount_amount'] - $product['vip_discount_amount']; + // 支付金额 = 商品总额 - 优惠券折扣金额- 会员折扣金额 - 砍价金额 + $totalAmount = $product['total_amount'] - $product['coupon_discount_amount'] - $product['vip_discount_amount'] - $product['bargain_amount']; $orderProducts[] = [ 'gift_for_sku_id' => null, @@ -277,6 +277,7 @@ class OrderService 'coupon_discount_amount' => $product['coupon_discount_amount'], 'vip_discount_amount' => $product['vip_discount_amount'], 'total_amount' => $totalAmount, + 'bargain_amount'=> $product['bargain_amount'], 'created_at' => $order->created_at, 'updated_at' => $order->updated_at, ]; @@ -466,6 +467,7 @@ class OrderService 'coupon_discount_amount' => 0, 'vip_discount_amount' => 0, 'total_amount' => 0, + 'bargain_amount'=> 0, 'created_at' => $order->created_at, 'updated_at' => $order->updated_at, 'is_gift'=> true, @@ -495,9 +497,10 @@ class OrderService * @param int $quantity * @param int|null $shippingAddressId * @param int|null $couponId + * @param int|null $bargainOrderId * @return array */ - public function verifyQuickOrder(User $user, int $skuId, int $quantity, ?int $shippingAddressId = null, ?int $couponId = null) + public function verifyQuickOrder(User $user, int $skuId, int $quantity, ?int $shippingAddressId = null, ?int $couponId = null, ?int $bargainOrderId = null) { $sku = ProductSku::online()->findOrFail($skuId); @@ -506,7 +509,7 @@ class OrderService 'quantity' => $quantity, ]; - return $this->verifyOrder($user, [$product], $shippingAddressId, $couponId); + return $this->verifyOrder($user, [$product], $shippingAddressId, $couponId, $bargainOrderId); } /** @@ -533,9 +536,10 @@ class OrderService * @param array $products * @param int|null $shippingAddressId * @param int|null $couponId + * @param int|null $bargainOrderId * @return array */ - protected function verifyOrder(User $user, array $products, ?int $shippingAddressId = null, ?int $couponId = null): array + protected function verifyOrder(User $user, array $products, ?int $shippingAddressId = null, ?int $couponId = null, ?int $bargainOrderId = null): array { // 获取收货地址 $shippingAddress = $this->getShippingAddress($user, $shippingAddressId); @@ -547,7 +551,12 @@ class OrderService $coupon = $user->coupons()->onlyAvailable()->findOrFail($couponId); } - $mapProducts = $this->mapProducts($user, $products, $coupon); + $bargainOrder = null; + if ($bargainOrderId) { + $bargainOrder = $user->bargainOrders()->findOrFail($bargainOrderId); + } + + $mapProducts = $this->mapProducts($user, $products, $coupon, $bargainOrder); // 是否支持配送 $shippingSupported = true; @@ -568,9 +577,10 @@ class OrderService $vipDiscountAmount, $couponDiscountAmount, $salesValue, + $bargainAmount, ) = $this->calculateFees($mapProducts); - $totalAmount = $productsTotalAmount - $couponDiscountAmount - $vipDiscountAmount; + $totalAmount = $productsTotalAmount - $couponDiscountAmount - $vipDiscountAmount - $bargainAmount; if ($totalAmount < 0) { $totalAmount = 0; @@ -593,6 +603,7 @@ class OrderService 'vip_discount_amount' => trim_trailing_zeros(bcdiv($vipDiscountAmount, 100, 2)), // 会员折扣金额 'coupon_discount_amount' => trim_trailing_zeros(bcdiv($couponDiscountAmount, 100, 2)), // 优惠券折扣金额 'total_amount' => trim_trailing_zeros(bcdiv($totalAmount, 100, 2)), // 实付金额 + 'bargain_amount' => trim_trailing_zeros(bcdiv($bargainAmount, 100, 2)), //砍价金额 ]; } @@ -608,12 +619,14 @@ class OrderService $vipDiscountAmount = 0; $couponDiscountAmount = 0; $salesValue = 0; + $bargainAmount = 0; foreach ($products as $product) { $productsTotalAmount += $product['total_amount']; $vipDiscountAmount += $product['vip_discount_amount']; $couponDiscountAmount += $product['coupon_discount_amount']; $salesValue = bcadd($salesValue, $product['total_sales_value']); + $bargainAmount += $product['bargain_amount']; } return [ @@ -621,6 +634,7 @@ class OrderService $vipDiscountAmount, $couponDiscountAmount, $salesValue, + $bargainAmount, ]; } @@ -675,14 +689,13 @@ class OrderService * @param \App\Models\User $user * @param array $products * @param \App\Models\UserCoupon|null $coupon - * @param \App\Models\BargainOrder|null $bargainOrder * @return array * * @throws \App\Exceptions\BizException */ - protected function mapProducts(User $user, array $products, ?UserCoupon $coupon, ?BargainOrder $bargainOrder): array + protected function mapProducts(User $user, array $products, ?UserCoupon $coupon, ?BargainOrder $bargainOrder = null): array { - $_products = collect($products)->map(function ($item) use ($user, $bargainOrder) { + $_products = collect($products)->map(function ($item) use ($user) { $sku = $item['sku']; return array_merge($item, [ @@ -696,11 +709,20 @@ class OrderService 'total_amount' => $sku->sell_price * $item['quantity'], // 总销售值 'total_sales_value' => bcmul($sku->sales_value, $item['quantity'], 2), - //填入砍价金额 - 'bargain_amount'=> $bargainOrder?->bargain_price ?? 0, + //砍价金额 + 'bargain_amount' => 0, ]); }); + //处理砍价金额 + if ($bargainOrder) { + $bargainDiscountAmount = $this->getBargainDiscountAmount($bargainOrder, $_products->all()); + $_products = $_products->map(function ($item) use ($bargainDiscountAmount) { + $item['bargain_amount'] = $bargainDiscountAmount[$item['sku']->id] ?? 0; + return $item; + }); + } + if ($coupon === null) { return $_products->all(); } @@ -808,6 +830,49 @@ class OrderService return $amounts; } + /** + * + */ + protected function getBargainDiscountAmount(BargainOrder $bargainOrder, array $products): array + { + // 砍价的商品 + $amounts = []; + foreach ($products as $item) { + $sku = $item['sku']; + + $amount = $item['total_amount'] - $item['vip_discount_amount']; + + // 仅保留商品真实总额大于0的商品 + if ($amount > 0) { + $amounts[$sku->id] = $amount; + } + } + + // 全部商品总额 + $totalAmount = array_sum($amounts); + + + $bargainAmount = $bargainOrder->bargain_price ?? 0; + + // 待计算优惠的商品总数 + $i = count($amounts); + + foreach ($amounts as &$amount) { + $i--; + + if ($i > 0) { + $amount = (int) bcdiv(bcmul($bargainAmount, $amount, 0), $totalAmount, 2); + $bargainAmount -= $amount; + } else { + $amount = $bargainAmount; + } + + unset($amount); + } + + return $amounts; + } + /** * 根据购物车获取商品 *