GoodsCart.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace app\api\controller\mall;
  3. use app\common\controller\Api;
  4. use app\common\model\Coupon;
  5. use app\common\model\GoodsSku;
  6. use app\common\service\CouponService;
  7. use app\common\service\InstallService;
  8. use think\Db;
  9. /**
  10. * 商城购物车
  11. * @inheritdoc
  12. */
  13. class GoodsCart extends Api
  14. {
  15. protected $noNeedRight="*";
  16. /**
  17. * 添加到购物车
  18. * @ApiMethod (POST)
  19. * @ApiSummary ("参数:{sku_id:{num:1,num_install:2}},sku_id规格id,num数量,num_install安装数量")
  20. */
  21. public function add(){
  22. $user=$this->auth->getUser();
  23. $data=input();
  24. $goods=$data['goods']??[];
  25. foreach ($goods as $sku=>$good){
  26. GoodsSku::findOrFail($sku);
  27. $good['sku_id']=$sku;
  28. $this->validate($good,[
  29. 'sku_id|规格'=>['require','integer','gt:0'],
  30. 'num|数量'=>['require','integer','gt:0'],
  31. 'num_install|安装'=>['require','integer','gt:0'],
  32. ]);
  33. }
  34. Db::startTrans();
  35. $skus=GoodsSku::whereIn('id',array_keys($goods))->lock(true)->select();
  36. foreach ($skus as $sku){
  37. if($sku['num_sell']+$goods[$sku['id']]['num']>$sku['num_stock']){
  38. $this->error('库存不足');
  39. }
  40. $cart=$user->cart()->where('goods_sku_id',$sku['id'])->find();
  41. if($cart){
  42. $cart['num']=$cart['num']+$goods[$sku['id']]['num'];
  43. $cart['num_install']=$cart['num_install']+$goods[$sku['id']]['num_install'];
  44. $cart->save();
  45. }else{
  46. $user->cart()->save([
  47. 'goods_sku_id'=>$sku['id'],
  48. 'goods_id'=>$sku['goods_id'],
  49. 'num'=>$goods[$sku['id']]['num'],
  50. 'num_install'=>$goods[$sku['id']]['num_install'],
  51. ]);
  52. }
  53. $sku->save();
  54. }
  55. Db::commit();
  56. $this->success();
  57. }
  58. /**
  59. * 删除
  60. * @ApiParams (name=id,description=购物车id)
  61. */
  62. public function del(){
  63. $data=$this->_validate([
  64. 'id'=>['require'],
  65. ]);
  66. $user=$this->auth->getUser();
  67. $user->cart()->where('id',$data['id'])->delete();
  68. $this->success();
  69. }
  70. /**
  71. * 购物车修改
  72. * @ApiParams (name=id,description=购物车id)
  73. * @ApiParams (name=num,description=购买数量)
  74. * @ApiParams (name=num_install,description=安装数量)
  75. */
  76. public function update(){
  77. $data=$this->_validate([
  78. 'id'=>['require'],
  79. 'num|数量'=>['integer','gt:0'],
  80. 'num_install|数量'=>['integer','gt:0'],
  81. ]);
  82. $user=$this->auth->getUser();
  83. $cart=$user->cart()->findOrFail($data['id']);
  84. if(!empty($data['num'])){
  85. $cart['num']=$data['num'];
  86. }
  87. if(!empty($data['num_install'])){
  88. $cart['num_install']=$data['num_install'];
  89. }
  90. $cart->save();
  91. $this->success();
  92. }
  93. /**
  94. * 购物车列表
  95. * @ApiParams (name=coupon_use,description="是否使用优惠券使用传1")
  96. * @ApiParams (name=coupon_id,description=优惠券id)
  97. * @ApiReturnParams (name=amount_total,description=总金额)
  98. * @ApiReturnParams (name=amount_coupon,description=优惠券优惠金额)
  99. * @ApiReturnParams (name=amount_install,description=安装费)
  100. * @ApiReturnParams (name=num,description=购买件数)
  101. * @ApiReturnParams (name=num_install,description=安装件数)
  102. * @ApiReturnParams (name=goods,description=商品列表)
  103. */
  104. public function index(){
  105. $data=$this->_validate([
  106. 'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'],
  107. ]);
  108. $user=$this->auth->getUser();
  109. $info=[
  110. 'amount_total'=>0,
  111. 'amount_coupon'=>0,
  112. 'amount_install'=>0,
  113. 'num'=>0,
  114. 'num_install'=>0,
  115. 'goods'=>[]
  116. ];
  117. $info['goods']=$user->cart()
  118. ->with(['goods','sku'])
  119. ->select()->toArray();
  120. $info['num']=array_sum(array_column($info['goods'],'num'));
  121. $info['num_install']=array_sum(array_column($info['goods'],'num_install'));
  122. foreach ($info['goods'] as $goods){
  123. $amount=bcmul($goods['sku']['amount'],$goods['num']);
  124. $info['amount_total']=bcadd($info['amount_total'],$amount);
  125. }
  126. #安装费
  127. $info['amount_install']=InstallService::getFee(array_column($info['goods'],null,'goods_sku_id'),'num_install');
  128. $info['amount_total']=bcadd($info['amount_total'],$info['amount_install']);
  129. #优惠券
  130. $couponAmount=0;
  131. if(!empty($data['coupon_use'])){
  132. $use=false;
  133. $coupon=$user->coupon()->findOrFail($data['coupon_id']);
  134. foreach ($info['goods'] as $goods){
  135. $amount=bcmul($goods['sku']['amount'],$goods['num']);
  136. if($coupon->canUse($amount,$goods['goods_id'])){
  137. $use=true;
  138. $couponAmount=$coupon['amount'];
  139. break;
  140. }
  141. }
  142. if(!$use){
  143. $this->error('优惠券不符合使用规则');
  144. }
  145. $info['amount_coupon']=$couponAmount;
  146. }
  147. $info['amount_total']=bcsub($info['amount_total'],$couponAmount);
  148. $this->success('',$info);
  149. }
  150. }