StoreCart.php 12 KB

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