Shoppingcar.php 13 KB

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