GoodsCart.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. namespace app\api\controller\mall;
  3. use app\admin\model\GoodsViewFavCart;
  4. use app\common\controller\Api;
  5. use app\common\model\Coupon;
  6. use app\common\model\GoodsSku;
  7. use app\common\service\CouponService;
  8. use app\common\service\InstallService;
  9. use app\common\service\OrderService;
  10. use think\Db;
  11. /**
  12. * 商城购物车
  13. * @inheritdoc
  14. */
  15. class GoodsCart extends Api
  16. {
  17. protected $noNeedRight="*";
  18. /**
  19. * 添加到购物车
  20. * @ApiMethod (POST)
  21. * @ApiSummary ("参数:{sku_id:{num:1,num_install:2}},sku_id规格id,num数量,num_install安装数量")
  22. */
  23. public function add(){
  24. $user=$this->auth->getUser();
  25. $data=$this->request->post();
  26. $goods=$data;
  27. foreach ($goods as $sku=>$good){
  28. if(!is_numeric($sku)){
  29. continue;
  30. }
  31. $skuModel=GoodsSku::findOrFail($sku);
  32. $good['sku_id']=$sku;
  33. $this->validate($good,[
  34. 'sku_id|规格'=>['require','integer','gt:0'],
  35. 'num|数量'=>['require','integer','gt:0'],
  36. 'num_install|安装'=>['require','integer','egt:0'],
  37. ]);
  38. }
  39. Db::startTrans();
  40. $skus=GoodsSku::whereIn('id',array_keys($goods))->lock(true)->select();
  41. foreach ($skus as $sku){
  42. OrderService::checkSku($sku,$goods[$sku['id']]['num']);
  43. OrderService::checkGoods($sku['goods']);
  44. $cart=$user->cart()->where('goods_sku_id',$sku['id'])->find();
  45. if($cart){
  46. $cart['num']=$cart['num']+$goods[$sku['id']]['num'];
  47. $cart['num_install']=$cart['num_install']+$goods[$sku['id']]['num_install'];
  48. $cart->save();
  49. }else{
  50. $user->cart()->save([
  51. 'goods_sku_id'=>$sku['id'],
  52. 'goods_id'=>$sku['goods_id'],
  53. 'num'=>$goods[$sku['id']]['num'],
  54. 'num_install'=>$goods[$sku['id']]['num_install'],
  55. ]);
  56. }
  57. GoodsViewFavCart::increment($sku['goods_id'],'cart');
  58. $sku->save();
  59. }
  60. Db::commit();
  61. $this->success();
  62. }
  63. /**
  64. * 删除
  65. * @ApiParams (name=id,description=购物车id)
  66. */
  67. public function del(){
  68. $data=$this->_validate([
  69. 'id'=>['require'],
  70. ]);
  71. $user=$this->auth->getUser();
  72. $user->cart()->where('id',$data['id'])->delete();
  73. $this->success();
  74. }
  75. /**
  76. * 购物车修改
  77. * @ApiParams (name=id,description=购物车id)
  78. * @ApiParams (name=num,description=购买数量)
  79. * @ApiParams (name=num_install,description=安装数量)
  80. */
  81. public function update(){
  82. $data=$this->_validate([
  83. 'id'=>['require'],
  84. 'num|数量'=>['integer','gt:0'],
  85. 'num_install|数量'=>['integer','gt:0'],
  86. ]);
  87. $user=$this->auth->getUser();
  88. $cart=$user->cart()->findOrFail($data['id']);
  89. if(!empty($data['num'])){
  90. $cart['num']=$data['num'];
  91. }
  92. if(!empty($data['num_install'])){
  93. $cart['num_install']=$data['num_install'];
  94. }
  95. $cart->save();
  96. $this->success();
  97. }
  98. /**
  99. * 购物车列表
  100. * @ApiParams (name=coupon_use,description="是否使用优惠券使用传1")
  101. * @ApiParams (name=coupon_id,description=优惠券id)
  102. * @ApiParams (name=sku_ids,description=规格数组,对选中的规格进行计算)
  103. * @ApiReturnParams (name=amount_total,description=总金额)
  104. * @ApiReturnParams (name=amount_coupon,description=优惠券优惠金额)
  105. * @ApiReturnParams (name=amount_install,description=安装费)
  106. * @ApiReturnParams (name=num,description=购买件数)
  107. * @ApiReturnParams (name=num_install,description=安装件数)
  108. * @ApiReturnParams (name=goods,description=商品列表)
  109. */
  110. public function index(){
  111. $data=$this->_validate([
  112. 'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'],
  113. 'sku_ids|选择的商品'=>['array'],
  114. ]);
  115. if(empty($data['sku_ids'])){
  116. $data['sku_ids']=null;
  117. }
  118. $user=$this->auth->getUser();
  119. $service=new OrderService();
  120. $service->setUser($user);
  121. $service->setCartSkuIds($data['sku_ids']);
  122. $service->setCouponUse($data['coupon_use']??false);
  123. $service->setCouponId($data['coupon_id']??0);
  124. $service->setFrm(2);
  125. $info=$service->calculate();
  126. $this->success('',$info);
  127. }
  128. }