Shoppingcar.php 13 KB

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