Cart.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2024 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\api\model;
  13. use app\api\model\Goods as GoodsModel;
  14. use app\api\model\GoodsSku as GoodsSkuModel;
  15. use app\api\service\User as UserService;
  16. use app\common\model\Cart as CartModel;
  17. use app\common\enum\goods\Status as GoodsStatusEnum;
  18. use cores\exception\BaseException;
  19. /**
  20. * 购物车管理
  21. * Class Cart
  22. * @package app\api\model
  23. */
  24. class Cart extends CartModel
  25. {
  26. /**
  27. * 隐藏字段
  28. * @var array
  29. */
  30. protected $hidden = [
  31. 'is_delete',
  32. 'store_id',
  33. 'create_time',
  34. 'update_time'
  35. ];
  36. /**
  37. * 加入购物车
  38. * @param int $goodsId 商品ID
  39. * @param string $goodsSkuId 商品sku唯一标识
  40. * @param int $goodsNum 商品数量
  41. * @return bool
  42. * @throws \cores\exception\BaseException
  43. * @throws \cores\exception\BaseException
  44. * @throws \think\db\exception\DataNotFoundException
  45. * @throws \think\db\exception\DbException
  46. * @throws \think\db\exception\ModelNotFoundException
  47. */
  48. public function add(int $goodsId, string $goodsSkuId, int $goodsNum): bool
  49. {
  50. // 判断是否已存在购物车记录
  51. $detail = $this->getInfo($goodsId, $goodsSkuId, false);
  52. // 如果已存在购物车记录, 则累计商品数量
  53. !empty($detail) && $goodsNum += $detail['goods_num'];
  54. // 验证商品的状态
  55. $this->checkGoodsStatus($goodsId, $goodsSkuId, $goodsNum);
  56. // 获取当前用户ID
  57. $userId = UserService::getCurrentLoginUserId();
  58. // 实例化模型
  59. $model = $detail ?: (new static);
  60. return $model->save([
  61. 'goods_id' => $goodsId,
  62. 'goods_sku_id' => $goodsSkuId,
  63. 'goods_num' => $goodsNum,
  64. 'user_id' => $userId,
  65. 'store_id' => self::$storeId,
  66. ]);
  67. }
  68. /**
  69. * 更新购物车记录
  70. * @param int $goodsId 商品ID
  71. * @param string $goodsSkuId 商品sku唯一标识
  72. * @param int $goodsNum 商品数量
  73. * @return bool
  74. * @throws BaseException
  75. * @throws \think\db\exception\DataNotFoundException
  76. * @throws \think\db\exception\DbException
  77. * @throws \think\db\exception\ModelNotFoundException
  78. */
  79. public function sUpdate(int $goodsId, string $goodsSkuId, int $goodsNum): bool
  80. {
  81. // 验证商品的状态
  82. $this->checkGoodsStatus($goodsId, $goodsSkuId, $goodsNum);
  83. // 获取购物车记录
  84. $model = $this->getInfo($goodsId, $goodsSkuId, true);
  85. // 更新记录
  86. return $model->save(['goods_num' => $goodsNum]);
  87. }
  88. /**
  89. * 验证商品的状态
  90. * @param int $goodsId 商品ID
  91. * @param string $goodsSkuId 商品sku唯一标识
  92. * @param int $goodsNum 商品数量
  93. * @return void
  94. * @throws BaseException
  95. */
  96. private function checkGoodsStatus(int $goodsId, string $goodsSkuId, int $goodsNum): void
  97. {
  98. // 获取商品详情
  99. $goods = GoodsModel::detail($goodsId);
  100. // 商品不存在
  101. if (empty($goods) || $goods['is_delete']) {
  102. throwError('很抱歉, 商品信息不存在');
  103. }
  104. // 商品已下架
  105. if ($goods['status'] == GoodsStatusEnum::OFF_SALE) {
  106. throwError('很抱歉, 该商品已经下架');
  107. }
  108. // 获取SKU信息
  109. $skuInfo = GoodsSkuModel::detail($goodsId, $goodsSkuId);
  110. if ($skuInfo['stock_num'] < $goodsNum) {
  111. throwError('很抱歉, 该商品库存数量不足');
  112. }
  113. }
  114. /**
  115. * 获取购物车记录
  116. * @param int $goodsId 商品ID
  117. * @param string $goodsSkuId 商品sku唯一标识
  118. * @param bool $isForce
  119. * @return static|bool
  120. * @throws BaseException
  121. * @throws \think\db\exception\DataNotFoundException
  122. * @throws \think\db\exception\DbException
  123. * @throws \think\db\exception\ModelNotFoundException
  124. */
  125. private function getInfo(int $goodsId, string $goodsSkuId, bool $isForce = true)
  126. {
  127. // 获取当前用户ID
  128. $userId = UserService::getCurrentLoginUserId();
  129. // 获取购物车记录
  130. $model = static::detail($userId, $goodsId, $goodsSkuId);
  131. if (empty($model)) {
  132. $isForce && throwError('购物车中没有该记录');
  133. return false;
  134. }
  135. return $model;
  136. }
  137. /**
  138. * 删除购物车中指定记录
  139. * @param array $cartIds 购物车ID集, 如果为空删除所有
  140. * @return bool
  141. * @throws BaseException
  142. */
  143. public function clear(array $cartIds = []): bool
  144. {
  145. // 获取当前用户ID
  146. $userId = UserService::getCurrentLoginUserId();
  147. // 设置更新条件
  148. $where = [['user_id', '=', $userId]];
  149. // 购物车ID集
  150. !empty($cartIds) && $where[] = ['id', 'in', $cartIds];
  151. // 更新记录
  152. return $this->updateBase(['is_delete' => 1], $where);
  153. }
  154. /**
  155. * 获取当前用户购物车商品总数量
  156. * @return float
  157. * @throws BaseException
  158. */
  159. public function getCartTotal()
  160. {
  161. if (!UserService::isLogin()) return 0;
  162. $userId = UserService::getCurrentLoginUserId();
  163. return $this->where('user_id', '=', $userId)
  164. ->where('is_delete', '=', 0)
  165. ->sum('goods_num');
  166. }
  167. }