ShopCart.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <?php namespace App\Http\Controllers\Api;
  2. use App\Http\Controllers\Api\Api;
  3. use App\Http\Requests\Api\ShopCart as Request;
  4. use App\Models\Product\Skus as ProductSkus;
  5. use App\Models\PromoRebate;
  6. use App\Models\ShopCart as Model;
  7. use App\Models\PromoProduct as PromoProduct;
  8. use App\Models\Custom as Custom;
  9. use App\Models\Work\Tag as WorkTag;
  10. /**
  11. * 购物车接口
  12. *
  13. * @author 刘相欣
  14. *
  15. * */
  16. class ShopCart extends Api{
  17. /**
  18. * 添加 /api/shop_cart/add
  19. *
  20. * @param int $product_id 产品ID
  21. * @param int $buy_num 添加数量
  22. *
  23. * */
  24. public function add(Request $request,Model $Model){
  25. // 接口验签
  26. // $this->verify_sign();
  27. // 验证参数
  28. $request->scene('add')->validate();
  29. // 检查登录
  30. $uid = $this->checkLogin();
  31. // 接收参数
  32. $data['product_id'] = request('product_id',0);
  33. $data['skuid'] = request('skuid',0);
  34. $data['buy_num'] = request('buy_num',1);
  35. $data['custom_uid'] = $uid;
  36. // 查询
  37. $id = $Model->query()->where([['custom_uid','=',$uid],['product_id','=',$data['product_id']],['skuid','=',$data['skuid']]])->value('id');
  38. // 如果存在id,更新数量
  39. $result = $id ? $Model->incrBuyNum($id,$uid,$data['buy_num']) : $Model->add($data);
  40. // 提交结果
  41. if( !$result ) return json_send(['code'=>'success','msg'=>'加入购物车失败','data'=>['error'=>'加入购物车失败']]);
  42. // 返回结果
  43. return json_send(['code'=>'success','msg'=>'添加成功','data'=>$data]);
  44. }
  45. /**
  46. * 更新 /api/shop_cart/edit
  47. *
  48. * @param int $id 购物车id
  49. *
  50. * */
  51. public function edit(Request $request,Model $Model){
  52. // 接口验签
  53. // $this->verify_sign();
  54. // 验证参数
  55. $request->scene('edit')->validate();
  56. // 检查登录
  57. $uid = $this->checkLogin();
  58. // 接收参数
  59. $id = request('id',0);
  60. $data['buy_num'] = request('buy_num',1);
  61. // 如果存在id,更新数量
  62. $result = $Model->edit($id,$uid,$data);
  63. // 提交结果
  64. if( !$result ) return json_send(['code'=>'success','msg'=>'更新失败','data'=>['error'=>'更新购物车失败']]);
  65. // 返回结果
  66. return json_send(['code'=>'success','msg'=>'更新成功','data'=>$data]);
  67. }
  68. /**
  69. * 更新 /api/shop_cart/del
  70. *
  71. * @param int $id 购物车id
  72. *
  73. * */
  74. public function del(Request $request,Model $Model){
  75. // 接口验签
  76. // $this->verify_sign();
  77. // 验证参数
  78. $request->scene('del')->validate();
  79. // 检查登录
  80. $uid = $this->checkLogin();
  81. // 接收参数
  82. $id = request('id',0);
  83. // 如果存在id,更新数量
  84. $result = $Model->del($id,$uid);
  85. // 提交结果
  86. if( !$result ) return json_send(['code'=>'success','msg'=>'删除失败','data'=>['error'=>'删除购物车失败']]);
  87. // 返回结果
  88. return json_send(['code'=>'success','msg'=>'删除成功','data'=>['id'=>$id]]);
  89. }
  90. /**
  91. * 获取列表 /api/shop_cart/get_list
  92. *
  93. * @param int $id 购物车id
  94. *
  95. * */
  96. public function get_list(Request $request,Model $Model,ProductSkus $ProductSkus,PromoProduct $PromoProduct,Custom $Custom,WorkTag $WorkTag){
  97. // 接口验签
  98. // $this->verify_sign();
  99. // 验证参数
  100. $request->scene('get_list')->validate();
  101. // 检查登录
  102. $uid = $this->checkLogin();
  103. // 获取客户信息
  104. $custom = $uid ? $Custom->getOne($uid) : [];
  105. // 显示
  106. $map = [['shop_cart.custom_uid','=',$uid]];
  107. // 查询
  108. $list = $Model->query()->join('product','shop_cart.product_id','=','product.id')->where($map)->get(['shop_cart.id','shop_cart.checked','shop_cart.product_id','shop_cart.skuid','shop_cart.buy_num','product.stock','product.spec','product.thumb','product.name','product.price','product.market_price','product.status as product_status'])->toArray();
  109. // 判断结果
  110. $skusList = $ProductSkus->getListByIds(array_column($list,'skuid'));
  111. //查询产品活动
  112. $promoList = $PromoProduct->getListByIds(array_column($list,'product_id'));
  113. // 查询用户标签
  114. $tags = [];
  115. $cityId = '';
  116. if ($custom){
  117. $tags = $WorkTag->getListByExtid($custom['external_userid']);
  118. $cityId = $custom['city_id'];
  119. }
  120. // 循环处理数据
  121. foreach ($list as $key => $value) {
  122. // 如果有sku
  123. if( $value['skuid'] ) {
  124. // 是否存在
  125. $isExist = false;
  126. // 循环SKU
  127. foreach ($skusList as $sku) {
  128. // 如果SKU存在的话
  129. if( $sku['sku_id'] == $value['skuid'] ) {
  130. $value['price'] = $sku['price'];
  131. $value['spec'] = $sku['sku_attr_names'];
  132. $value['stock'] = $sku['stock'];
  133. $isExist = true;
  134. }
  135. }
  136. // 如果不存在,状态变动
  137. if( !$isExist ) $value['product_status'] = 4;
  138. }
  139. if ($promoList && $cityId){
  140. if (isset($promoList[$value['product_id']])){
  141. $promoInfo = $promoList[$value['product_id']];
  142. $promoTitle = "满". $promoInfo['std_pay']. "元";
  143. if ($promoInfo['rebate_type'] == 1){
  144. $promoTitle .= "减". $promoInfo['rebate']. "元";
  145. }elseif ($promoInfo['rebate_type'] == 2){
  146. $promoTitle .= "打". $promoInfo['rebate']. "折";
  147. }elseif ($promoInfo['rebate_type'] == 3){
  148. $rebate = (string) PromoRebate::query()->join('product','promo_rebate.product_id','=','product.id')->where([['promo_id','=',$promoInfo['id']]])->value('product.name');
  149. $promoTitle .= "赠送". $rebate;
  150. }
  151. $promoInfoCity = [];
  152. if ($promoInfo['city_ids']){
  153. $promoInfoCity = explode(',',$promoInfo['city_ids']);
  154. }
  155. // 判断是不是可以参与
  156. if (!$promoInfoCity || in_array($cityId,$promoInfoCity)){
  157. if( $promoInfo['tag_scope']) {
  158. // 解析数组
  159. $promoInfo['tag_scope'] = explode(',',$promoInfo['tag_scope']);
  160. // 标签范围限定时,默认不能参与
  161. $allowJoin = 0;
  162. // 判断标签是不是存在
  163. if ($tags){
  164. foreach ($tags as $v) {
  165. // 标签范围内,允许参加
  166. if( in_array($v['name'],$promoInfo['tag_scope']) ) $allowJoin = 1;
  167. }
  168. // 在范围
  169. if( $allowJoin ) {
  170. $value['promo_title'] = $promoTitle;
  171. }
  172. }
  173. }else{
  174. $value['promo_title'] = $promoTitle;
  175. }
  176. }
  177. }
  178. }
  179. // 产品图路径
  180. $value['thumb'] = path_compat($value['thumb']);
  181. // 库存超出的时候
  182. if($value['buy_num'] > $value['stock'] ) $value['buy_num'] = $value['stock'];
  183. // 重组
  184. $list[$key] = $value;
  185. }
  186. // 返回结果
  187. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$list]);
  188. }
  189. /**
  190. * 结算列表 /api/shop_cart/check_list
  191. *
  192. * @param int $id 购物车id
  193. *
  194. * */
  195. public function check_list(Request $request,Model $Model,ProductSkus $ProductSkus,PromoProduct $PromoProduct,Custom $Custom,WorkTag $WorkTag){
  196. // 接口验签
  197. // $this->verify_sign();
  198. // 验证参数
  199. $request->scene('check_list')->validate();
  200. // 检查登录
  201. $uid = $this->checkLogin();
  202. // 获取客户信息
  203. $custom = $uid ? $Custom->getOne($uid) : [];
  204. // 接收参数
  205. $cartIds = request('cart_ids','');
  206. // 转成数组
  207. $cartIds = explode(',',$cartIds);
  208. // 循环处理
  209. foreach ($cartIds as $key => $value) {
  210. // 如果不是数值
  211. if( $value < 1 ) unset($cartIds[$key]);
  212. }
  213. // 如果不存在的话
  214. if( !$cartIds ) return json_send(['code'=>'error','msg'=>'请选择可用产品','data'=>['error'=>request('cart_ids','')]]);
  215. // 显示
  216. $map = [['shop_cart.custom_uid','=',$uid],['product.status','=',0]];
  217. // 查询
  218. $list = $Model->query()->join('product','shop_cart.product_id','=','product.id')->whereIn('shop_cart.id',$cartIds)->where($map)->get(['shop_cart.id','shop_cart.checked','shop_cart.product_id','shop_cart.skuid','shop_cart.buy_num','product.stock','product.spec','product.thumb','product.name','product.price','product.market_price','product.status as product_status'])->toArray();
  219. // 判断结果
  220. $skusList = $ProductSkus->getListByIds(array_column($list,'skuid'));
  221. //查询产品活动
  222. $promoList = $PromoProduct->getListByIds(array_column($list,'product_id'));
  223. // 查询用户标签
  224. $tags = [];
  225. $cityId = '';
  226. if ($custom){
  227. $tags = $WorkTag->getListByExtid($custom['external_userid']);
  228. $cityId = $custom['city_id'];
  229. }
  230. $promoProductList = [];
  231. // 循环处理数据
  232. foreach ($list as $key => $value) {
  233. // 如果有sku
  234. if( $value['skuid'] ) {
  235. // 是否存在
  236. $isExist = false;
  237. // 循环SKU
  238. foreach ($skusList as $sku) {
  239. // 如果SKU存在的话
  240. if( $sku['sku_id'] == $value['skuid'] ) {
  241. $value['price'] = $sku['price'];
  242. $value['spec'] = $sku['sku_attr_names'];
  243. $value['stock'] = $sku['stock'];
  244. $isExist = true;
  245. }
  246. }
  247. // 如果不存在,状态变动
  248. if( !$isExist ) {
  249. unset($list[$key]);
  250. continue;
  251. }
  252. }
  253. // 如果不存在,状态变动
  254. if( $value['stock'] <= 0 ) {
  255. unset($list[$key]);
  256. continue;
  257. }
  258. if ($promoList && $cityId){
  259. if (isset($promoList[$value['product_id']])){
  260. $promoInfo = $promoList[$value['product_id']];
  261. $promoInfo['price'] = $value['price'] * $value['buy_num'];
  262. $promoTitle = "满". $promoInfo['std_pay']. "元";
  263. if ($promoInfo['rebate_type'] == 1){
  264. $promoTitle .= "减". $promoInfo['rebate']. "元";
  265. }elseif ($promoInfo['rebate_type'] == 2){
  266. $promoTitle .= "打". $promoInfo['rebate']. "折";
  267. }elseif ($promoInfo['rebate_type'] == 3){
  268. $rebate = (string) PromoRebate::query()->join('product','promo_rebate.product_id','=','product.id')->where([['promo_id','=',$promoInfo['id']]])->value('product.name');
  269. $promoTitle .= "赠送". $rebate;
  270. }
  271. $promoInfoCity = [];
  272. if ($promoInfo['city_ids']){
  273. $promoInfoCity = explode(',',$promoInfo['city_ids']);
  274. }
  275. // 判断是不是可以参与
  276. if (!$promoInfoCity || in_array($cityId,$promoInfoCity)){
  277. if( $promoInfo['tag_scope']) {
  278. // 解析数组
  279. $promoInfo['tag_scope'] = explode(',',$promoInfo['tag_scope']);
  280. // 标签范围限定时,默认不能参与
  281. $allowJoin = 0;
  282. // 判断标签是不是存在
  283. if ($tags){
  284. foreach ($tags as $v) {
  285. // 标签范围内,允许参加
  286. if( in_array($v['name'],$promoInfo['tag_scope']) ) $allowJoin = 1;
  287. }
  288. // 在范围
  289. if( $allowJoin ) {
  290. $value['promo_title'] = $promoTitle;
  291. $promoProductList[$promoInfo['id']][] = $promoInfo;
  292. }
  293. }
  294. }else{
  295. $value['promo_title'] = $promoTitle;
  296. $promoProductList[$promoInfo['id']][] = $promoInfo;
  297. }
  298. }
  299. }
  300. }
  301. // 产品图路径
  302. $value['thumb'] = path_compat($value['thumb']);
  303. // 库存超出的时候
  304. if($value['buy_num'] > $value['stock'] ) $value['buy_num'] = $value['stock'];
  305. // 重组
  306. $list[$key] = $value;
  307. }
  308. $promoRebateIds = [];
  309. //满折扣
  310. $discount = 0;
  311. //满减
  312. $reduction = 0;
  313. //计算产品促销活动优惠价格
  314. if ($promoProductList){
  315. foreach ($promoProductList as $key => $value){
  316. $priceSum = array_sum(array_column($value,'price'));
  317. if ($priceSum >= $value[0]['std_pay']) {
  318. switch ($value[0]['rebate_type']){
  319. case 1:
  320. $reduction += $value[0]['rebate'];
  321. break;
  322. case 2:
  323. $discount += $priceSum - number_format($priceSum * $value[0]['rebate']/10,2);
  324. break;
  325. case 3:
  326. $promoRebateIds[] = $key;
  327. }
  328. }
  329. }
  330. }
  331. $promoRebateList = [];
  332. //如果有赠品
  333. if ($promoRebateIds){
  334. $promoRebateList = PromoRebate::query()
  335. ->join('product','promo_rebate.product_id','=','product.id')
  336. ->where('status','=',0)
  337. ->whereIn('promo_id',$promoRebateIds)
  338. ->select(['promo_rebate.id as promo_rebate_id','promo_rebate.rebate_num as buy_num','product.stock','product.spec','product.thumb','product.name','product.price','product.market_price','product.status as product_status'])
  339. ->get()
  340. ->toArray();
  341. if ($promoRebateList){
  342. foreach ($promoRebateList as &$value){
  343. // 产品图路径
  344. $value['thumb'] = path_compat($value['thumb']);
  345. // 库存超出的时候
  346. if($value['buy_num'] > $value['stock'] && $value['stock'] > 0) $value['buy_num'] = $value['stock'];
  347. }
  348. }
  349. }
  350. $discount = number_format($discount,2);
  351. // 重组数组
  352. $list = array_values($list);
  353. // 返回结果
  354. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$list,'discount'=>$discount,'reduction'=>$reduction,'promoRebateList'=>$promoRebateList]);
  355. }
  356. }