Trolley.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\model\StoreGoods;
  4. use app\common\model\StoreGoodsSpec;
  5. use app\common\model\User;
  6. use think\Db;
  7. use app\common\model\ShoppingTrolley;
  8. use app\common\model\DeliveryAddress;
  9. use think\Exception;
  10. /**
  11. * @title 购物车
  12. * @controller Trolley
  13. * @group base
  14. */
  15. class Trolley extends Base
  16. {
  17. public function initialize()
  18. {
  19. parent::checkLogin();
  20. }
  21. /**
  22. * @title 获取购物车列表
  23. * @desc 获取购物车列表
  24. * @author qc
  25. * @url /api/Trolley/getTrolleyList
  26. * @method GET
  27. * @header name:Authorization require:1 desc:Token
  28. * @return name:goods_id type:int default:-- desc:商品id
  29. * @return name:goods_name type:string default:-- desc:商品名称
  30. * @return name:goods_status type:int default:-- desc:商品状态(1上架,0下架)
  31. * @return name:deleted_status type:string default:-- desc:删除状态(1删除,0未删除)
  32. * @return name:item_list type:array default:-- desc:添加该商品的规格列表
  33. * @return name:item_list.spec_id type:int default:-- desc:规格id
  34. * @return name:item_list.goods_no type:int default:-- desc:货号
  35. * @return name:item_list.goods_spec type:array default:-- desc:规格详情
  36. * @return name:item_list.goods_spec.spec_title type:string default:-- desc:规格名称
  37. * @return name:item_list.goods_spec.cover type:string default:-- desc:规格封面
  38. * @return name:item_list.goods_spec.original_price type:float default:-- desc:规格原价
  39. * @return name:item_list.goods_spec.sell_price type:float default:-- desc:规格售价
  40. */
  41. public function getTrolleyList()
  42. {
  43. $trolley_goods = ShoppingTrolley::field('goods_id')
  44. ->where('user_id',$this->uid)->group('goods_id')
  45. ->select();
  46. if(!$trolley_goods) $this->success('',['list'=>[]]);
  47. $goods_ids = array_column($trolley_goods->toArray(),'goods_id');
  48. $list = [];
  49. $goods_list = StoreGoods::where('id','in',$goods_ids)->select()->toArray();
  50. foreach ($goods_list as $goods_info){
  51. $trolley_data = ['goods_id'=>$goods_info['id'],'goods_name'=>$goods_info['name'],'goods_status'=>$goods_info['status'],'deleted_status'=>$goods_info['is_deleted'],'is_combo'=>$goods_info['is_combo']];
  52. $trolley_data['item_list'] = ShoppingTrolley::with(['goodsSpec'])->where('goods_id',$goods_info['id'])->select();
  53. $list[] = $trolley_data;
  54. }
  55. $this->success('ok',['list'=>$list]);
  56. }
  57. /**
  58. * @title 商品添加购物车(按规格加入)
  59. * @desc 商品某个规格加入多少
  60. * @author qc
  61. * @url /api/Trolley/addTrolley
  62. * @method POST
  63. * @header name:Authorization require:1 desc:Token
  64. * @param name:goods_id type:int require:1 default:0 desc:商品id
  65. * @param name:spec_id type:int require:1 default:0 desc:规格id
  66. * @return name:num type:int default:1 desc:数量
  67. */
  68. public function addTrolley()
  69. {
  70. $goods_id = input('post.goods_id');
  71. $spec_id = input('post.spec_id');
  72. $num = input('post.num');
  73. if(!$goods_id || !$spec_id) $this->error('请选择商品');
  74. if($num <=0 ) $this->error('添加数量有误');
  75. Db::startTrans();
  76. try {
  77. // 商品详情
  78. $goods_info = StoreGoods::with(['specList'=>function($query)use($spec_id){
  79. return $query->where('id',$spec_id)->where('is_deleted',0);
  80. }])->where('id',$goods_id)->where('is_deleted',0)->where('status',1)->find();
  81. if(!$goods_info) throw new Exception('商品已下架');
  82. $goods_info = $goods_info->toArray();
  83. if(empty($goods_info['spec_list'])) throw new Exception('该规格已下架');
  84. if($goods_info['spec_list'][0]['stock'] < $num) throw new Exception('库存不足');
  85. $trolley_id = ShoppingTrolley::checkTrolley($this->uid,$goods_id,$spec_id);
  86. // 添加到购物车
  87. if($trolley_id) {
  88. ShoppingTrolley::where('id',$trolley_id)->setInc('num',$num);
  89. }else{
  90. $trolley_info = [
  91. 'user_id' => $this->uid,
  92. 'goods_id' => $goods_id,
  93. 'spec_id' => $spec_id,
  94. 'goods_no' => $goods_info['spec_list'][0]['goods_no'],
  95. 'num' => $num,
  96. ];
  97. ShoppingTrolley::create($trolley_info);
  98. }
  99. // 扣减库存
  100. StoreGoods::where('id',$goods_id)->setDec('stock',$num);
  101. StoreGoodsSpec::where('id',$spec_id)->setDec('stock',$num);
  102. Db::commit();
  103. }catch (\Exception $e){
  104. $this->is_commit = false;
  105. $this->ret_msg = $e->getMessage();
  106. Db::rollback();
  107. }
  108. $this->is_commit ? $this->success('添加成功'):$this->error($this->ret_msg);
  109. }
  110. /**
  111. * @title 修改购物车商品数量
  112. * @desc 修改购物车商品数量
  113. * @author qc
  114. * @url /api/Trolley/changeTrolleyNum
  115. * @method POST
  116. * @header name:Authorization require:1 desc:Token
  117. * @param name:trolley_id type:int require:1 default:0 desc:购物车记录id
  118. * @return name:num type:int require:1 default:1 desc:变更数量
  119. * @return name:type type:intrequire:1 default:1 desc:变更类型(1增加2扣减)
  120. */
  121. public function changeTrolleyNum()
  122. {
  123. $trolley_id = input('post.trolley_id');
  124. $num = input('post.num',1);
  125. $type = input('post.type',1);
  126. if(!in_array($type,[1,2])) $this->error('变更可类型错误');
  127. Db::startTrans();
  128. try {
  129. $trolley_info = ShoppingTrolley::get($trolley_id);
  130. if(!$trolley_info) $this->exception('记录不存在!');
  131. $goods_info = StoreGoods::getGoodsSpec($trolley_info->goods_id,$trolley_info->spec_id);
  132. if($type == 1){
  133. if(!$goods_info) $this->exception('商品已下架');
  134. if(empty($goods_info['spec_list'])) $this->exception('该规格已下架');
  135. if($goods_info['spec_list'][0]['stock'] < $num)$this->exception('库存不足');
  136. ShoppingTrolley::where('id',$trolley_id)->setInc('num',$num);
  137. StoreGoods::where('id',$trolley_info->goods_id)->setDec('stock',$num);// 扣减商品库存
  138. StoreGoodsSpec::where('id',$trolley_info->spec_id)->setDec('stock',$num);// 扣减规格库存
  139. }else{
  140. if($trolley_info->num < $num) $this->exception('扣减数量有误');
  141. if($trolley_info->num > $num){
  142. ShoppingTrolley::where('id',$trolley_id)->setDec('num',$num);//扣减数量
  143. }else{
  144. ShoppingTrolley::where('id',$trolley_id)->delete();//删除记录
  145. }
  146. StoreGoods::where('id',$trolley_info->goods_id)->setInc('stock',$num);//增加商品库存
  147. StoreGoodsSpec::where('id',$trolley_info->spec_id)->setInc('stock',$num);//增加规格库存
  148. }
  149. Db::commit();
  150. }catch (\Exception $e){
  151. $this->ret_msg = $e->getMessage();
  152. $this->is_commit = false;
  153. Db::rollback();
  154. }
  155. $this->is_commit ? $this->success('操作成功') : $this->error($this->ret_msg);
  156. }
  157. /**
  158. * @title 删除购物车记录
  159. * @desc 删除购物车记录
  160. * @author qc
  161. * @url /api/Trolley/cancelTrolleyList
  162. * @method POST
  163. * @header name:Authorization require:1 desc:Token
  164. * @param name:ids type:string require:1 default:0 desc:购物车记录id(多条用逗号隔开)
  165. */
  166. public function cancelTrolleyList()
  167. {
  168. $ids = input('post.ids');
  169. if(!$ids) $this->error('请选择要删除的数据');
  170. $trolley_list = ShoppingTrolley::where('id','in',$ids)->select();
  171. Db::startTrans();
  172. foreach ($trolley_list as $trolley_info) {
  173. StoreGoods::where('id',$trolley_info->goods_id)->setInc('stock',$trolley_info->num);//增加商品库存
  174. StoreGoodsSpec::where('id',$trolley_info->spec_id)->setInc('stock',$trolley_info->num);//增加规格库存
  175. }
  176. ShoppingTrolley::where('id','in',$ids)->delete();
  177. Db::commit();
  178. $this->success('删除成功');
  179. }
  180. /**
  181. * @title 某商品是否添加到购物
  182. * @desc 获取某商品添加到购物车规格及数量
  183. * @author qc
  184. * @url /api/Trolley/getTrolleyByGoodsId
  185. * @method GET
  186. * @header name:Authorization require:1 desc:Token
  187. * @param name:goods_id type:int default:1 desc:商品id
  188. * @return name:spec_id type:int default:-- desc:规格id
  189. * @return name:num type:int default:-- desc:数量
  190. */
  191. public function getTrolleyByGoodsId()
  192. {
  193. $goods_id = input('get.goods_id');
  194. $list = ShoppingTrolley::field('id,goods_id,spec_id,goods_no,num')
  195. ->where(['user_id'=>$this->uid,'goods_id'=>$goods_id])
  196. ->order('id desc')
  197. ->select();
  198. $this->success('ok',['list'=>$list?$list->toArray() : [] ]);
  199. }
  200. /**
  201. * @title 购物车订单确认
  202. * @desc 购物车订单确认
  203. * @author qc
  204. * @url /api/Trolley/confirmTrolleyList
  205. * @method GET
  206. * @header name:Authorization require:1 desc:Token
  207. * @param name:ids type:int default:1 desc:购物车记录id(多条用逗号隔开)
  208. * @return name:goods_id type:int default:-- desc:商品id
  209. * @return name:goods_name type:string default:-- desc:商品名称
  210. * @return name:goods_status type:int default:-- desc:商品状态(1上架,0下架)
  211. * @return name:deleted_status type:string default:-- desc:删除状态(1删除,0未删除)
  212. * @return name:item_list type:array default:-- desc:添加该商品的规格列表
  213. * @return name:item_list.spec_id type:int default:-- desc:规格id
  214. * @return name:item_list.goods_no type:int default:-- desc:货号
  215. * @return name:item_list.goods_spec type:array default:-- desc:规格详情
  216. * @return name:item_list.goods_spec.spec_title type:string default:-- desc:规格名称
  217. * @return name:item_list.goods_spec.cover type:string default:-- desc:规格封面
  218. * @return name:item_list.goods_spec.original_price type:float default:-- desc:规格原价
  219. * @return name:item_list.goods_spec.sell_price type:float default:-- desc:规格售价
  220. * @return name:wallet type:float default:-- desc:金额
  221. * @return name:address_info type:array default:-- desc:默认收货地址
  222. * @return name:wallet type:array default:-- desc:钱包
  223. * @return name:walle.integral type:int default:-- desc:积分
  224. * @return name:walle.balance type:int default:-- desc:余额
  225. */
  226. public function confirmTrolleyList()
  227. {
  228. $ids = input('get.ids');
  229. $trolley_goods = ShoppingTrolley::field('goods_id')
  230. ->where('user_id',$this->uid)
  231. ->where('id','in',$ids)
  232. ->group('goods_id')
  233. ->select();
  234. if(!$trolley_goods) $this->error('请选择商品');
  235. $goods_ids = array_column($trolley_goods->toArray(),'goods_id');
  236. $list = [];
  237. $total_money = 0;
  238. $goods_list = StoreGoods::where('id','in',$goods_ids)->select()->toArray();
  239. foreach ($goods_list as $goods_info){
  240. $trolley_data = ['goods_id'=>$goods_info['id'],'goods_name'=>$goods_info['name'],'goods_status'=>$goods_info['status'],'deleted_status'=>$goods_info['is_deleted'],'is_combo'=>$goods_info['is_combo']];
  241. $trolley_data['item_list'] = ShoppingTrolley::with(['goodsSpec'])->where('id','in',$ids)->where('goods_id',$goods_info['id'])->select()->toArray();
  242. foreach ($trolley_data['item_list'] as $iv){
  243. $total_money = bcadd(bcmul($iv['num'],$iv['goods_spec']['sell_price'],2),$total_money,2);
  244. }
  245. $list[] = $trolley_data;
  246. }
  247. $address_info = DeliveryAddress::where(['user_id'=>$this->uid,'is_mr'=>1])->find();
  248. $user_info = User::with('wallet')->field('id,level_id')->where('id',$this->uid)->find()->toArray();
  249. $this->success('ok',[
  250. 'list'=>$list,
  251. 'total_money'=>$total_money,
  252. 'address_info'=>$address_info ? $address_info->toArray():'',
  253. 'wallet'=>$user_info['wallet'],
  254. ]);
  255. }
  256. }