StoreCart.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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. if($cart['combination_id'] || $cart['seckill_id'] || $cart['bargain_id']) {
  167. $cart['truePrice'] = $attrInfo['price'];
  168. $cart['vip_truePrice'] = 0;
  169. }else {
  170. $cart['truePrice'] = (float)StoreProduct::setLevelPrice($attrInfo['price'],$uid,true);
  171. $cart['vip_truePrice'] = (float)StoreProduct::setLevelPrice($attrInfo['price'], $uid);
  172. }
  173. $cart['trueStock'] = $attrInfo['stock'];
  174. $cart['costPrice'] = $attrInfo['cost'];
  175. $cart['productInfo']['image'] = empty($attrInfo['image']) ? $cart['productInfo']['image'] : $attrInfo['image'];
  176. $valid[] = $cart;
  177. }
  178. }else{
  179. if($cart['combination_id'] || $cart['seckill_id'] || $cart['bargain_id']) {
  180. $cart['truePrice'] = $cart['productInfo']['price'];
  181. $cart['vip_truePrice'] = 0;
  182. }else {
  183. $cart['truePrice'] = (float)StoreProduct::setLevelPrice($cart['productInfo']['price'],$uid,true);
  184. $cart['vip_truePrice'] = (float)StoreProduct::setLevelPrice($cart['productInfo']['price'], $uid);
  185. }
  186. $cart['trueStock'] = $cart['productInfo']['stock'];
  187. $cart['costPrice'] = $cart['productInfo']['cost'];
  188. $valid[] = $cart;
  189. }
  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. /**
  202. * 拼团
  203. * @param $uid
  204. * @param string $cartIds
  205. * @return array
  206. */
  207. public static function getUserCombinationProductCartList($uid,$cartIds='')
  208. {
  209. $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';
  210. $model = new self();
  211. $valid = $invalid = [];
  212. $model = $model->where('uid',$uid)->where('type','product')->where('is_pay',0)
  213. ->where('is_del',0);
  214. if($cartIds) $model->where('id','IN',$cartIds);
  215. $list = $model->select()->toArray();
  216. if(!count($list)) return compact('valid','invalid');
  217. foreach ($list as $k=>$cart){
  218. $product = StoreProduct::field($productInfoField)
  219. ->find($cart['product_id'])->toArray();
  220. $cart['productInfo'] = $product;
  221. //商品不存在
  222. if(!$product){
  223. $model->where('id',$cart['id'])->update(['is_del'=>1]);
  224. //商品删除或无库存
  225. }else if(!$product['is_show'] || $product['is_del'] || !$product['stock']){
  226. $invalid[] = $cart;
  227. //商品属性不对应
  228. // }else if(!StoreProductAttr::issetProductUnique($cart['product_id'],$cart['product_attr_unique'])){
  229. // $invalid[] = $cart;
  230. //正常商品
  231. }else{
  232. $cart['truePrice'] = (float)StoreCombination::where('id',$cart['combination_id'])->value('price');
  233. $cart['costPrice'] = (float)StoreCombination::where('id',$cart['combination_id'])->value('cost');
  234. $cart['trueStock'] = StoreCombination::where('id',$cart['combination_id'])->value('stock');
  235. $valid[] = $cart;
  236. }
  237. }
  238. foreach ($valid as $k=>$cart){
  239. if($cart['trueStock'] < $cart['cart_num']){
  240. $cart['cart_num'] = $cart['trueStock'];
  241. $model->where('id',$cart['id'])->update(['cart_num'=>$cart['cart_num']]);
  242. $valid[$k] = $cart;
  243. }
  244. }
  245. return compact('valid','invalid');
  246. }
  247. }