StoreCart.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/12/18
  6. */
  7. namespace app\routine\model\store;
  8. use app\routine\model\store\StoreCombination;
  9. use basic\ModelBasic;
  10. use traits\ModelTrait;
  11. class StoreCart extends ModelBasic
  12. {
  13. use ModelTrait;
  14. protected $insert = ['add_time'];
  15. protected function setAddTimeAttr()
  16. {
  17. return time();
  18. }
  19. public static function setCart($uid,$product_id,$cart_num = 1,$product_attr_unique = '',$type='product',$is_new = 0,$combination_id=0,$seckill_id = 0,$bargain_id = 0)
  20. {
  21. if($cart_num < 1) $cart_num = 1;
  22. if($seckill_id){
  23. if(!StoreSeckill::getValidProduct($seckill_id))
  24. return self::setErrorInfo('该产品已下架或删除');
  25. if(StoreSeckill::getProductStock($seckill_id) < $cart_num)
  26. return self::setErrorInfo('该产品库存不足'.$cart_num);
  27. $where = ['type'=>$type,'uid'=>$uid,'product_id'=>$product_id,'product_attr_unique'=>$product_attr_unique,'is_new'=>$is_new,'is_pay'=>0,'is_del'=>0,'seckill_id'=>$seckill_id];
  28. if($cart = self::where($where)->find()){
  29. $cart->cart_num = $cart_num;
  30. $cart->add_time = time();
  31. $cart->save();
  32. return $cart;
  33. }else{
  34. return self::set(compact('uid','product_id','cart_num','product_attr_unique','is_new','type','seckill_id'));
  35. }
  36. }elseif($bargain_id){
  37. if(!StoreBargain::validBargain($bargain_id))
  38. return self::setErrorInfo('该产品已下架或删除');
  39. if(StoreBargain::getBargainStock($bargain_id) < $cart_num)
  40. return self::setErrorInfo('该产品库存不足'.$cart_num);
  41. $where = ['type'=>$type,'uid'=>$uid,'product_id'=>$product_id,'product_attr_unique'=>$product_attr_unique,'is_new'=>$is_new,'is_pay'=>0,'is_del'=>0,'bargain_id'=>$bargain_id];
  42. if($cart = self::where($where)->find()){
  43. $cart->cart_num = $cart_num;
  44. $cart->add_time = time();
  45. $cart->save();
  46. return $cart;
  47. }else{
  48. return self::set(compact('uid','product_id','cart_num','product_attr_unique','is_new','type','bargain_id'));
  49. }
  50. }elseif($combination_id){//拼团
  51. if(!StoreCombination::getCombinationStock($combination_id,$cart_num))
  52. return self::setErrorInfo('该产品库存不足'.$cart_num);
  53. if(!StoreCombination::isValidCombination($combination_id))
  54. return self::setErrorInfo('该产品已下架或删除');
  55. }else{
  56. if(!StoreProduct::isValidProduct($product_id))
  57. return self::setErrorInfo('该产品已下架或删除');
  58. if(!StoreProductAttr::issetProductUnique($product_id,$product_attr_unique))
  59. return self::setErrorInfo('请选择有效的产品属性');
  60. if(StoreProduct::getProductStock($product_id,$product_attr_unique) < $cart_num)
  61. return self::setErrorInfo('该产品库存不足'.$cart_num);
  62. }
  63. $where = ['type'=>$type,'uid'=>$uid,'product_id'=>$product_id,'product_attr_unique'=>$product_attr_unique,'is_new'=>$is_new,'is_pay'=>0,'is_del'=>0,'combination_id'=>$combination_id];
  64. if($cart = self::where($where)->find()){
  65. $cart->cart_num = $cart_num;
  66. $cart->add_time = time();
  67. $cart->save();
  68. return $cart;
  69. }else{
  70. return self::set(compact('uid','product_id','cart_num','product_attr_unique','is_new','type','combination_id'));
  71. }
  72. }
  73. public static function removeUserCart($uid,$ids)
  74. {
  75. return self::where('uid',$uid)->where('id','IN',$ids)->update(['is_del'=>1]);
  76. }
  77. public static function getUserCartNum($uid,$type)
  78. {
  79. return self::where('uid',$uid)->where('type',$type)->where('is_pay',0)->where('is_del',0)->where('is_new',0)->count();
  80. }
  81. public static function changeUserCartNum($cartId,$cartNum,$uid)
  82. {
  83. return self::where('uid',$uid)->where('id',$cartId)->update(['cart_num'=>$cartNum]);
  84. }
  85. public static function getUserProductCartList($uid,$cartIds='',$status=0)
  86. {
  87. $productInfoField = 'id,image,slider_image,price,ot_price,vip_price,postage,mer_id,give_integral,cate_id,sales,stock,store_name,store_info,unit_name,is_show,is_del,is_postage,cost';
  88. $seckillInfoField = 'id,image,price,ot_price,postage,give_integral,sales,stock,title as store_name,unit_name,is_show,is_del,is_postage,cost';
  89. $bargainInfoField = 'id,image,min_price as price,price as ot_price,postage,give_integral,sales,stock,title as store_name,unit_name,status as is_show,is_del,is_postage,cost';
  90. $combinationInfoField = 'id,image,price,postage,sales,stock,title as store_name,is_show,is_del,is_postage,cost';
  91. $model = new self();
  92. $valid = $invalid = [];
  93. $model = $model->where('uid',$uid)->where('type','product')->where('is_pay',0)
  94. ->where('is_del',0);
  95. if(!$status) $model->where('is_new',0);
  96. if($cartIds) $model->where('id','IN',$cartIds);
  97. $list = $model->select()->toArray();
  98. if(!count($list)) return compact('valid','invalid');
  99. foreach ($list as $k=>$cart){
  100. if($cart['seckill_id']){
  101. $product = StoreSeckill::field($seckillInfoField)
  102. ->find($cart['seckill_id'])->toArray();
  103. }elseif($cart['bargain_id']){
  104. $product = StoreBargain::field($bargainInfoField)
  105. ->find($cart['bargain_id'])->toArray();
  106. }elseif($cart['combination_id']){
  107. $product = StoreCombination::field($combinationInfoField)
  108. ->find($cart['combination_id'])->toArray();
  109. }else{
  110. $product = StoreProduct::field($productInfoField)
  111. ->find($cart['product_id'])->toArray();
  112. }
  113. $cart['productInfo'] = $product;
  114. //商品不存在
  115. if(!$product){
  116. $model->where('id',$cart['id'])->update(['is_del'=>1]);
  117. //商品删除或无库存
  118. }else if(!$product['is_show'] || $product['is_del'] || !$product['stock']){
  119. $invalid[] = $cart;
  120. //商品属性不对应
  121. }else if(!StoreProductAttr::issetProductUnique($cart['product_id'],$cart['product_attr_unique']) && !$cart['combination_id'] && !$cart['seckill_id']){
  122. $invalid[] = $cart;
  123. //正常商品
  124. }else{
  125. if($cart['product_attr_unique']){
  126. $attrInfo = StoreProductAttr::uniqueByAttrInfo($cart['product_attr_unique']);
  127. //商品没有对应的属性
  128. if(!$attrInfo || !$attrInfo['stock'])
  129. $invalid[] = $cart;
  130. else{
  131. $cart['productInfo']['attrInfo'] = $attrInfo;
  132. $cart['truePrice'] = (float)$attrInfo['price'];
  133. $cart['trueStock'] = $attrInfo['stock'];
  134. $cart['costPrice'] = $cart['productInfo']['cost'];
  135. $cart['productInfo']['image'] = empty($attrInfo['image']) ? $cart['productInfo']['image'] : $attrInfo['image'];
  136. $valid[] = $cart;
  137. }
  138. }else{
  139. $cart['truePrice'] = (float)$cart['productInfo']['price'];
  140. $cart['trueStock'] = $cart['productInfo']['stock'];
  141. $cart['costPrice'] = $cart['productInfo']['cost'];
  142. $valid[] = $cart;
  143. }
  144. }
  145. }
  146. foreach ($valid as $k=>$cart){
  147. if($cart['trueStock'] < $cart['cart_num']){
  148. $cart['cart_num'] = $cart['trueStock'];
  149. $model->where('id',$cart['id'])->update(['cart_num'=>$cart['cart_num']]);
  150. $valid[$k] = $cart;
  151. }
  152. }
  153. return compact('valid','invalid');
  154. }
  155. /**
  156. * 拼团
  157. * @param $uid
  158. * @param string $cartIds
  159. * @return array
  160. */
  161. public static function getUserCombinationProductCartList($uid,$cartIds='')
  162. {
  163. $productInfoField = 'id,image,slider_image,price,cost,ot_price,vip_price,postage,mer_id,give_integral,cate_id,sales,stock,store_name,unit_name,is_show,is_del,is_postage';
  164. $model = new self();
  165. $valid = $invalid = [];
  166. $model = $model->where('uid',$uid)->where('type','product')->where('is_pay',0)
  167. ->where('is_del',0);
  168. if($cartIds) $model->where('id','IN',$cartIds);
  169. $list = $model->select()->toArray();
  170. if(!count($list)) return compact('valid','invalid');
  171. foreach ($list as $k=>$cart){
  172. $product = StoreProduct::field($productInfoField)
  173. ->find($cart['product_id'])->toArray();
  174. $cart['productInfo'] = $product;
  175. //商品不存在
  176. if(!$product){
  177. $model->where('id',$cart['id'])->update(['is_del'=>1]);
  178. //商品删除或无库存
  179. }else if(!$product['is_show'] || $product['is_del'] || !$product['stock']){
  180. $invalid[] = $cart;
  181. //商品属性不对应
  182. // }else if(!StoreProductAttr::issetProductUnique($cart['product_id'],$cart['product_attr_unique'])){
  183. // $invalid[] = $cart;
  184. //正常商品
  185. }else{
  186. $cart['truePrice'] = (float)StoreCombination::where('id',$cart['combination_id'])->value('price');
  187. $cart['costPrice'] = (float)StoreCombination::where('id',$cart['combination_id'])->value('cost');
  188. $cart['trueStock'] = StoreCombination::where('id',$cart['combination_id'])->value('stock');
  189. $valid[] = $cart;
  190. }
  191. }
  192. foreach ($valid as $k=>$cart){
  193. if($cart['trueStock'] < $cart['cart_num']){
  194. $cart['cart_num'] = $cart['trueStock'];
  195. $model->where('id',$cart['id'])->update(['cart_num'=>$cart['cart_num']]);
  196. $valid[$k] = $cart;
  197. }
  198. }
  199. return compact('valid','invalid');
  200. }
  201. }