ShopCart.php 15 KB

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