Cart.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace common\models\cart;
  3. use yii\redis\Connection;
  4. class Cart extends \common\models\base\BaseActiveRecord
  5. {
  6. public static $expire_time = 7 * 24 * 3600;//购物车内商品的有效期
  7. public static $key = 'cart_';//购物车hash key
  8. public static $mall_key = 'mall_cart_set_';//商城购车user_id计数键值
  9. public static $pre = 'user_id_';
  10. // public static $field = 'attr_id_';//字段
  11. public static $field = '';//字段
  12. /**
  13. * 获取购物车列表数据
  14. * @param $user_id
  15. * @return mixed
  16. */
  17. public static function getCartList($user_id)
  18. {
  19. $key = self::$key . $user_id;
  20. return \Yii::$app->redis->hgetall($key);
  21. }
  22. /**
  23. * 添加购物车
  24. * @param $params
  25. */
  26. public static function addCart($params)
  27. {
  28. // 添加购物车添加时间
  29. list($msec, $sec) = explode(' ', microtime());
  30. $microtime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
  31. $params['microtime'] = $microtime;
  32. $key = self::$key . $params['user_id'];
  33. //传入的插件名和识别value
  34. if (!empty($params['key']) && !empty($params['value'])) {
  35. $key .= '_'.$params['key'];
  36. $key .= '_'. $params['value'];
  37. }
  38. $field = self::$field . $params['attr_id'];
  39. $data = \Yii::$app->redis->hget($key, $field);
  40. if (!empty($data)) {
  41. $data = json_decode($data, true);
  42. $data['num'] += $params['num'];
  43. if (!empty($params['buy_limit_nums']) && $data['num'] < $params['buy_limit_nums']) throw new \Exception('最低起购数量是' . $params['buy_limit_nums']);
  44. if (!empty($params['buy_limit_total_num']) && $data['num'] > $params['buy_limit_total_num']) throw new \Exception('商品限购总数' . $params['buy_limit_total_num']);
  45. // 如果需要增加数量变成最新的
  46. // $data['microtime'] = $microtime;
  47. \Yii::$app->redis->hset($key, $field, json_encode($data));
  48. } else {
  49. if (!empty($params['buy_limit_total_num']) && $params['num'] > $params['buy_limit_total_num']) throw new \Exception('商品限购总数' . $params['buy_limit_total_num']);
  50. \Yii::$app->redis->hset($key, $field, json_encode($params));
  51. }
  52. \Yii::$app->redis->sadd(self::$mall_key . $params['mall_id'], self::$pre . $params['user_id']);
  53. \Yii::$app->redis->expire($key, self::$expire_time);
  54. }
  55. /**
  56. * 更新购物车
  57. * @param $params
  58. */
  59. public static function updateCart($params)
  60. {
  61. $key = self::$key . $params['user_id'];
  62. //传入的插件名和识别value
  63. if (!empty($params['key']) && !empty($params['value'])) {
  64. $key .= '_'.$params['key'];
  65. $key .= '_'. $params['value'];
  66. }
  67. $field = self::$field . $params['attr_id'];
  68. if(!empty($params['buy_limit_total_num'])&&$params['num']>$params['buy_limit_total_num']) throw new \Exception('商品限购总数'.$params['buy_limit_total_num']);
  69. \Yii::$app->redis->hset($key, $field, json_encode($params));
  70. \Yii::$app->redis->sadd(self::$mall_key.$params['mall_id'],self::$pre.$params['user_id']);
  71. \Yii::$app->redis->expire($key, self::$expire_time);
  72. }
  73. /**
  74. * 删除购物车
  75. * @param $params
  76. */
  77. public static function delCart($params)
  78. {
  79. $key = self::$key . $params['user_id'];
  80. //传入的插件名和识别value
  81. if (!empty($params['key']) && !empty($params['value'])) {
  82. $key .= '_'.$params['key'];
  83. $key .= '_'. $params['value'];
  84. }
  85. foreach ($params['list'] as $v) {
  86. $field = self::$field . $v['attr_id'];
  87. \Yii::$app->redis->hdel($key, $field);
  88. }
  89. $cart_list = self::getCartList($params['user_id']);
  90. if(empty($cart_list)) self::delMallCart($params['mall_id'],$params['user_id']);
  91. }
  92. /**
  93. * @desc:用户购物车为空,把商城购车计数清除
  94. * @Author: hua
  95. * @Date: 2021/11/16
  96. * @Time: 12:02
  97. * @Copyright: copyright (c) 2021 广东七件事集团
  98. * @param $mall_id
  99. * @param $user_id
  100. */
  101. public static function delMallCart($mall_id,$user_id){
  102. \Yii::$app->redis->srem(self::$mall_key.$mall_id, self::$pre.$user_id);
  103. }
  104. /**
  105. * @desc:遍历商城购车计数集合数
  106. * @Author: hua
  107. * @Date: 2021/11/16
  108. * @Time: 14:33
  109. * @Copyright: copyright (c) 2021 广东七件事集团
  110. * @param $mall_id
  111. * @param $offset
  112. * @param $pattern
  113. * @param int $limit
  114. * @return mixed
  115. */
  116. public static function getMallCartList($mall_id,$offset,$pattern,$limit=10){
  117. $key = self::$mall_key . $mall_id;
  118. return \Yii::$app->redis->sscan($key,$offset,'MATCH',$pattern,'COUNT',$limit);
  119. }
  120. /**
  121. * 减少购物车商品数量
  122. *
  123. * @param array $params[user_id=>user_id,list=>[attr_id=>num]]
  124. *
  125. */
  126. public static function decreaseNumb($params) {
  127. $key = self::$key . $params['user_id'];
  128. //传入的插件名和识别value
  129. if (!empty($params['key']) && !empty($params['value'])) {
  130. $key .= '_'.$params['key'];
  131. $key .= '_'. $params['value'];
  132. }
  133. $config = \Yii::$app->getComponents()['redis'];
  134. unset($config['class']);
  135. $redis = new Connection($config);
  136. foreach ($params['list'] as $attr_id => $num) {
  137. $cart_info = $redis->hget($key, self::$field . $attr_id);
  138. if ($cart_info) {
  139. $cart_info = json_decode($cart_info, true);
  140. $cart_num = $cart_info['num'] - $num;
  141. if ($cart_num <= 0) {
  142. $redis->hdel($key, $attr_id);
  143. } else {
  144. $cart_info['num'] = $cart_num;
  145. $redis->hset($key, $attr_id, json_encode($cart_info));
  146. }
  147. }
  148. }
  149. $redis->close();
  150. }
  151. }