Cart.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. * @param array $flavors 一套装的口味
  32. * @return bool
  33. * @throws BaseException
  34. * @throws \think\db\exception\DataNotFoundException
  35. * @throws \think\db\exception\DbException
  36. * @throws \think\db\exception\ModelNotFoundException
  37. */
  38. public function add(int $goodsId, string $goodsSkuId, int $goodsNum,array $flavors = [])
  39. {
  40. // 判断是否已存在购物车记录
  41. $detail = $this->getInfo($goodsId, $goodsSkuId, false);
  42. // 如果已存在购物车记录, 则累计商品数量
  43. !empty($detail) && $goodsNum += $detail['goods_num'];
  44. // 验证商品的状态
  45. $this->checkGoodsStatus($goodsId, $goodsSkuId, $goodsNum);
  46. // 获取当前用户ID
  47. $userId = UserService::getCurrentLoginUserId();
  48. // 实例化模型
  49. $model = $detail ?: (new static);
  50. return $model->save([
  51. 'goods_id' => $goodsId,
  52. 'goods_sku_id' => $goodsSkuId,
  53. 'goods_num' => $goodsNum,
  54. 'user_id' => $userId,
  55. 'remark_for_one' => json_encode($flavors),
  56. 'store_id' => self::$storeId,
  57. ]);
  58. }
  59. private function goodsNum($flavorNum,$goodsNum)
  60. {
  61. return $flavorNum * $goodsNum;
  62. }
  63. /**
  64. * 更新购物车记录
  65. * @param int $goodsId 商品ID
  66. * @param string $goodsSkuId 商品sku唯一标识
  67. * @param int $goodsNum 商品数量
  68. * @return bool
  69. * @throws BaseException
  70. * @throws \think\db\exception\DataNotFoundException
  71. * @throws \think\db\exception\DbException
  72. * @throws \think\db\exception\ModelNotFoundException
  73. */
  74. public function sUpdate(int $goodsId, string $goodsSkuId, int $goodsNum)
  75. {
  76. // 验证商品的状态
  77. $this->checkGoodsStatus($goodsId, $goodsSkuId, $goodsNum);
  78. // 获取购物车记录
  79. $model = $this->getInfo($goodsId, $goodsSkuId, true);
  80. // 更新记录
  81. return $model->save(['goods_num' => $goodsNum]);
  82. }
  83. /**
  84. * 验证商品的状态
  85. * @param int $goodsId 商品ID
  86. * @param string $goodsSkuId 商品sku唯一标识
  87. * @param int $goodsNum 商品数量
  88. * @return bool
  89. * @throws BaseException
  90. */
  91. private function checkGoodsStatus(int $goodsId, string $goodsSkuId, int $goodsNum)
  92. {
  93. // 获取商品详情
  94. $goods = GoodsModel::detail($goodsId);
  95. // 商品不存在
  96. if (empty($goods) || $goods['is_delete']) {
  97. throwError('很抱歉, 商品信息不存在');
  98. }
  99. // 商品已下架
  100. if ($goods['status'] == GoodsStatusEnum::OFF_SALE) {
  101. throwError('很抱歉, 该商品已经下架');
  102. }
  103. // 获取SKU信息
  104. $skuInfo = GoodsSkuModel::detail($goodsId, $goodsSkuId);
  105. if ($skuInfo['stock_num'] < $goodsNum) {
  106. throwError('很抱歉, 该商品库存数量不足');
  107. }
  108. return true;
  109. }
  110. /**
  111. * 获取购物车记录
  112. * @param int $goodsId 商品ID
  113. * @param string $goodsSkuId 商品sku唯一标识
  114. * @param bool $isForce
  115. * @return static|bool
  116. * @throws BaseException
  117. * @throws \think\db\exception\DataNotFoundException
  118. * @throws \think\db\exception\DbException
  119. * @throws \think\db\exception\ModelNotFoundException
  120. */
  121. private function getInfo(int $goodsId, string $goodsSkuId, bool $isForce = true)
  122. {
  123. // 获取当前用户ID
  124. $userId = UserService::getCurrentLoginUserId();
  125. // 获取购物车记录
  126. $model = static::detail($userId, $goodsId, $goodsSkuId);
  127. if (empty($model)) {
  128. $isForce && throwError('购物车中没有该记录');
  129. return false;
  130. }
  131. return $model;
  132. }
  133. /**
  134. * 删除购物车中指定记录
  135. * @param array $cartIds 购物车ID集, 如果为空删除所有
  136. * @return bool
  137. * @throws BaseException
  138. */
  139. public function clear(array $cartIds = [])
  140. {
  141. // 获取当前用户ID
  142. $userId = UserService::getCurrentLoginUserId();
  143. // 设置更新条件
  144. $where = [['user_id', '=', $userId]];
  145. // 购物车ID集
  146. !empty($cartIds) && $where[] = ['id', 'in', $cartIds];
  147. // 更新记录
  148. return $this->updateBase(['is_delete' => 1], $where);
  149. }
  150. /**
  151. * 获取当前用户购物车商品总数量
  152. * @return float
  153. * @throws BaseException
  154. */
  155. public function getCartTotal()
  156. {
  157. if (!UserService::isLogin()) return 0;
  158. $userId = UserService::getCurrentLoginUserId();
  159. return $this->where('user_id', '=', $userId)
  160. ->where('is_delete', '=', 0)
  161. ->sum('goods_num');
  162. }
  163. }