6
0
Fork 0

调整砍价

release
vine_liutk 2022-04-13 10:17:13 +08:00
parent 7c278507eb
commit 82807fdfae
3 changed files with 88 additions and 13 deletions

View File

@ -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'),

View File

@ -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);
}
/**
* 获取我的粉丝总数
*

View File

@ -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;
}
/**
* 根据购物车获取商品
*