170 lines
5.1 KiB
PHP
170 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace Beike\Shop\Http\Controllers;
|
|
|
|
use Beike\Models\ProductSku;
|
|
use Beike\Shop\Http\Requests\CartRequest;
|
|
use Beike\Shop\Services\CartService;
|
|
use Beike\Shop\Services\CheckoutService;
|
|
use Illuminate\Contracts\View\View;
|
|
use Illuminate\Http\Request;
|
|
|
|
class CartController extends Controller
|
|
{
|
|
/**
|
|
* @return View
|
|
*/
|
|
public function index(): View
|
|
{
|
|
$data = [
|
|
'data' => CartService::reloadData(),
|
|
];
|
|
$data['totals'] = $this->getOrderMoney($data['data']['carts']);
|
|
$data = hook_filter('cart.index.data', $data);
|
|
|
|
return view('cart/cart', $data);
|
|
}
|
|
|
|
/**
|
|
* 选中购物车商品
|
|
*
|
|
* POST /carts/select {cart_ids:[1, 2]}
|
|
* @param Request $request
|
|
* @return array
|
|
*/
|
|
public function select(Request $request): array
|
|
{
|
|
$cartIds = $request->get('cart_ids');
|
|
$customer = current_customer();
|
|
CartService::select($customer, $cartIds);
|
|
|
|
$data = CartService::reloadData();
|
|
$data['totals'] = $this->getOrderMoney($data['carts']);
|
|
|
|
$data = hook_filter('cart.select.data', $data);
|
|
|
|
return json_success(trans('common.updated_success'), $data);
|
|
}
|
|
|
|
/**
|
|
* POST /carts {sku_id:1, quantity: 2}
|
|
* 创建购物车
|
|
*
|
|
* @param CartRequest $request
|
|
* @return mixed
|
|
* @throws \Exception
|
|
*/
|
|
public function store(CartRequest $request)
|
|
{
|
|
try {
|
|
$skuId = $request->sku_id;
|
|
$quantity = $request->quantity ?? 1;
|
|
$buyNow = (bool) $request->buy_now ?? false;
|
|
$customer = current_customer();
|
|
// 多规格批量加入购物车处理
|
|
if(is_int($skuId)){
|
|
// 非多规格下单
|
|
$sku = ProductSku::query()->findOrFail($skuId);
|
|
$cart = CartService::add($sku, $quantity, $customer);
|
|
$cartIds = [$cart->id];
|
|
}else{
|
|
// 多规格下单
|
|
$skuList = array_values(json_decode($skuId,TRUE));
|
|
foreach($skuList as $item){
|
|
if((int)$item['quantity'] > 0){
|
|
$sku = ProductSku::query()->findOrFail($item['id']);
|
|
$cart = CartService::add($sku, $item['quantity'], $customer);
|
|
$cartIds[] = $cart->id;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ($buyNow) CartService::select($customer, $cartIds);
|
|
$cart = hook_filter('cart.store.data', $cart);
|
|
return json_success(trans('shop/carts.added_to_cart'), $cart);
|
|
} catch (\Exception $e) {
|
|
return json_fail($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* PUT /carts/{cart_id} {sku_id:1, quantity: 2}
|
|
* @param CartRequest $request
|
|
* @param $cartId
|
|
* @return array
|
|
*/
|
|
public function update(CartRequest $request, $cartId): array
|
|
{
|
|
// return json_fail("错误");
|
|
try {
|
|
$customer = current_customer();
|
|
$quantity = (int) $request->get('quantity');
|
|
CartService::updateQuantity($customer, $cartId, $quantity);
|
|
|
|
$data = CartService::reloadData();
|
|
$data['totals'] = $this->getOrderMoney($data['carts']);
|
|
|
|
$data = hook_filter('cart.update.data', $data);
|
|
|
|
return json_success(trans('common.updated_success'), $data);
|
|
} catch (\Exception $e) {
|
|
return json_fail($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* DELETE /carts/{cart_id}
|
|
* @param Request $request
|
|
* @param $cartId
|
|
* @return array
|
|
*/
|
|
public function destroy(Request $request, $cartId): array
|
|
{
|
|
$customer = current_customer();
|
|
CartService::delete($customer, $cartId);
|
|
|
|
$data = CartService::reloadData();
|
|
|
|
$data = hook_filter('cart.destroy.data', $data);
|
|
|
|
return json_success(trans('common.deleted_success'), $data);
|
|
}
|
|
|
|
/**
|
|
* 右上角购物车
|
|
* @return mixed
|
|
*/
|
|
public function miniCart()
|
|
{
|
|
$carts = CartService::list(current_customer());
|
|
$reloadData = CartService::reloadData($carts);
|
|
|
|
$data['html'] = view('cart/mini', $reloadData)->render();
|
|
$data['quantity'] = $reloadData['quantity'];
|
|
$data['quantity_all'] = $reloadData['quantity_all'];
|
|
|
|
$data = hook_filter('cart.mini_cart.data', $data);
|
|
|
|
return json_success(trans('common.success'), $data);
|
|
}
|
|
/**
|
|
* Common: 实时计算购物车订单金额
|
|
* Author: wu-hui
|
|
* Time: 2023/08/18 13:56
|
|
* @param $carts
|
|
* @return mixed
|
|
* @throws \Exception
|
|
*/
|
|
public function getOrderMoney($carts){
|
|
$carts = collect($carts)->where('selected', 1)->toArray();
|
|
$checkoutService = new CheckoutService();
|
|
$totalClass = hook_filter('service.checkout.total_service','Beike\Shop\Services\TotalService');
|
|
$checkoutService->totalService = (new $totalClass($checkoutService->cart,$carts));
|
|
$checkoutData = $checkoutService->checkoutData();
|
|
|
|
return $checkoutData['totals'];
|
|
}
|
|
|
|
}
|