253 lines
8.0 KiB
PHP
253 lines
8.0 KiB
PHP
<?php
|
||
|
||
namespace App\Api\Controllers;
|
||
|
||
use App\Api\Resources\AddressResource;
|
||
use App\Api\Resources\CartResource;
|
||
use App\Models\Cart;
|
||
use App\Models\Freight;
|
||
use App\Models\GoodsParams;
|
||
use App\User;
|
||
use Illuminate\Http\Request;
|
||
use App\Api\Resources\CartSellerResource;
|
||
use App\Models\Seller;
|
||
use RuLong\Area\Models\UserAddress;
|
||
|
||
class CartController extends Controller
|
||
{
|
||
public function __construct()
|
||
{
|
||
// $this->middleware('auth.api');
|
||
// $this->user = \Auth::guard('api')->user();
|
||
// $this->uid = \Auth::guard('api')->id();
|
||
$this->user = User::find(824);
|
||
$this->uid = 824;
|
||
}
|
||
|
||
/**
|
||
* 小程序,购物车页面数据接口
|
||
*
|
||
* @param
|
||
* @return array
|
||
*/
|
||
public function index()
|
||
{
|
||
$lists = Cart::where('user_id', $this->uid)->orderBy('id', 'desc')->get();
|
||
$data = [];
|
||
foreach ($lists as $cart) {
|
||
if (!isset($carts[$cart->params->goods->seller_id])) {
|
||
$carts[$cart->params->goods->seller_id] = [];
|
||
}
|
||
if ($cart->params->stock < 1) {
|
||
$cart->delete();
|
||
} else {
|
||
if ($cart->number > $cart->params->stock) {
|
||
$cart->number = $cart->params->stock;
|
||
$cart->save();
|
||
}
|
||
array_push($carts[$cart->params->goods->seller_id], $cart);
|
||
}
|
||
}
|
||
|
||
|
||
foreach ($carts as $key => $seller_item) {
|
||
$seller_cart = [];
|
||
$seller_cart['seller'] = new CartSellerResource(Seller::find($key));
|
||
foreach ($seller_item as $cart_item) {
|
||
$seller_cart['goods_list'][] = new CartResource($cart_item);
|
||
}
|
||
array_push($data, $seller_cart);
|
||
}
|
||
|
||
return [
|
||
'data' => $data,
|
||
'status' => 'SUCCESS',
|
||
'status_code' => 200,
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 小程序,商品详情页,点击加入购物车请求接口
|
||
*
|
||
* @param \Illuminate\Http\Request $request
|
||
* @return array
|
||
*/
|
||
public function save(Request $request)
|
||
{
|
||
$user_id = $this->uid;
|
||
$result = Cart::where(['user_id' => $user_id, 'params_id' => $request->params_id])->first();
|
||
$params = GoodsParams::find($request->params_id);
|
||
if ($result) {
|
||
$result->number += $request->number;
|
||
$result->save();
|
||
} else {
|
||
$result = Cart::create([
|
||
'user_id' => $this->uid,
|
||
'params_id' => $request->params_id,
|
||
'goods_id' => $params->goods_id, //保存goods_id是为了下架商品时,删除购物车
|
||
'number' => $request->number,
|
||
]);
|
||
}
|
||
|
||
if ($result) {
|
||
return $this->success(['msg' => '成功加入购物车', 'cartGoodsCount' => Cart::where('user_id', $this->uid)->count()]);
|
||
} else {
|
||
return $this->failed('加入失败');
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 小程序,购物车页,点击增减商品数量请求接口
|
||
*
|
||
* @param \Illuminate\Http\Request $request
|
||
* @return array
|
||
*/
|
||
public function setnum(Request $request)
|
||
{
|
||
$cart = Cart::find($request->id);
|
||
$cart->number = $request->number;
|
||
if ($cart->save()) {
|
||
return $this->success(['msg' => '操作成功', 'number' => $cart->number]);
|
||
} else {
|
||
return $this->failed('加入失败');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 小程序,确认订单页请求的接口
|
||
*
|
||
* @param \Illuminate\Http\Request $request
|
||
* @return array
|
||
*/
|
||
public function sure(Request $request)
|
||
{
|
||
$data = array();
|
||
$carts = array();
|
||
$cart_amount = 0;
|
||
$cart_score = 0;
|
||
$cart_freight = 0;
|
||
$address = $request->addressId ? UserAddress::find($request->addressId) : null;
|
||
foreach (explode(',', $request->cart_ids) as $key => $value) {
|
||
$cart = Cart::find($value);
|
||
if ($cart) {
|
||
if ($cart->params->stock < 1) {
|
||
$cart->delete();
|
||
} else {
|
||
if ($cart->number < $cart->params->stock) {
|
||
if (!isset($carts[$cart->params->goods->seller_id])) {
|
||
$carts[$cart->params->goods->seller_id] = [];
|
||
}
|
||
array_push($carts[$cart->params->goods->seller_id], $cart);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
foreach ($carts as $key => $seller_item) {
|
||
$seller_cart = [];
|
||
$seller_cart['seller'] = new CartSellerResource(Seller::find($key));
|
||
$seller_cart['express'] = ['type1' => 1, 'type2' => 0]; //配送方式,type1-快递,type2-自取
|
||
$seller_cart['remark'] = '';//买家留言
|
||
//获取店铺运费、金额、积分小计
|
||
$seller_total = self::sellerTotal($key, $seller_item, $address);
|
||
|
||
//格式化单店铺小计
|
||
foreach ($seller_total as $k => $v) {
|
||
$seller_cart['total'][$k] = number_format($v, 2);
|
||
$seller_cart['totalOriginal'][$k] = $v;
|
||
|
||
}
|
||
|
||
//计算全部店铺总和
|
||
$cart_amount += $seller_total['amount'];
|
||
$cart_score += $seller_total['score'];
|
||
$cart_freight += $seller_total['freightPrice'];
|
||
|
||
foreach ($seller_item as $cart_item) {
|
||
$seller_cart['goods_list'][] = new CartResource($cart_item);
|
||
}
|
||
array_push($data, $seller_cart);
|
||
}
|
||
|
||
return [
|
||
'data' => [
|
||
'cartData' => $data,
|
||
'cartTotal' => [
|
||
'amount' => number_format($cart_amount, 2),
|
||
'score' => number_format($cart_score, 2),
|
||
'freight' => number_format($cart_freight, 2),
|
||
'freightOriginal' => $cart_freight,
|
||
'orderPrice' => number_format($cart_amount + $cart_freight, 2),
|
||
'orderPriceOriginal' => $cart_amount + $cart_freight
|
||
|
||
],
|
||
'address' => $address ? new AddressResource($address) : []
|
||
],
|
||
|
||
'status' => 'SUCCESS',
|
||
'status_code' => 200,
|
||
];
|
||
|
||
}
|
||
|
||
/**
|
||
* 计算店铺商品金额、运费金额、积分金额总和
|
||
*
|
||
* @param
|
||
* @return array
|
||
*/
|
||
private function sellerTotal($seller_id, $seller_item, $address = null)
|
||
{
|
||
$amount = 0;
|
||
$freightPrice = \Params::get('default_freight');
|
||
$heavy = 0;
|
||
$score = 0;
|
||
foreach ($seller_item as $cart_item) {
|
||
$params = GoodsParams::find($cart_item->params_id);
|
||
$amount += $cart_item->number * $params->price;
|
||
if ($params->is_free_freight == 0) {
|
||
$heavy += $cart_item->number * $params->heavy;
|
||
}
|
||
$score += $cart_item->number * $params->score;
|
||
}
|
||
|
||
if ($heavy === 0) {
|
||
$freightPrice = 0; //包邮
|
||
} else {
|
||
//计算每个商户订单的运费
|
||
if (!empty($address)) {
|
||
$freight = Freight::where(['seller_id' => $seller_id, 'area_id' => $address->province->id])->first();
|
||
if ($freight) {
|
||
$freightPrice = $freight->basic;
|
||
if ($freight->heavy < $heavy) {
|
||
$freightPrice += ceil($heavy - $freight->heavy) * $freight->added;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return [
|
||
'freightPrice' => $freightPrice,
|
||
'score' => $score,
|
||
'amount' => $amount - $score,
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 小程序,购物车页面,点击删除商品请求的接口
|
||
*
|
||
* @param \Illuminate\Http\Request $request
|
||
* @return array
|
||
*/
|
||
public function delete(Cart $cart)
|
||
{
|
||
|
||
if ($cart->delete()) {
|
||
return $this->success(['msg' => '操作成功']);
|
||
} else {
|
||
return $this->failed('加入失败');
|
||
}
|
||
}
|
||
|
||
}
|