Cart.php 5.7 KB

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