pull/1/head
parent
8d2048fe2a
commit
47365d35a6
@ -0,0 +1,189 @@ |
|||||||
|
<?php |
||||||
|
// +---------------------------------------------------------------------- |
||||||
|
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ] |
||||||
|
// +---------------------------------------------------------------------- |
||||||
|
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved. |
||||||
|
// +---------------------------------------------------------------------- |
||||||
|
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行 |
||||||
|
// +---------------------------------------------------------------------- |
||||||
|
// | Author: 萤火科技 <admin@yiovo.com> |
||||||
|
// +---------------------------------------------------------------------- |
||||||
|
declare (strict_types=1); |
||||||
|
|
||||||
|
namespace app\api\model; |
||||||
|
|
||||||
|
use app\api\model\Goods as GoodsModel; |
||||||
|
use app\api\model\GoodsSku as GoodsSkuModel; |
||||||
|
use app\api\service\User as UserService; |
||||||
|
use app\common\model\Cart as CartModel; |
||||||
|
use app\common\enum\goods\Status as GoodsStatusEnum; |
||||||
|
use app\common\enum\goods\GoodsType as GoodsTypeEnum; |
||||||
|
use cores\exception\BaseException; |
||||||
|
|
||||||
|
/** |
||||||
|
* 购物车管理 |
||||||
|
* Class Cart |
||||||
|
* @package app\api\model |
||||||
|
*/ |
||||||
|
class Cart extends CartModel |
||||||
|
{ |
||||||
|
/** |
||||||
|
* 隐藏字段 |
||||||
|
* @var array |
||||||
|
*/ |
||||||
|
protected $hidden = [ |
||||||
|
'is_delete', |
||||||
|
'store_id', |
||||||
|
'create_time', |
||||||
|
'update_time' |
||||||
|
]; |
||||||
|
|
||||||
|
/** |
||||||
|
* 加入购物车 |
||||||
|
* @param int $goodsId 商品ID |
||||||
|
* @param string $goodsSkuId 商品sku唯一标识 |
||||||
|
* @param int $goodsNum 商品数量 |
||||||
|
* @return bool |
||||||
|
* @throws \cores\exception\BaseException |
||||||
|
* @throws \cores\exception\BaseException |
||||||
|
* @throws \think\db\exception\DataNotFoundException |
||||||
|
* @throws \think\db\exception\DbException |
||||||
|
* @throws \think\db\exception\ModelNotFoundException |
||||||
|
*/ |
||||||
|
public function add(int $goodsId, string $goodsSkuId, int $goodsNum): bool |
||||||
|
{ |
||||||
|
// 判断是否已存在购物车记录 |
||||||
|
$detail = $this->getInfo($goodsId, $goodsSkuId, false); |
||||||
|
// 如果已存在购物车记录, 则累计商品数量 |
||||||
|
!empty($detail) && $goodsNum += $detail['goods_num']; |
||||||
|
// 验证商品的状态 |
||||||
|
$this->checkGoodsStatus($goodsId, $goodsSkuId, $goodsNum); |
||||||
|
// 获取当前用户ID |
||||||
|
$userId = UserService::getCurrentLoginUserId(); |
||||||
|
// 实例化模型 |
||||||
|
$model = $detail ?: (new static); |
||||||
|
return $model->save([ |
||||||
|
'goods_id' => $goodsId, |
||||||
|
'goods_sku_id' => $goodsSkuId, |
||||||
|
'goods_num' => $goodsNum, |
||||||
|
'user_id' => $userId, |
||||||
|
'store_id' => self::$storeId, |
||||||
|
]); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 更新购物车记录 |
||||||
|
* @param int $goodsId 商品ID |
||||||
|
* @param string $goodsSkuId 商品sku唯一标识 |
||||||
|
* @param int $goodsNum 商品数量 |
||||||
|
* @return bool |
||||||
|
* @throws BaseException |
||||||
|
* @throws \think\db\exception\DataNotFoundException |
||||||
|
* @throws \think\db\exception\DbException |
||||||
|
* @throws \think\db\exception\ModelNotFoundException |
||||||
|
*/ |
||||||
|
public function sUpdate(int $goodsId, string $goodsSkuId, int $goodsNum): bool |
||||||
|
{ |
||||||
|
// 验证商品的状态 |
||||||
|
$this->checkGoodsStatus($goodsId, $goodsSkuId, $goodsNum); |
||||||
|
// 获取购物车记录 |
||||||
|
$model = $this->getInfo($goodsId, $goodsSkuId, true); |
||||||
|
// 更新记录 |
||||||
|
return $model->save(['goods_num' => $goodsNum]); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 验证商品的状态 |
||||||
|
* @param int $goodsId 商品ID |
||||||
|
* @param string $goodsSkuId 商品sku唯一标识 |
||||||
|
* @param int $goodsNum 商品数量 |
||||||
|
* @return void |
||||||
|
* @throws BaseException |
||||||
|
*/ |
||||||
|
private function checkGoodsStatus(int $goodsId, string $goodsSkuId, int $goodsNum): void |
||||||
|
{ |
||||||
|
// 获取商品详情 |
||||||
|
$goods = GoodsModel::detail($goodsId); |
||||||
|
// 商品不存在 |
||||||
|
if (empty($goods) || $goods['is_delete']) { |
||||||
|
throwError('很抱歉, 商品信息不存在'); |
||||||
|
} |
||||||
|
// 判断商品类型 |
||||||
|
if ($goods['goods_type'] == GoodsTypeEnum::VIRTUAL) { |
||||||
|
throwError('很抱歉, 虚拟商品不支持加入购物车'); |
||||||
|
} |
||||||
|
// 商品已下架 |
||||||
|
if ($goods['status'] == GoodsStatusEnum::OFF_SALE) { |
||||||
|
throwError('很抱歉, 该商品已经下架'); |
||||||
|
} |
||||||
|
// 获取SKU信息 |
||||||
|
$skuInfo = GoodsSkuModel::detail($goodsId, $goodsSkuId); |
||||||
|
if ($skuInfo['stock_num'] < $goodsNum) { |
||||||
|
throwError('很抱歉, 该商品库存数量不足'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取购物车记录 |
||||||
|
* @param int $goodsId 商品ID |
||||||
|
* @param string $goodsSkuId 商品sku唯一标识 |
||||||
|
* @param bool $isForce |
||||||
|
* @return static|bool |
||||||
|
* @throws BaseException |
||||||
|
* @throws \think\db\exception\DataNotFoundException |
||||||
|
* @throws \think\db\exception\DbException |
||||||
|
* @throws \think\db\exception\ModelNotFoundException |
||||||
|
*/ |
||||||
|
private function getInfo(int $goodsId, string $goodsSkuId, bool $isForce = true) |
||||||
|
{ |
||||||
|
// 获取当前用户ID |
||||||
|
$userId = UserService::getCurrentLoginUserId(); |
||||||
|
// 获取购物车记录 |
||||||
|
$model = static::detail($userId, $goodsId, $goodsSkuId); |
||||||
|
if (empty($model)) { |
||||||
|
$isForce && throwError('购物车中没有该记录'); |
||||||
|
return false; |
||||||
|
} |
||||||
|
return $model; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除购物车中指定记录 |
||||||
|
* @param array $cartIds 购物车ID集, 如果为空删除所有 |
||||||
|
* @return bool |
||||||
|
* @throws BaseException |
||||||
|
*/ |
||||||
|
public function clear(array $cartIds = []): bool |
||||||
|
{ |
||||||
|
// 获取当前用户ID |
||||||
|
$userId = UserService::getCurrentLoginUserId(); |
||||||
|
// 设置更新条件 |
||||||
|
$where = [['user_id', '=', $userId]]; |
||||||
|
// 购物车ID集 |
||||||
|
!empty($cartIds) && $where[] = ['id', 'in', $cartIds]; |
||||||
|
// 更新记录 |
||||||
|
return $this->updateBase(['is_delete' => 1], $where); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取当前用户购物车商品总数量 |
||||||
|
* @return float |
||||||
|
* @throws BaseException |
||||||
|
*/ |
||||||
|
public function getCartTotal() |
||||||
|
{ |
||||||
|
if (!UserService::isLogin()) return 0; |
||||||
|
$userId = UserService::getCurrentLoginUserId(); |
||||||
|
return $this->where('user_id', '=', $userId) |
||||||
|
->where('is_delete', '=', 0) |
||||||
|
->sum('goods_num'); |
||||||
|
} |
||||||
|
|
||||||
|
public static function getCount() { |
||||||
|
if (!UserService::isLogin()) return 0; |
||||||
|
$userId = UserService::getCurrentLoginUserId(); |
||||||
|
return self::where('user_id', '=', $userId) |
||||||
|
->where('is_delete', '=', 0) |
||||||
|
->sum('goods_num'); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue