Shoppingcar.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <?php
  2. namespace app\api\controller;
  3. use think\Db;
  4. /**
  5. * @title 购物车管理(线上商城 && 积分商城)
  6. * @controller Shoppingcar
  7. * @group base
  8. */
  9. class Shoppingcar extends Base
  10. {
  11. public function initialize(){
  12. //parent::check_login();
  13. }
  14. /**
  15. * @title 获取购物车列表(购物车列表页)
  16. * @desc 获取购物车列表(购物车列表页)
  17. * @author qc
  18. * @url /api/Shoppingcar/getList
  19. * @method GET
  20. * @header name:Authorization require:1 desc:Token
  21. * @param name:page type:int : default:1 desc:页数
  22. * @param name:page_num type:int : default:20 desc:每页数
  23. * @param name:source type:int : default:0 desc:购物车类型:0商城购物车,1积分购物车
  24. * @return name:id type:int default:-- desc:记录id
  25. * @return name:user_id type:int default:-- desc:会员id
  26. * @return name:goods_id type:int default:-- desc:商品id
  27. * @return name:goods_no type:string default:-- desc:货号
  28. * @return name:num type:int default:-- desc:商品数量
  29. * @return name:is_integral type:int default:-- desc:是否是积分商品
  30. * @return name:error_code type:int default:-- desc:错误码(0商品正常,1商品下架,2规格下架)
  31. */
  32. public function getList()
  33. {
  34. $source = input('source',0);
  35. if(!in_array($source,[0,1])) $this->error('购物车类型错误');
  36. $list = Db::table('shopping_trolley')
  37. ->where('user_id',$this->uid)
  38. ->where('num','>',0)
  39. ->where('is_integral',$source)
  40. ->limit($this->off_set,$this->page_num)
  41. ->order('id desc')
  42. ->select();
  43. array_walk($list,function (&$val){
  44. $val['error_code'] = $this->checkGoods($val['goods_id'],$val['goods_no'])['error_code'];
  45. });
  46. $this->success('ok',['list'=>$list]);
  47. }
  48. /**
  49. * @title 获取购物车列表(提交订单页面)
  50. * @desc 获取购物车列表(提交订单页面)
  51. * @author qc
  52. * @url /api/Shoppingcar/getCommitList
  53. * @method GET
  54. * @header name:Authorization require:1 desc:Token
  55. * @param name:ids type:string : default:1 desc:购物车记录id串(逗号分开)
  56. * @param name:source type:int : default:0 desc:购物车类型:0商城购物车,1积分购物车
  57. * @return name:id type:int default:-- desc:记录id
  58. * @return name:user_id type:int default:-- desc:会员id
  59. * @return name:goods_id type:int default:-- desc:商品id
  60. * @return name:goods_no type:string default:-- desc:货号
  61. * @return name:num type:int default:-- desc:商品数量
  62. * @return name:is_integral type:int default:-- desc:是否是积分商品
  63. * @return name:error_code type:int default:-- desc:错误码(0商品正常,1商品下架,2规格下架)
  64. */
  65. public function getCommitList()
  66. {
  67. $source = input('source',0);
  68. $ids = input('ids',0);
  69. if(!in_array($source,[0,1])) $this->error('购物车类型错误');
  70. if(!$ids) $this->error('请选择商品');
  71. $ids_arr = explode(',',$ids);
  72. $list = Db::table('shopping_trolley')
  73. ->where('user_id',$this->uid)
  74. ->where('id',$ids_arr)
  75. ->where('num','>',0)
  76. ->where('is_integral',$source)
  77. ->order('id desc')
  78. ->select();
  79. array_walk($list,function (&$val){
  80. $val['error_code'] = $this->checkGoods($val['goods_id'],$val['goods_no'])['error_code'];
  81. });
  82. $this->success('ok',['list'=>$list]);
  83. }
  84. /**
  85. * 验证商品
  86. * @param $goods_id
  87. * @param $goods_no
  88. * @return array
  89. * @throws \think\db\exception\DataNotFoundException
  90. * @throws \think\db\exception\ModelNotFoundException
  91. * @throws \think\exception\DbException
  92. */
  93. function checkGoods($goods_id,$goods_no){
  94. $ret_data = ['error_code'=>0,'num'=>0,'goods_info'=>[]];
  95. $goods_info = Db::table('store_goods')
  96. ->field('id,spec,stock,is_integral')
  97. ->where(['id'=>$goods_id,'status'=>1,'is_deleted'=>0])
  98. ->find();
  99. if(empty($goods_info)){
  100. $ret_data['error_code'] = 1;
  101. }else{
  102. $key= array_search($goods_no,array_column(json_decode($goods_info['spec'],true),'goods_no'));
  103. if($key === false) $ret_data['error_code'] = 2;
  104. foreach (json_decode($goods_info['spec'],true) as $c){
  105. if($c['goods_no'] == $goods_no) {
  106. $ret_data['num'] =$c['store_num'];
  107. break;
  108. }
  109. }
  110. $ret_data['goods_info'] = $goods_info;
  111. }
  112. return $ret_data;
  113. }
  114. /**
  115. * @title 更改购物车商品数量
  116. * @desc 更改购物车商品数量
  117. * @author qc
  118. * @url /api/Shoppingcar/changeNum
  119. * @method GET
  120. * @header name:Authorization require:1 desc:Token
  121. * @param name:id type:int : default:-- desc:购物车记录id
  122. * @param name:num type:int : default:20 desc:变更数量(减少数量是负数)
  123. */
  124. public function changeNum()
  125. {
  126. $id = input('post.id');
  127. $num = input('post.num');
  128. $car_info = Db::table('shopping_trolley')->find($id);
  129. $ck_ret = $this->checkGoods($car_info['goods_id'],$car_info['goods_no']);
  130. if($ck_ret['error_code'] == 1) $this->error('商品已经下架');
  131. if($ck_ret['error_code'] == 2) $this->error('该规格已经下架');
  132. if( $num > 0 && ($ck_ret['num'] < $num || $ck_ret['goods_info']['stock'] < $num ) ) $this->error('库存不足');
  133. Db::startTrans();
  134. if( $num + $car_info['num'] == 0){
  135. $up1 = Db::table('shopping_trolley')->where(['id'=>$id])->delete();
  136. }else{
  137. $up1 = Db::table('shopping_trolley')->where(['id'=>$id])->update(['num'=>$num + $car_info['num']]);
  138. }
  139. // 商品规格详情
  140. $spec = json_decode($ck_ret['goods_info']['spec'],true);
  141. foreach ($spec as &$pv) {
  142. if($pv['goods_no'] == $car_info['goods_no']) {
  143. $pv['store_num']+=$num;
  144. }
  145. }
  146. $up2 = Db::table('store_goods')
  147. ->where(['id'=>$car_info['goods_id']])
  148. ->update(['stock'=>$ck_ret['goods_info']['stock']+$num,'spec'=>json_encode($spec)]);
  149. if(!$up1 || !$up2) {
  150. Db::rollback();
  151. $this->error('修改失败');
  152. }else{
  153. Db::commit();
  154. $this->success('修改成功');
  155. }
  156. }
  157. /**
  158. * @title 批量删除购物车记录
  159. * @desc 批量删除购物车记录
  160. * @author qc
  161. * @url /api/Shoppingcar/cancelTrolley
  162. * @method POST
  163. * @header name:Authorization require:1 desc:Token
  164. * @param name:ids type:int : default:-- desc:购物车记录id串(1,2,3)
  165. */
  166. public function cancelTrolley()
  167. {
  168. $ids = input('post.ids');
  169. if(!$ids) $this->error('请选择要删除的记录');
  170. $id_arr = explode(',',$ids);
  171. foreach ($id_arr as $id) {
  172. Db::startTrans();
  173. $car_info =Db::table('shopping_trolley')->where(['user_id'=>$this->uid,'id'=>$id])->find();
  174. $ck_ret = $this->checkGoods($car_info['goods_id'],$car_info['goods_no']);
  175. if($ck_ret['error_code'] == 0) {
  176. // 商品规格详情
  177. $spec = json_decode($ck_ret['goods_info']['spec'],true);
  178. foreach ($spec as &$pv) {
  179. if($pv['goods_no'] == $car_info['goods_no']) {
  180. $pv['store_num']+=$car_info['num'];// 追加库存
  181. }
  182. }
  183. // 更新商品库存
  184. $up2 = Db::table('store_goods')->where(['id'=>$car_info['goods_id']])
  185. ->update(['stock'=>$ck_ret['goods_info']['stock']+$car_info['num'],'spec'=>json_encode($spec)]);
  186. }else{
  187. $up2 = true;
  188. }
  189. $up1 = Db::table('shopping_trolley')->where(['id'=>$id])->delete();// 删除记录
  190. if(!$up1 || !$up2) {
  191. Db::rollback();
  192. }else{
  193. Db::commit();
  194. }
  195. }
  196. $this->success('ok');
  197. }
  198. /**
  199. * @title 添加购物车
  200. * @desc 添加购物车
  201. * @author qc
  202. * @url /api/Shoppingcar/modifyTrolley
  203. * @method POST
  204. * @header name:Authorization require:1 desc:Token
  205. * @param name:goods_id type:int require:1 default:-- desc:商品id
  206. * @param name:goods_no type:string require:1 default:-- desc:货号
  207. * @param name:num type:string require:1 default:1 desc:变更数量
  208. * @return name:id type:int default:-- desc:记录id
  209. * @return name:user_id type:int default:-- desc:会员id
  210. * @return name:goods_id type:int default:-- desc:商品id
  211. * @return name:goods_no type:string default:-- desc:货号
  212. * @return name:num type:int default:-- desc:商品数量
  213. * @return name:is_integral type:int default:-- desc:是否是积分商品
  214. */
  215. public function modifyTrolley(){
  216. $goods_id = input('post.goods_id');
  217. $goods_no = input('post.goods_no');
  218. $num = input('post.num',1);
  219. $ck_ret = $this->checkGoods($goods_id,$goods_no);
  220. if($ck_ret['error_code'] == 1) $this->error('商品已经下架');
  221. if($ck_ret['error_code'] == 2) $this->error('该规格已经下架');
  222. if($num > $ck_ret['num'] ) $this->error('库存不足');
  223. $car_info = Db::table('shopping_trolley')
  224. ->where(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no])
  225. ->find();
  226. Db::startTrans();
  227. // 更新购物车
  228. if(empty($car_info)) {
  229. Db::table('shopping_trolley')->insert(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no,'num'=>$num,'create_at'=>date("Y-m-d H:i:s"),'is_integral'=>$ck_ret['goods_info']['is_integral']]);
  230. $res1 = Db::getLastInsID();
  231. }else{
  232. if($num + $car_info['num'] == 0 ) {
  233. $res1 = Db::table('shopping_trolley')->where(['id'=>$car_info['id']])->delete();
  234. }else{
  235. $res1 = Db::table('shopping_trolley')->where(['id'=>$car_info['id']])->update(['num'=>$num + $car_info['num']]);
  236. }
  237. }
  238. // 更新库存
  239. $res2 = update_goods_stock($goods_id,$goods_no,$num);
  240. var_dump($res1 ,$res2);
  241. if(!$res1 || !$res2){
  242. Db::rollback();
  243. $this->error('操作失败');
  244. }else{
  245. $ret = Db::table('shopping_trolley')
  246. ->where(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no])
  247. ->find();
  248. $this->success('ok',$ret);
  249. }
  250. }
  251. public function changeGoods()
  252. {
  253. return $this->batchValidate;
  254. }
  255. /**
  256. * @title 验证商品是否已经加到购物车
  257. * @desc 验证商品是否已经加到购物车
  258. * @author qc
  259. * @url /api/Shoppingcar/checkTrolley
  260. * @method GET
  261. * @header name:Authorization require:1 desc:Token
  262. * @param name:goods_id type:int require:1 default:-- desc:商品id
  263. * @param name:goods_no type:string require:1 default:-- desc:货号
  264. * @return name:id type:int default:-- desc:记录id
  265. * @return name:user_id type:int default:-- desc:会员id
  266. * @return name:goods_id type:int default:-- desc:商品id
  267. * @return name:goods_no type:string default:-- desc:货号
  268. * @return name:num type:int default:-- desc:商品数量
  269. * @return name:is_integral type:int default:-- desc:是否是积分商品
  270. */
  271. public function checkTrolley()
  272. {
  273. $goods_id = input('post.goods_id');
  274. $goods_no = input('post.goods_no');
  275. if(!$goods_id || !$goods_no ) $this->error('请选择商品');
  276. $detail = Db::table('shopping_trolley')
  277. ->where(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no])
  278. ->find();
  279. $this->success('ok',$detail);
  280. }
  281. }