其余文件
This commit is contained in:
311
app/api/logic/CartLogic.php
Normal file
311
app/api/logic/CartLogic.php
Normal file
@ -0,0 +1,311 @@
|
||||
<?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;
|
||||
}
|
||||
// 添加检查:确保goods和goods_item存在且不为null
|
||||
if (empty($cart['goods']) || $cart['goods']['del'] != 0) {
|
||||
continue;
|
||||
}
|
||||
// 如果goods_item不存在,则跳过或处理默认值
|
||||
if (empty($cart['goods_item'])) {
|
||||
// 可以选择跳过该记录或设置默认值
|
||||
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'],
|
||||
];
|
||||
}
|
||||
|
||||
//已到期商家所有商品不可选中
|
||||
$is_pay = $cart['shop']['is_pay'] ?? 0;
|
||||
if(strtotime($cart['shop']['expire_time']) < time() || $cart['shop']['is_run'] == 0 || $cart['shop']['is_freeze'] == 1) {
|
||||
$cart['selected'] = 0;
|
||||
$is_pay = 0;
|
||||
}
|
||||
|
||||
$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'] ?? 0,
|
||||
'goods_del' => $cart['goods']['del'] ?? 1,
|
||||
'spec_value_str' => $cart['goods_item']['spec_value_str'] ?? '请重新选择规格',
|
||||
'price' => $cart['goods_item']['price'] ?? 0,
|
||||
'stock' => $cart['goods_item']['stock'] ?? 0,
|
||||
'selected' => intval($cart['selected']),
|
||||
'item_id' => $cart['item_id'],
|
||||
'sub_price' => $sub_price,
|
||||
'is_pay' => $is_pay,
|
||||
'has_item' => empty($cart['goods_item']) ? 0 : 1, //是否有规格信息
|
||||
];
|
||||
}
|
||||
|
||||
if (empty($shop_info)) {
|
||||
unset($lists[$shop_id]);
|
||||
continue;
|
||||
}
|
||||
|
||||
$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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user