wyyl/beike/Shop/Services/CartService.php

155 lines
4.0 KiB
PHP

<?php
/**
* CartService.php
*
* @copyright 2022 opencart.cn - All Rights Reserved
* @link http://www.guangdawangluo.com
* @author Sam Chen <sam.chen@opencart.cn>
* @created 2022-01-05 10:12:57
* @modified 2022-01-05 10:12:57
*/
namespace Beike\Shop\Services;
use Beike\Repositories\CartRepo;
use Exception;
use Beike\Models\CartProduct;
use Beike\Shop\Http\Resources\CartDetail;
class CartService
{
/**
* 获取购物车商品列表
*
* @param $customer
* @param bool $selected
* @return array
*/
public static function list($customer, bool $selected = false): array
{
if (empty($customer)) {
return [];
}
$cartBuilder = CartRepo::allCartProductsBuilder($customer->id);
if ($selected) {
$cartBuilder->where('selected', true);
}
$cartItems = $cartBuilder->get();
$cartItems = $cartItems->filter(function ($item) {
$description = $item->sku->product->description ?? '';
$product = $item->product ?? null;
if (empty($description) || empty($product)) {
$item->delete();
}
return $description && $product;
});
return CartDetail::collection($cartItems)->jsonSerialize();
}
/**
* 创建购物车或者更新购物车数量
* @throws Exception
*/
public static function add($sku, int $quantity, $customer = null)
{
$customerId = $customer->id ?? 0;
$productId = $sku->product_id;
$skuId = $sku->id;
if (empty($sku) || $quantity == 0) {
return null;
}
$cart = CartProduct::query()
->where('customer_id', $customerId)
->where('product_id', $productId)
->where('product_sku_id', $skuId)
->first();
if ($cart) {
$cart->selected = true;
$cart->increment('quantity', $quantity);
} else {
$cart = CartProduct::query()->create([
'customer_id' => $customerId,
'product_id' => $productId,
'product_sku_id' => $skuId,
'quantity' => $quantity,
'selected' => true,
]);
}
return $cart;
}
/**
* 选择购物车商品
*
* @param $customer
* @param $cartIds
*/
public static function select($customer, $cartIds)
{
CartProduct::query()->where('customer_id', $customer->id)->update(['selected' => 0]);
if (empty($cartIds)) {
return;
}
CartProduct::query()->where('customer_id', $customer->id)
->whereIn('id', $cartIds)
->update(['selected' => 1]);
}
/**
* 更新购物车数量
*/
public static function updateQuantity($customer, $cartId, $quantity)
{
if (empty($cartId) || $quantity == 0) {
return;
}
CartProduct::query()->where('customer_id', $customer->id)
->where('id', $cartId)
->update(['quantity' => $quantity, 'selected' => 1]);
}
public static function delete($customer, $cartId)
{
if (empty($cartId)) {
return;
}
CartProduct::query()->where('customer_id', $customer->id)
->where('id', $cartId)
->delete();
}
/**
* 获取购物车相关数据
*
* @param array $carts
* @return array
*/
public static function reloadData(array $carts = []): array
{
if (empty($carts)) {
$carts = CartService::list(current_customer());
}
$selected = collect($carts)->where('selected', 1);
$quantity = $selected->sum('quantity');
$amount = $selected->sum('subtotal');
$data = [
'carts' => $carts,
'quantity' => $quantity,
'amount' => $amount,
'amount_format' => currency_format($amount),
];
return $data;
}
}