Files
2026-04-14 17:46:22 +08:00

311 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}