289 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			289 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | likeshop开源商城系统
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
 | |||
|  | // | gitee下载:https://gitee.com/likeshop_gitee
 | |||
|  | // | github下载:https://github.com/likeshop-github
 | |||
|  | // | 访问官网:https://www.likeshop.cn
 | |||
|  | // | 访问社区:https://home.likeshop.cn
 | |||
|  | // | 访问手册:http://doc.likeshop.cn
 | |||
|  | // | 微信公众号:likeshop技术社区
 | |||
|  | // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
 | |||
|  | // |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
 | |||
|  | // | 禁止对系统程序代码以任何目的,任何形式的再发布
 | |||
|  | // | likeshop团队版权所有并拥有最终解释权
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | author: likeshop.cn.team
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | 
 | |||
|  | 
 | |||
|  | namespace app\api\logic; | |||
|  | use app\common\{ | |||
|  |     enum\GoodsEnum, | |||
|  |     model\Cart, | |||
|  |     basics\Logic, | |||
|  |     model\goods\Goods, | |||
|  |     enum\FootprintEnum | |||
|  | }; | |||
|  | 
 | |||
|  | /** | |||
|  |  * 购物车逻辑层 | |||
|  |  * Class CartLogic | |||
|  |  * @package app\api\logic | |||
|  |  */ | |||
|  | class CartLogic extends Logic | |||
|  | { | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 购物车列表 | |||
|  |      * @param $user_id | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author cjhao | |||
|  |      * @date 2021/9/7 10:23 | |||
|  |      */ | |||
|  |     public static function lists($user_id) | |||
|  |     { | |||
|  |         $carts = Cart::with(['goods', 'goods_item', 'shop']) | |||
|  |             ->where('user_id', $user_id) | |||
|  |             ->order('id desc') | |||
|  |             ->select()->toArray(); | |||
|  | 
 | |||
|  |         $goods_num = 0; | |||
|  |         $total = 0; | |||
|  |         $lists = []; | |||
|  | 
 | |||
|  |         $shop_ids = array_unique(array_column($carts, 'shop_id')); | |||
|  | 
 | |||
|  |         foreach ($shop_ids as $shop_id) { | |||
|  | 
 | |||
|  |             $lists[$shop_id]['is_selected'] = 1; | |||
|  |             $shop_info = $cart_lists = []; | |||
|  | 
 | |||
|  |             foreach ($carts as $k => $cart) { | |||
|  |                 if ($shop_id != $cart['shop_id']) { | |||
|  |                     continue; | |||
|  |                 } | |||
|  |                 if (empty($shop_info)) { | |||
|  |                     $shop_info = [ | |||
|  |                         'shop_id'   => $cart['shop']['id'], | |||
|  |                         'shop_name' => $cart['shop']['name'], | |||
|  |                         'type'      => $cart['shop']['type'], | |||
|  |                         'is_pay'    => $cart['shop']['is_pay'], | |||
|  |                     ]; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 $sub_price = 0; // 已选中 && 上架 && 未删除 && 规格信息不为空 && 商家支付功能开启
 | |||
|  |                 if ($cart['selected'] == 1 && $cart['goods']['status'] == 1 && $cart['goods']['del'] == 0 | |||
|  |                     && !empty($cart['goods_item']) && $cart['shop']['is_pay']) | |||
|  |                 { | |||
|  |                     $goods_num += $cart['goods_num']; | |||
|  |                     $total += $cart['goods_item']['price'] * $cart['goods_num']; | |||
|  |                     $sub_price = round($cart['goods_item']['price'] * $cart['goods_num'], 2); | |||
|  |                 } else { | |||
|  |                     $cart['selected'] = 0; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 设置商家选中状态; 满足条件(未选中的商品,上架,未删除,有规格信息,商家支付功能开启) 才影响商家选中状态
 | |||
|  |                 if(!$cart['selected']) { | |||
|  |                     if ($cart['goods']['status'] == 1 && $cart['goods']['del'] == 0 | |||
|  |                         && !empty($cart['goods_item']) && $cart['shop']['is_pay']) { | |||
|  |                         $lists[$shop_id]['is_selected'] = 0; | |||
|  |                     } | |||
|  |                 } | |||
|  | 
 | |||
|  |                 $cart_lists[] = [ | |||
|  |                     'cart_id'           => $cart['id'], | |||
|  |                     'goods_id'          => $cart['goods_id'], | |||
|  |                     'goods_name'        => $cart['goods']['name'], | |||
|  |                     'image'             => empty($cart['goods_item']['image']) ? $cart['goods']['image'] : $cart['goods_item']['image'], | |||
|  |                     'goods_num'         => $cart['goods_num'], | |||
|  |                     'goods_status'      => $cart['goods']['status'], | |||
|  |                     'goods_del'         => $cart['goods']['del'], | |||
|  |                     'spec_value_str'    => $cart['goods_item']['spec_value_str'] ?? '请重新选择规格', | |||
|  |                     'price'             => $cart['goods_item']['price'], | |||
|  |                     'stock'             => $cart['goods_item']['stock'], | |||
|  |                     'selected'          => intval($cart['selected']), | |||
|  |                     'item_id'           => $cart['item_id'], | |||
|  |                     'sub_price'         => $sub_price, | |||
|  |                     'is_pay'            => $cart['shop']['is_pay'], | |||
|  |                     'has_item'          => empty($cart['goods_item']) ? 0 : 1, //是否有规格信息
 | |||
|  |                 ]; | |||
|  |             } | |||
|  |             $lists[$shop_id]['shop'] = $shop_info; | |||
|  |             $lists[$shop_id]['cart'] = $cart_lists; | |||
|  |         } | |||
|  | 
 | |||
|  |         return [ | |||
|  |             'lists' => array_values($lists), | |||
|  |             'total_amount' => round($total, 2), | |||
|  |             'total_num' => $goods_num, | |||
|  |         ]; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * Notes: 添加 | |||
|  |      * @param $post | |||
|  |      * @param $user_id | |||
|  |      * @return bool | |||
|  |      * @author 段誉(2021/5/10 19:03) | |||
|  |      */ | |||
|  |     public static function add($post, $user_id) | |||
|  |     { | |||
|  |         try { | |||
|  |             $item_id = $post['item_id']; | |||
|  |             $goods_num = $post['goods_num']; | |||
|  | 
 | |||
|  |             $cart = Cart::where(['user_id' => $user_id, 'item_id' => $item_id])->find(); | |||
|  |             $cart_num = $post['goods_num'] + (isset($cart) ? $cart['goods_num'] : 0); | |||
|  | 
 | |||
|  |             $goods = self::checkCartGoods($item_id, $cart_num); | |||
|  |             if (false === $goods) { | |||
|  |                 throw new \Exception(self::getError() ?: '商品信息错误'); | |||
|  |             } | |||
|  | 
 | |||
|  |             if ($cart) { | |||
|  |                 //购物车内已有该商品
 | |||
|  |                 Cart::where(['id' => $cart['id'], 'shop_id' => $goods['shop_id']]) | |||
|  |                     ->update(['goods_num' => $goods_num + $cart['goods_num']]); | |||
|  |             } else { | |||
|  |                 //新增购物车记录
 | |||
|  |                 Cart::create([ | |||
|  |                     'user_id' => $user_id, | |||
|  |                     'goods_id' => $goods['id'], | |||
|  |                     'goods_num' => $goods_num, | |||
|  |                     'item_id' => $item_id, | |||
|  |                     'shop_id'  => $goods['shop_id'], | |||
|  |                 ]); | |||
|  |             } | |||
|  | 
 | |||
|  |             // 记录访问足迹
 | |||
|  |             event('Footprint', [ | |||
|  |                 'type'    => FootprintEnum::ADD_CART, | |||
|  |                 'user_id' => $user_id, | |||
|  |                 'foreign_id' => $goods['id'] | |||
|  |             ]); | |||
|  | 
 | |||
|  |             return true; | |||
|  |         } catch (\Exception $e) { | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * Notes: 变动数量 | |||
|  |      * @param $cart_id | |||
|  |      * @param $goods_num | |||
|  |      * @author 段誉(2021/5/11 11:59) | |||
|  |      * @return bool | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      */ | |||
|  |     public static function change($cart_id, $goods_num) | |||
|  |     { | |||
|  |         $cart = Cart::find($cart_id); | |||
|  |         $goods_num = ($goods_num <= 0) ? 1 : $goods_num; | |||
|  |         if (false === self::checkCartGoods($cart['item_id'], $goods_num)) { | |||
|  |             return false; | |||
|  |         } | |||
|  |         Cart::update(['goods_num' => $goods_num], ['id' => $cart_id]); | |||
|  |         return true; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * Notes: 删除 | |||
|  |      * @param $cart_id | |||
|  |      * @param $user_id | |||
|  |      * @author 段誉(2021/5/11 12:02) | |||
|  |      * @return bool | |||
|  |      */ | |||
|  |     public static function del($cart_id, $user_id) | |||
|  |     { | |||
|  |         return Cart::where(['id' => $cart_id, 'user_id' => $user_id])->delete(); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * Notes: 更改选中状态 | |||
|  |      * @param $post | |||
|  |      * @param $user_id | |||
|  |      * @author 段誉(2021/5/11 15:49) | |||
|  |      * @return Cart | |||
|  |      */ | |||
|  |     public static function selected($post, $user_id) | |||
|  |     { | |||
|  |         return Cart::where(['user_id' => $user_id, 'id' => $post['cart_id']]) | |||
|  |             ->update(['selected' => $post['selected']]); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * Notes: 购物车数量 | |||
|  |      * @param $user_id | |||
|  |      * @author 段誉(2021/5/11 12:07) | |||
|  |      * @return array | |||
|  |      */ | |||
|  |     public static function cartNum($user_id) | |||
|  |     { | |||
|  |         $cart = new Cart(); | |||
|  |         $num = $cart->alias('c') | |||
|  |             ->join('goods g', 'g.id = c.goods_id') | |||
|  |             ->join('goods_item i', 'i.id = c.item_id') | |||
|  |             ->where(['g.status' => 1, 'g.del' => 0, 'c.user_id' => $user_id]) | |||
|  |             ->sum('goods_num'); | |||
|  |         return ['num' => $num ?? 0]; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * Notes: 验证商品 | |||
|  |      * @param $item_id | |||
|  |      * @param $goods_num | |||
|  |      * @author 段誉(2021/5/11 11:59) | |||
|  |      * @return bool | |||
|  |      */ | |||
|  |     public static function checkCartGoods($item_id, $goods_num) | |||
|  |     { | |||
|  |         $goodsModel = new Goods(); | |||
|  |         $goods = $goodsModel->alias('g') | |||
|  |             ->with('shop') | |||
|  |             ->field('g.id, g.status, g.del, g.shop_id, g.type,i.stock') | |||
|  |             ->join('goods_item i', 'i.goods_id = g.id') | |||
|  |             ->where('i.id', $item_id) | |||
|  |             ->find(); | |||
|  | 
 | |||
|  |         if (!$goods['shop']['is_pay']) { | |||
|  |             self::$error = '该商家支付功能已关闭'; | |||
|  |             return false; | |||
|  |         } | |||
|  | 
 | |||
|  |         if (empty($goods) || $goods['status'] == 0 || $goods['del'] != 0) { | |||
|  |             self::$error = '商品不存在或已下架'; | |||
|  |             return false; | |||
|  |         } | |||
|  | 
 | |||
|  |         if ($goods['stock'] < $goods_num) { | |||
|  |             self::$error = '很抱歉,库存不足'; | |||
|  |             return false; | |||
|  |         } | |||
|  | 
 | |||
|  |         if ($goods['type'] == GoodsEnum::TYPE_VIRTUAL) { | |||
|  |             self::$error = '虚拟商品不可加入购物车'; | |||
|  |             return false; | |||
|  |         } | |||
|  | 
 | |||
|  |         return $goods; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  | } |