/**
 * 取得商品最终使用价格
 *
 * @param   string  $goods_id      商品编号
 * @param   string  $goods_num     购买数量
 * @param   boolean $is_spec_price 是否加入规格价格
 * @param   mix     $spec          规格ID的数组或者逗号分隔的字符串
 *
 * @return  商品最终购买价格
 */
function get_final_price($goods_id, $goods_num = '1', $is_spec_price = false, $spec = array())
{
    $final_price = '0';
    //商品最终购买价格
    $volume_price = '0';
    //商品优惠价格
    $promote_price = '0';
    //商品促销价格
    $user_price = '0';
    //商品会员价格
    //取得商品优惠价格列表
    $price_list = get_volume_price_list($goods_id, '1');
    if (!empty($price_list)) {
        foreach ($price_list as $value) {
            if ($goods_num >= $value['number']) {
                $volume_price = $value['price'];
            }
        }
    }
    //取得商品促销价格列表
    /* 取得商品信息 */
    $sql = "SELECT g.promote_price, g.promote_start_date, g.promote_end_date, " . "IFNULL(mp.user_price, g.shop_price * '" . $_SESSION['discount'] . "') AS shop_price " . " FROM " . $GLOBALS['ecs']->table('goods') . " AS g " . " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp " . "ON mp.goods_id = g.goods_id AND mp.user_rank = '" . $_SESSION['user_rank'] . "' " . " WHERE g.goods_id = '" . $goods_id . "'" . " AND g.is_delete = 0";
    $goods = $GLOBALS['db']->getRow($sql);
    /* 计算商品的促销价格 */
    if ($goods['promote_price'] > 0) {
        $promote_price = bargain_price($goods['promote_price'], $goods['promote_start_date'], $goods['promote_end_date']);
    } else {
        $promote_price = 0;
    }
    //取得商品会员价格列表
    $user_price = $goods['shop_price'];
    //比较商品的促销价格,会员价格,优惠价格
    if (empty($volume_price) && empty($promote_price)) {
        //如果优惠价格,促销价格都为空则取会员价格
        $final_price = $user_price;
    } elseif (!empty($volume_price) && empty($promote_price)) {
        //如果优惠价格为空时不参加这个比较。
        $final_price = min($volume_price, $user_price);
    } elseif (empty($volume_price) && !empty($promote_price)) {
        //如果促销价格为空时不参加这个比较。
        $final_price = min($promote_price, $user_price);
    } elseif (!empty($volume_price) && !empty($promote_price)) {
        //取促销价格,会员价格,优惠价格最小值
        $final_price = min($volume_price, $promote_price, $user_price);
    } else {
        $final_price = $user_price;
    }
    //如果需要加入规格价格
    if ($is_spec_price) {
        if (!empty($spec)) {
            $spec_price = spec_price($spec);
            $final_price += $spec_price;
        }
    }
    //返回商品最终购买价格
    return $final_price;
}
Beispiel #2
0
/**
 * 添加商品到购物车
 *
 * @access  public
 * @param   integer $goods_id   商品编号
 * @param   integer $num        商品数量
 * @param   array   $spec       规格值对应的id数组
 * @param   integer $parent     基本件
 * @return  boolean
 */
function addto_cart($goods_id, $num = 1, $spec = array(), $parent = 0)
{
    $GLOBALS['err']->clean();
    $_parent_id = $parent;
    /* 取得商品信息 */
    $sql = "SELECT g.goods_name, g.goods_sn, g.is_on_sale, g.is_real, " . "g.market_price, g.shop_price AS org_price, g.promote_price, g.promote_start_date, " . "g.promote_end_date, g.goods_weight, g.integral, g.extension_code, " . "g.goods_number, g.is_alone_sale, g.is_shipping, g.free_more, g.amount_desc, " . "IFNULL(mp.user_price, g.shop_price * '{$_SESSION['discount']}') AS shop_price " . " FROM " . $GLOBALS['ecs']->table('goods') . " AS g " . " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp " . "ON mp.goods_id = g.goods_id AND mp.user_rank = '{$_SESSION['user_rank']}' " . " WHERE g.goods_id = '{$goods_id}'" . " AND g.is_delete = 0";
    $goods = $GLOBALS['db']->getRow($sql);
    if (empty($goods)) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS);
        return false;
    }
    /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */
    if ($parent > 0) {
        $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') . " WHERE goods_id='{$parent}' AND " . get_cart_cond() . " AND extension_code <> 'package_buy'";
        if ($GLOBALS['db']->getOne($sql) == 0) {
            $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS);
            return false;
        }
    }
    /* 是否正在销售 */
    if ($goods['is_on_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE);
        return false;
    }
    /* 不是配件时检查是否允许单独销售 */
    if (empty($parent) && $goods['is_alone_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['cannt_alone_sale'], ERR_CANNT_ALONE_SALE);
        return false;
    }
    //TODO 取消规格相关逻辑
    /* 如果商品有规格则取规格商品信息 配件除外 */
    /*$sql = "SELECT * FROM " .$GLOBALS['ecs']->table('products'). " WHERE goods_id = '$goods_id' LIMIT 0, 1";
        $prod = $GLOBALS['db']->getRow($sql);
    
        if (is_spec($spec) && !empty($prod))
        {
            $product_info = get_products_info($goods_id, $spec);
        }
        if (empty($product_info))
        {
            $product_info = array('product_number' => '', 'product_id' => 0);
        }*/
    /* 检查:库存 */
    if ($GLOBALS['_CFG']['use_storage'] == 1) {
        //检查:商品购买数量是否大于总库存
        if ($num > $goods['goods_number']) {
            $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $goods['goods_number']), ERR_OUT_OF_STOCK);
            return false;
        }
        //商品存在规格 是货品 检查该货品库存
        if (is_spec($spec) && !empty($prod)) {
            if (!empty($spec)) {
                /* 取规格的货品库存 */
                if ($num > $product_info['product_number']) {
                    $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $product_info['product_number']), ERR_OUT_OF_STOCK);
                    return false;
                }
            }
        }
    }
    /* 计算商品的促销价格 */
    $spec_price = spec_price($spec);
    $goods_price = get_final_price($goods_id, $num, true, $spec);
    $goods['market_price'] += $spec_price;
    //商品规格
    $goods_attr_id = join(',', $spec);
    $goods_attr = get_goods_attr_info($spec);
    if (empty($goods_attr)) {
        $goods_attr = $goods['amount_desc'];
    } else {
        $goods_attr = $goods['amount_desc'] . "\n" . $goods_attr;
    }
    // 初始化要插入购物车的基本件数据
    $parent = array('user_id' => $_SESSION['user_id'], 'session_id' => SESS_ID, 'goods_id' => $goods_id, 'goods_sn' => addslashes($goods['goods_sn']), 'product_id' => $product_info['product_id'], 'goods_name' => addslashes($goods['goods_name']), 'market_price' => $goods['market_price'], 'free_more' => $goods['free_more'], 'goods_attr' => addslashes($goods_attr), 'goods_attr_id' => $goods_attr_id, 'is_real' => $goods['is_real'], 'extension_code' => $goods['extension_code'], 'is_gift' => 0, 'is_shipping' => $goods['is_shipping'], 'add_time' => time(), 'rec_type' => CART_GENERAL_GOODS);
    // 如果该配件在添加为基本件的配件时,所设置的“配件价格”比原价低,即此配件在价格上提供了优惠,
    // 则按照该配件的优惠价格卖,但是每一个基本件只能购买一个优惠价格的“该配件”,多买的“该配件”不享
    // 受此优惠
    //TODO: 取消配件逻辑
    /*$basic_list = array();
        $sql = "SELECT parent_id, goods_price " .
                "FROM " . $GLOBALS['ecs']->table('group_goods') .
                " WHERE goods_id = '$goods_id'" .
                " AND goods_price < '$goods_price'" .
                " AND parent_id = '$_parent_id'" .
                " ORDER BY goods_price";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res))
        {
            $basic_list[$row['parent_id']] = $row['goods_price'];
        }
    
        // 取得购物车中该商品每个基本件的数量
        $basic_count_list = array();
        if ($basic_list)
        {
            $sql = "SELECT goods_id, SUM(goods_number) AS count " .
                    "FROM " . $GLOBALS['ecs']->table('cart') .
                    " WHERE " . get_cart_cond() .
                    " AND parent_id = 0" .
                    " AND extension_code <> 'package_buy' " .
                    " AND goods_id " . db_create_in(array_keys($basic_list)) .
                    " GROUP BY goods_id";
            $res = $GLOBALS['db']->query($sql);
            while ($row = $GLOBALS['db']->fetchRow($res))
            {
                $basic_count_list[$row['goods_id']] = $row['count'];
            }
        }
    
        // 取得购物车中该商品每个基本件已有该商品配件数量,计算出每个基本件还能有几个该商品配件 
        // 一个基本件对应一个该商品配件 
        if ($basic_count_list)
        {
            $sql = "SELECT parent_id, SUM(goods_number) AS count " .
                    "FROM " . $GLOBALS['ecs']->table('cart') .
                    " WHERE " . get_cart_cond() .
                    " AND goods_id = '$goods_id'" .
                    " AND extension_code <> 'package_buy' " .
                    " AND parent_id " . db_create_in(array_keys($basic_count_list)) .
                    " GROUP BY parent_id";
            $res = $GLOBALS['db']->query($sql);
            while ($row = $GLOBALS['db']->fetchRow($res))
            {
                $basic_count_list[$row['parent_id']] -= $row['count'];
            }
        }
    
        // 循环插入配件 如果是配件则用其添加数量依次为购物车中所有属于其的基本件添加足够数量的该配件
        foreach ($basic_list as $parent_id => $fitting_price)
        {
            // 如果已全部插入,退出 
            if ($num <= 0)
            {
                break;
            }
    
            // 如果该基本件不再购物车中,执行下一个 
            if (!isset($basic_count_list[$parent_id]))
            {
                continue;
            }
    
            // 如果该基本件的配件数量已满,执行下一个基本件
            if ($basic_count_list[$parent_id] <= 0)
            {
                continue;
            }
    
            // 作为该基本件的配件插入
            $parent['goods_price']  = max($fitting_price, 0) + $spec_price; //允许该配件优惠价格为0
            $parent['goods_number'] = min($num, $basic_count_list[$parent_id]);
            $parent['parent_id']    = $parent_id;
    
            // 添加
            $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
    
            // 改变数量
            $num -= $parent['goods_number'];
        }*/
    /* 如果数量不为0,作为基本件插入 */
    if ($num > 0) {
        /* 检查该商品是否已经存在在购物车中 */
        $sql = "SELECT goods_number FROM " . $GLOBALS['ecs']->table('cart') . " WHERE " . get_cart_cond() . " AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . $goods_attr . "' " . " AND extension_code <> 'flash_sale' " . " AND rec_type = '" . CART_GENERAL_GOODS . "' AND group_id=''";
        //by mike add
        $row = $GLOBALS['db']->getRow($sql);
        if ($row) {
            $num += $row['goods_number'];
            if (is_spec($spec) && !empty($prod)) {
                $goods_storage = $product_info['product_number'];
            } else {
                $goods_storage = $goods['goods_number'];
            }
            if ($GLOBALS['_CFG']['use_storage'] == 0 || $num <= $goods_storage) {
                $goods_price = get_final_price($goods_id, $num, true, $spec);
                $sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET goods_number = '{$num}'" . " , goods_price = '{$goods_price}'" . " WHERE " . get_cart_cond() . " AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . $goods_attr . "' " . " AND extension_code <> 'flash_sale' " . "AND rec_type = '" . CART_GENERAL_GOODS . "' AND group_id=''";
                $GLOBALS['db']->query($sql);
            } else {
                $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $num), ERR_OUT_OF_STOCK);
                return false;
            }
        } else {
            $goods_price = get_final_price($goods_id, $num, true, $spec);
            $parent['goods_price'] = max($goods_price, 0);
            $parent['goods_number'] = $num;
            $parent['parent_id'] = 0;
            $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        }
    }
    /* 把赠品删除 */
    $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') . " WHERE " . get_cart_cond() . " AND is_gift <> 0";
    $GLOBALS['db']->query($sql);
    return true;
}
Beispiel #3
0
/**
 * 添加商品到购物车
 *
 * @access  public
 * @param   integer $goods_id   商品编号
 * @param   integer $num        商品数量
 * @param   array   $spec       规格值对应的id数组
 * @param   integer $parent     基本件
 * @return  boolean
 */
function addto_cart($goods_id, $num = 1, $spec = array(), $parent = 0)
{
    $GLOBALS['err']->clean();
    $_parent_id = $parent;
    /*ccx 2015-03-03 判断该商品是否已经通过自动下架功能 start*/
    $sql = "SELECT * FROM " . $GLOBALS['ecs']->table('auto_manage') . " WHERE item_id = {$goods_id} AND type = 'goods' ";
    $autodb = $GLOBALS['db']->getRow($sql);
    //print_r($autodb);exit;
    if ($autodb) {
        $where = " WHERE goods_id = '{$goods_id}'";
        if ($autodb['endtime'] < gmtime() && $autodb['endtime'] > 0) {
            $sql = "UPDATE " . $GLOBALS['ecs']->table('goods') . " SET is_on_sale = 0 {$where}";
            $GLOBALS['db']->query($sql);
            $sql_1 = "DELETE FROM " . $GLOBALS['ecs']->table('auto_manage') . "WHERE item_id = '{$goods_id}' AND type = 'goods'";
            $GLOBALS['db']->query($sql_1);
            $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE);
            return false;
        }
        //var_dump($up);
    }
    /*ccx 2015-03-03 end*/
    /* 取得商品信息 */
    $sql = "SELECT g.goods_name, g.goods_sn, g.is_on_sale, g.is_real, " . "g.market_price, g.shop_price AS org_price, g.promote_price, g.promote_start_date, " . "g.promote_end_date, g.goods_weight, g.integral, g.extension_code, " . "g.goods_number, g.is_alone_sale, g.is_shipping," . "IFNULL(mp.user_price, g.shop_price * '{$_SESSION['discount']}') AS shop_price " . " FROM " . $GLOBALS['ecs']->table('goods') . " AS g " . " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp " . "ON mp.goods_id = g.goods_id AND mp.user_rank = '{$_SESSION['user_rank']}' " . " WHERE g.goods_id = '{$goods_id}'" . " AND g.is_delete = 0";
    $goods = $GLOBALS['db']->getRow($sql);
    if (empty($goods)) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS);
        return false;
    }
    /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */
    if ($parent > 0) {
        $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') . " WHERE goods_id='{$parent}' AND session_id='" . SESS_ID . "' AND extension_code <> 'package_buy'";
        if ($GLOBALS['db']->getOne($sql) == 0) {
            $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS);
            return false;
        }
    }
    /* 是否正在销售 */
    if ($goods['is_on_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE);
        return false;
    }
    /* 不是配件时检查是否允许单独销售 */
    if (empty($parent) && $goods['is_alone_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['cannt_alone_sale'], ERR_CANNT_ALONE_SALE);
        return false;
    }
    /* 如果商品有规格则取规格商品信息 配件除外 */
    $sql = "SELECT * FROM " . $GLOBALS['ecs']->table('products') . " WHERE goods_id = '{$goods_id}' LIMIT 0, 1";
    $prod = $GLOBALS['db']->getRow($sql);
    if (is_spec($spec) && !empty($prod)) {
        $product_info = get_products_info($goods_id, $spec);
    }
    if (empty($product_info)) {
        $product_info = array('product_number' => '', 'product_id' => 0);
    }
    /* 检查:库存 */
    /* 2014-12-18 ccx 把购物的时候, 把检查库存这块屏蔽了, 不做库存判断
        if ($GLOBALS['_CFG']['use_storage'] == 1)
        {
            //检查:商品购买数量是否大于总库存
            if ($num > $goods['goods_number'])
            {
                $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $goods['goods_number']), ERR_OUT_OF_STOCK);
    
                return false;
            }
    
            //商品存在规格 是货品 检查该货品库存
            if (is_spec($spec) && !empty($prod))
            {
                if (!empty($spec))
                {
                    // 取规格的货品库存 
                    if ($num > $product_info['product_number'])
                    {
                        $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $product_info['product_number']), ERR_OUT_OF_STOCK);
        
                        return false;
                    }
                }
            }       
        }
        */
    /* 计算商品的促销价格 */
    $spec_price = spec_price($spec);
    $goods_price = get_final_price($goods_id, $num, true, $spec);
    $goods['market_price'] += $spec_price;
    $goods_attr = get_goods_attr_info($spec);
    $goods_attr_id = join(',', $spec);
    /* 初始化要插入购物车的基本件数据 */
    $parent = array('user_id' => $_SESSION['user_id'], 'session_id' => SESS_ID, 'goods_id' => $goods_id, 'goods_sn' => addslashes($goods['goods_sn']), 'product_id' => $product_info['product_id'], 'goods_name' => addslashes($goods['goods_name']), 'market_price' => $goods['market_price'], 'goods_attr' => addslashes($goods_attr), 'goods_attr_id' => $goods_attr_id, 'is_real' => $goods['is_real'], 'extension_code' => $goods['extension_code'], 'is_gift' => 0, 'is_shipping' => $goods['is_shipping'], 'rec_type' => CART_GENERAL_GOODS);
    /* 如果该配件在添加为基本件的配件时,所设置的“配件价格”比原价低,即此配件在价格上提供了优惠, */
    /* 则按照该配件的优惠价格卖,但是每一个基本件只能购买一个优惠价格的“该配件”,多买的“该配件”不享 */
    /* 受此优惠 */
    $basic_list = array();
    $sql = "SELECT parent_id, goods_price " . "FROM " . $GLOBALS['ecs']->table('group_goods') . " WHERE goods_id = '{$goods_id}'" . " AND goods_price < '{$goods_price}'" . " AND parent_id = '{$_parent_id}'" . " ORDER BY goods_price";
    $res = $GLOBALS['db']->query($sql);
    while ($row = $GLOBALS['db']->fetchRow($res)) {
        $basic_list[$row['parent_id']] = $row['goods_price'];
    }
    /* 取得购物车中该商品每个基本件的数量 */
    $basic_count_list = array();
    if ($basic_list) {
        $sql = "SELECT goods_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND parent_id = 0" . " AND extension_code <> 'package_buy' " . " AND goods_id " . db_create_in(array_keys($basic_list)) . " GROUP BY goods_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res)) {
            $basic_count_list[$row['goods_id']] = $row['count'];
        }
    }
    /* 取得购物车中该商品每个基本件已有该商品配件数量,计算出每个基本件还能有几个该商品配件 */
    /* 一个基本件对应一个该商品配件 */
    if ($basic_count_list) {
        $sql = "SELECT parent_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND goods_id = '{$goods_id}'" . " AND extension_code <> 'package_buy' " . " AND parent_id " . db_create_in(array_keys($basic_count_list)) . " GROUP BY parent_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res)) {
            $basic_count_list[$row['parent_id']] -= $row['count'];
        }
    }
    /* 循环插入配件 如果是配件则用其添加数量依次为购物车中所有属于其的基本件添加足够数量的该配件 */
    foreach ($basic_list as $parent_id => $fitting_price) {
        /* 如果已全部插入,退出 */
        if ($num <= 0) {
            break;
        }
        /* 如果该基本件不再购物车中,执行下一个 */
        if (!isset($basic_count_list[$parent_id])) {
            continue;
        }
        /* 如果该基本件的配件数量已满,执行下一个基本件 */
        if ($basic_count_list[$parent_id] <= 0) {
            continue;
        }
        /* 作为该基本件的配件插入 */
        $parent['goods_price'] = max($fitting_price, 0) + $spec_price;
        //允许该配件优惠价格为0
        $parent['goods_number'] = min($num, $basic_count_list[$parent_id]);
        $parent['parent_id'] = $parent_id;
        /* 添加 */
        $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        /* 改变数量 */
        $num -= $parent['goods_number'];
    }
    /* 如果数量不为0,作为基本件插入 */
    if ($num > 0) {
        /* 检查该商品是否已经存在在购物车中 */
        $sql = "SELECT goods_number FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . " AND extension_code <> 'package_buy' " . " AND rec_type = 'CART_GENERAL_GOODS'";
        $row = $GLOBALS['db']->getRow($sql);
        if ($row) {
            $num += $row['goods_number'];
            if (is_spec($spec) && !empty($prod)) {
                $goods_storage = $product_info['product_number'];
            } else {
                $goods_storage = $goods['goods_number'];
            }
            /* 2014-12-23 因为取消库存,这里购物的时候,商品的库存要先跟购物车那里进行过比较,如果库存小于购物车的数量,就执行else,输出库存数量不足
               if ($GLOBALS['_CFG']['use_storage'] == 0 || $num <= $goods_storage)
               */
            if ($GLOBALS['_CFG']['use_storage'] == 1) {
                $goods_price = get_final_price($goods_id, $num, true, $spec);
                $sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET goods_number = '{$num}'" . " , goods_price = '{$goods_price}'" . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . " AND extension_code <> 'package_buy' " . "AND rec_type = 'CART_GENERAL_GOODS'";
                $GLOBALS['db']->query($sql);
            } else {
                $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $num), ERR_OUT_OF_STOCK);
                return false;
            }
        } else {
            $goods_price = get_final_price($goods_id, $num, true, $spec);
            $parent['goods_price'] = max($goods_price, 0);
            $parent['goods_number'] = $num;
            $parent['parent_id'] = 0;
            $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        }
    }
    /* 把赠品删除 */
    $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND is_gift <> 0";
    $GLOBALS['db']->query($sql);
    return true;
}
Beispiel #4
0
/**
 * 获取商品的原价、配件价、库存(配件组合) by mike
 * 返回数组
 */
function get_combo_goods_info($goods_id, $num = 1, $spec = array(), $parent = 0)
{
    $result = array();
    /* 取得商品信息 */
    $sql = "SELECT goods_number FROM " . $GLOBALS['ecs']->table('goods') . " WHERE goods_id = '{$goods_id}' AND is_delete = 0";
    $goods = $GLOBALS['db']->getRow($sql);
    /* 如果商品有规格则取规格商品信息 配件除外 */
    $sql = "SELECT * FROM " . $GLOBALS['ecs']->table('products') . " WHERE goods_id = '{$goods_id}' LIMIT 0, 1";
    $prod = $GLOBALS['db']->getRow($sql);
    if (is_spec($spec) && !empty($prod)) {
        $product_info = get_products_info($goods_id, $spec);
    }
    if (empty($product_info)) {
        $product_info = array('product_number' => '', 'product_id' => 0);
    }
    //商品库存
    $result['stock'] = $goods['goods_number'];
    //商品存在规格 是货品 检查该货品库存
    if (is_spec($spec) && !empty($prod)) {
        if (!empty($spec)) {
            /* 取规格的货品库存 */
            $result['stock'] = $product_info['product_number'];
        }
    }
    /* 如果该配件在添加为基本件的配件时,所设置的“配件价格”比原价低,即此配件在价格上提供了优惠, */
    $sql = "SELECT parent_id, goods_price " . "FROM " . $GLOBALS['ecs']->table('group_goods') . " WHERE goods_id = '{$goods_id}'" . " AND parent_id = '{$parent}'" . " ORDER BY goods_price";
    $res = $GLOBALS['db']->query($sql);
    while ($row = $GLOBALS['db']->fetchRow($res)) {
        $result['fittings_price'] = $row['goods_price'];
    }
    /* 计算商品的促销价格 */
    $result['fittings_price'] = isset($result['fittings_price']) ? $result['fittings_price'] : get_final_price($goods_id, $num, true, $spec);
    $result['spec_price'] = spec_price($spec);
    //属性价格
    $result['goods_price'] = get_final_price($goods_id, $num, true, $spec);
    return $result;
}
Beispiel #5
0
/**
 * 添加商品到购物车
 *
 * @access  public
 * @param   integer $goods_id   商品编号
 * @param   integer $num        商品数量
 * @param   array   $spec       规格值对应的id数组
 * @param   integer $parent     基本件
 * @return  boolean
 */
function zy_addto_cart($goods_id, $num = 1, $spec = array(), $parent = 0)
{
    $_parent_id = $parent;

    /* 取得商品信息 */
    $sql = "SELECT g.goods_name, g.goods_sn, g.is_on_sale, g.is_real, ".
                "g.market_price, g.shop_price AS org_price, g.promote_price, g.promote_start_date, ".
                "g.promote_end_date, g.goods_weight, g.integral, g.extension_code, ".
                "g.goods_number, g.is_alone_sale, g.is_shipping,".
                "IFNULL(mp.user_price, g.shop_price * '$_SESSION[discount]') AS shop_price ".
            " FROM " .$GLOBALS['ecs']->table('goods'). " AS g ".
            " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp ".
                    "ON mp.goods_id = g.goods_id AND mp.user_rank = '$_SESSION[user_rank]' ".
            " WHERE g.goods_id = '$goods_id'" .
            " AND g.is_delete = 0";
    $goods = $GLOBALS['db']->getRow($sql);
    
    
    if (empty($goods) && false)
    {
    	error_log('1',3,'flow.model.log');
//        $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS);
        
        return false;
    }

    /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */
    if ($parent > 0)
    {
        $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') .
                " WHERE goods_id='$parent' AND session_id='" . SESS_ID . "' AND extension_code <> 'package_buy'";
        if ($GLOBALS['db']->getOne($sql) == 0)
        {
//            $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS);
			error_log('2',3,'flow.model.log');
            return false;
        }
    }

    /* 是否正在销售 */
    if ($goods['is_on_sale'] == 0)
    {
//        $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE);
		error_log('3',3,'flow.model.log');
        return false;
    }

    /* 不是配件时检查是否允许单独销售 */
    if (empty($parent) && $goods['is_alone_sale'] == 0)
    {
//        $GLOBALS['err']->add($GLOBALS['_LANG']['cannt_alone_sale'], ERR_CANNT_ALONE_SALE);
		error_log('4',3,'flow.model.log');
        return false;
    }

    /* 如果商品有规格则取规格商品信息 配件除外 */
   /* $sql = "SELECT * FROM " .$GLOBALS['ecs']->table('products'). " WHERE goods_id = '$goods_id' LIMIT 0, 1";
    $result = mysql_query($sql);
	if($result){
	    $prod = $GLOBALS['db']->getRow($sql);
	
	    if (is_spec($spec) && !empty($prod))
	    {
	        $product_info = get_products_info($goods_id, $spec);
	        
	    }
	    if (empty($product_info))
	    {
	        $product_info = array('product_number' => '', 'product_id' => 0);
	    }
	}*/
    
    /* 检查:库存 */
    if ($GLOBALS['_CFG']['use_storage'] == 1)
    {
        
        //检查:商品购买数量是否大于总库存
        if ($num > $goods['goods_number'])
        {
//          $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $goods['goods_number']), ERR_OUT_OF_STOCK);
            $msg['status'] = rpcLang("goods.php", "no_enough_goods");
            if(EC_CHARSET == 'gbk'){
            	error_log('95',3,'flow.model.log');
            	$msg['status']=mb_convert_encoding($msg['status'],'utf-8','gbk');
	            jsonExit($msg);
            	//echo $_GET['jsoncallback']."(".$msg['status'].")";
            	//exit;
            }else{
            	jsonExit($msg);
            }
            return false;
        }

        //商品存在规格 是货品 检查该货品库存
      /*  if (is_spec($spec) && !empty($prod))
        {
            if (!empty($spec))
            {
                // 取规格的货品库存 
                if ($num > $product_info['product_number'])
                {
                    //$GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $product_info['product_number']), ERR_OUT_OF_STOCK);
                    $msg['status'] = rpcLang("goods.php", "no_enough_spec_product");
                if(EC_CHARSET == 'gbk'){
                	jsonExit($msg['status']);
            		print_r($_GET['jsoncallback'],"(".$msg.")");
            	}else{
            		jsonExit($msg);
           	    }
                    return false;
                }
            }
        }  */     
    }

    /* 计算商品的促销价格 */
    $spec_price             = spec_price($spec);
    $goods_price            = get_final_price($goods_id, $num, true, $spec);
    $goods['market_price'] += $spec_price;
    $goods_attr             = get_goods_attr_info($spec);
    $goods_attr_id          = join(',', $spec);

    /* 初始化要插入购物车的基本件数据 */
    $parent = array(
        'user_id'       => $_SESSION['user_id'],
        'session_id'    => SESS_ID,
        'goods_id'      => $goods_id,
        'goods_sn'      => addslashes($goods['goods_sn']),
       // 'product_id'    => $product_info['product_id'],
        'goods_name'    => addslashes($goods['goods_name']),
        'market_price'  => $goods['market_price'],
        'goods_attr'    => addslashes($goods_attr),
        'goods_attr_id' => $goods_attr_id,
        'is_real'       => $goods['is_real'],
        'extension_code'=> $goods['extension_code'],
        'is_gift'       => 0,
        'is_shipping'   => $goods['is_shipping'],
        'rec_type'      => CART_GENERAL_GOODS
    );

    /* 如果该配件在添加为基本件的配件时,所设置的“配件价格”比原价低,即此配件在价格上提供了优惠, */
    /* 则按照该配件的优惠价格卖,但是每一个基本件只能购买一个优惠价格的“该配件”,多买的“该配件”不享 */
    /* 受此优惠 */
    $basic_list = array();
    $sql = "SELECT parent_id, goods_price " .
            "FROM " . $GLOBALS['ecs']->table('group_goods') .
            " WHERE goods_id = '$goods_id'" .
            " AND goods_price < '$goods_price'" .
            " AND parent_id = '$_parent_id'" .
            " ORDER BY goods_price";
    $res = $GLOBALS['db']->query($sql);
    while ($row = $GLOBALS['db']->fetchRow($res))
    {
        $basic_list[$row['parent_id']] = $row['goods_price'];
    }

    /* 取得购物车中该商品每个基本件的数量 */
    $basic_count_list = array();
    if ($basic_list)
    {
        $sql = "SELECT goods_id, SUM(goods_number) AS count " .
                "FROM " . $GLOBALS['ecs']->table('cart') .
                " WHERE session_id = '" . SESS_ID . "'" .
                " AND parent_id = 0" .
                " AND extension_code <> 'package_buy' " .
                " AND goods_id " . db_create_in(array_keys($basic_list)) .
                " GROUP BY goods_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res))
        {
            $basic_count_list[$row['goods_id']] = $row['count'];
        }
    }

    /* 取得购物车中该商品每个基本件已有该商品配件数量,计算出每个基本件还能有几个该商品配件 */
    /* 一个基本件对应一个该商品配件 */
    if ($basic_count_list)
    {
        $sql = "SELECT parent_id, SUM(goods_number) AS count " .
                "FROM " . $GLOBALS['ecs']->table('cart') .
                " WHERE session_id = '" . SESS_ID . "'" .
                " AND goods_id = '$goods_id'" .
                " AND extension_code <> 'package_buy' " .
                " AND parent_id " . db_create_in(array_keys($basic_count_list)) .
                " GROUP BY parent_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res))
        {
            $basic_count_list[$row['parent_id']] -= $row['count'];
        }
    }

    /* 循环插入配件 如果是配件则用其添加数量依次为购物车中所有属于其的基本件添加足够数量的该配件 */
    foreach ($basic_list as $parent_id => $fitting_price)
    {
        /* 如果已全部插入,退出 */
        if ($num <= 0)
        {
            break;
        }

        /* 如果该基本件不再购物车中,执行下一个 */
        if (!isset($basic_count_list[$parent_id]))
        {
            continue;
        }

        /* 如果该基本件的配件数量已满,执行下一个基本件 */
        if ($basic_count_list[$parent_id] <= 0)
        {
            continue;
        }

        /* 作为该基本件的配件插入 */
        $parent['goods_price']  = max($fitting_price, 0) + $spec_price; //允许该配件优惠价格为0
        $parent['goods_number'] = min($num, $basic_count_list[$parent_id]);
        $parent['parent_id']    = $parent_id;

        /* 添加 */
        $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');

        /* 改变数量 */
        $num -= $parent['goods_number'];
    }

    /* 如果数量不为0,作为基本件插入 */
    if ($num > 0)
    {
        /* 检查该商品是否已经存在在购物车中 */
        $sql = "SELECT goods_number FROM " .$GLOBALS['ecs']->table('cart').
                " WHERE session_id = '" .SESS_ID. "' AND goods_id = '$goods_id' ".
                " AND parent_id = 0 AND goods_attr = '" .get_goods_attr_info($spec). "' " .
                " AND extension_code <> 'package_buy' " .
                " AND rec_type = 'CART_GENERAL_GOODS'";

        $row = $GLOBALS['db']->getRow($sql);

        if($row) //如果购物车已经有此物品,则更新
        {
            $num += $row['goods_number'];
            if ($GLOBALS['_CFG']['use_storage'] == 0 || $num <= $goods['goods_number'])
            {
                $goods_price = get_final_price($goods_id, $num, true, $spec);
                $sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET goods_number = '$num'" .
                       " , goods_price = '$goods_price'".
                       " WHERE session_id = '" .SESS_ID. "' AND goods_id = '$goods_id' ".
                       " AND parent_id = 0 AND goods_attr = '" .get_goods_attr_info($spec). "' " .
                       " AND extension_code <> 'package_buy' " .
                       "AND rec_type = 'CART_GENERAL_GOODS'";
                $GLOBALS['db']->query($sql);
            }
            else
            {
//               $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $num), ERR_OUT_OF_STOCK);
                $msg['status'] = rpcLang("goods.php", "no_enough_goods");
	            if(EC_CHARSET == 'gbk'){
	            	error_log('<269>',3,'flow.model.log');
	            	$msg['status']=mb_convert_encoding($msg['status'],'utf-8','gbk');
	            	jsonExit($msg);
	            	//print_r($_GET['jsoncallback'],"(".$msg.")");
	            }else{
	            	jsonExit($msg);
	            }
	            error_log('6',3,'flow.model.log');
                return false;
            }
        }
        else //购物车没有此物品,则插入
        {
            $goods_price = get_final_price($goods_id, $num, true, $spec);
            $parent['goods_price']  = max($goods_price, 0);
            $parent['goods_number'] = $num;
            $parent['parent_id']    = 0;
            $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        }
    }

    /* 把赠品删除 */
    $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND is_gift <> 0";
    $GLOBALS['db']->query($sql);

    return true;
}
/**
 * 添加商品到购物车
 *
 * @access  public
 * @param   integer $goods_id   商品编号
 * @param   integer $num        商品数量
 * @param   array   $spec       规格
 * @param   integer $parent     基本件
 * @return  boolean
 */
function addto_cart($goods_id, $num = 1, $spec = array(), $parent = 0)
{
    $GLOBALS['err']->clean();
    /* 取得商品信息 */
    $sql = "SELECT g.goods_name, g.goods_sn, g.is_on_sale, g.is_real, " . "g.market_price, g.shop_price AS org_price, g.promote_price, g.promote_start_date, " . "g.promote_end_date, g.goods_weight, g.integral, g.extension_code, " . "g.goods_number, g.is_alone_sale, " . "IFNULL(mp.user_price, g.shop_price * '{$_SESSION['discount']}') AS shop_price " . " FROM " . $GLOBALS['ecs']->table('goods') . " AS g " . " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp " . "ON mp.goods_id = g.goods_id AND mp.user_rank = '{$_SESSION['user_rank']}' " . " WHERE g.goods_id = '{$goods_id}'" . " AND g.is_delete = 0";
    $goods = $GLOBALS['db']->getRow($sql);
    if (empty($goods)) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS);
        return false;
    }
    /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */
    if ($parent > 0) {
        $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') . " WHERE goods_id='{$parent}' AND session_id='" . SESS_ID . "'";
        if ($GLOBALS['db']->getOne($sql) == 0) {
            $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS);
            return false;
        }
        /* 检查该配件是否已经添加过了。 */
        $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') . " WHERE goods_id = '{$goods_id}' AND parent_id='{$parent}' AND session_id='" . SESS_ID . "'";
        if ($GLOBALS['db']->getOne($sql) > 0) {
            $GLOBALS['err']->add($GLOBALS['_LANG']['fitting_goods_exists'], ERR_NOT_EXISTS);
            return false;
        }
    }
    /* 是否正在销售 */
    if ($goods['is_on_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE);
        return false;
    }
    /* 不是配件时检查是否允许单独销售 */
    if (empty($parent) && $goods['is_alone_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['cannt_alone_sale'], ERR_CANNT_ALONE_SALE);
        return false;
    }
    /* 检查库存 */
    if ($GLOBALS['_CFG']['use_storage'] == 1 && $num > $goods['goods_number']) {
        $num = $goods['goods_number'];
        $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $num), ERR_OUT_OF_STOCK);
        return false;
    }
    /* 计算商品的促销价格 */
    $spec_price = spec_price($spec);
    $goods_price = get_final_price($goods_id, $num, true, $spec);
    $goods['market_price'] += $spec_price;
    $goods_attr = get_goods_attr_info($spec);
    $goods_attr_id = join(',', $spec);
    /* 初始化要插入购物车的基本件数据 */
    $parent = array('user_id' => $_SESSION['user_id'], 'session_id' => SESS_ID, 'goods_id' => $goods_id, 'goods_sn' => addslashes($goods['goods_sn']), 'goods_name' => addslashes($goods['goods_name']), 'market_price' => $goods['market_price'], 'goods_attr' => addslashes($goods_attr), 'goods_attr_id' => $goods_attr_id, 'is_real' => $goods['is_real'], 'extension_code' => $goods['extension_code'], 'is_gift' => 0, 'rec_type' => CART_GENERAL_GOODS);
    /* 取得该商品的基本件和该商品作为其配件的价格(条件是价格低) */
    $basic_list = array();
    $sql = "SELECT parent_id, goods_price " . "FROM " . $GLOBALS['ecs']->table('group_goods') . " WHERE goods_id = '{$goods_id}'" . " AND goods_price < '{$goods_price}'" . " ORDER BY goods_price";
    $res = $GLOBALS['db']->query($sql);
    while ($row = $GLOBALS['db']->fetchRow($res)) {
        $basic_list[$row['parent_id']] = $row['goods_price'];
    }
    /* 取得购物车中该商品每个基本件的数量 */
    $basic_count_list = array();
    if ($basic_list) {
        $sql = "SELECT goods_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND parent_id = 0" . " AND goods_id " . db_create_in(array_keys($basic_list)) . " GROUP BY goods_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res)) {
            $basic_count_list[$row['goods_id']] = $row['count'];
        }
    }
    /* 取得购物车中该商品每个基本件已有该商品配件数量,计算出每个基本件还能有几个该商品配件 */
    if ($basic_count_list) {
        $sql = "SELECT parent_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND goods_id = '{$goods_id}'" . " AND parent_id " . db_create_in(array_keys($basic_count_list)) . " GROUP BY parent_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res)) {
            $basic_count_list[$row['parent_id']] -= $row['count'];
        }
    }
    /* 循环插入配件 */
    foreach ($basic_list as $parent_id => $fitting_price) {
        /* 如果已全部插入,退出 */
        if ($num <= 0) {
            break;
        }
        /* 如果该基本件不再购物车中,执行下一个 */
        if (!isset($basic_count_list[$parent_id])) {
            continue;
        }
        /* 如果该基本件的配件数量已满,执行下一个基本件 */
        if ($basic_count_list[$parent_id] <= 0) {
            continue;
        }
        /* 作为该基本件的配件插入 */
        $parent['goods_price'] = max($fitting_price, 0);
        $parent['goods_number'] = min($num, $basic_count_list[$parent_id]);
        $parent['parent_id'] = $parent_id;
        $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        /* 改变数量 */
        $num -= $parent['goods_number'];
    }
    /* 如果数量不为0,作为基本件插入 */
    if ($num > 0) {
        /* 检查该商品是否已经存在在购物车中 */
        $sql = "SELECT goods_number FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . "AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . "AND rec_type = 'CART_GENERAL_GOODS'";
        $row = $GLOBALS['db']->getRow($sql);
        if ($row) {
            $num += $row['goods_number'];
            if ($GLOBALS['_CFG']['use_storage'] == 0 || $num <= $goods['goods_number']) {
                $goods_price = get_final_price($goods_id, $num, true, $spec);
                $sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET goods_number = '{$num}'" . " , goods_price = '{$goods_price}'" . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . "AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . "AND rec_type = 'CART_GENERAL_GOODS'";
                $GLOBALS['db']->query($sql);
            } else {
                $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $num), ERR_OUT_OF_STOCK);
                return false;
            }
        } else {
            $goods_price = get_final_price($goods_id, $num, true, $spec);
            $parent['goods_price'] = max($goods_price, 0);
            $parent['goods_number'] = $num;
            $parent['parent_id'] = 0;
            $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        }
    }
    /* 把赠品删除 */
    $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND is_gift <> 0";
    $GLOBALS['db']->query($sql);
    return true;
}
Beispiel #7
0
/**
 * 添加商品到购物车
 *
 * @access  public
 * @param   integer $goods_id   商品编号
 * @param   integer $num        商品数量
 * @param   array   $spec       规格
 * @param   integer $parent     基本件
 * @return  boolean
 */
function addto_cart($goods_id, $num = 1, $spec = array(), $is_integ = 0, $parent = 0)
{
    $GLOBALS['err']->clean();
    /* 取得商品信息 */
    $sql = "SELECT goods_name, goods_sn, is_on_sale, cat_id, is_real, shop_price, integral " . " FROM " . $GLOBALS['ecs']->table('goods') . " WHERE goods_id = '{$goods_id}' and is_delete = 0 ";
    $goods = $GLOBALS['db']->getRow($sql);
    if (empty($goods)) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS);
        return false;
    }
    /* 是否正在销售 */
    if ($goods['is_on_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE);
        return false;
    }
    $goods_price = $goods['shop_price'];
    $spec_price = spec_price($spec);
    $goods_price += $spec_price;
    $goods_attr = get_goods_attr_info($spec);
    $goods_attr_id = get_goods_attr_id($spec[0]);
    $name = $goods_attr_id == '194' || $goods_attr_id == '195' ? stripenglish($goods['goods_name']) . '(无糖)' : stripenglish($goods['goods_name']);
    if (strpos($goods_attr, '0.68磅')) {
        $res_attr = '0.68磅';
    } elseif (strpos($goods_attr, '磅')) {
        $res_attr = substr($goods_attr, strpos($goods_attr, '磅') - 3, 6);
    } elseif (strpos($goods_attr, 'P')) {
        $res_attr = substr($goods_attr, strpos($goods_attr, 'P') - 3, 4);
    } else {
        $res_attr = substr($goods_attr, 7, 6);
    }
    /* 初始化要插入购物车的基本件数据 */
    $parent = array('user_id' => $_SESSION['user_id'], 'session_id' => SESS_ID, 'goods_id' => $goods_id, 'goods_sn' => addslashes($goods['goods_sn']), 'goods_name' => addslashes($name), 'goods_attr' => addslashes($res_attr), 'goods_attr_id' => $goods_attr_id, 'is_real' => $goods['is_real'], 'is_integral' => $is_integ);
    /* 如果数量不为0,作为基本件插入 */
    if ($num > 0) {
        /* 检查该商品是否已经存在在购物车中 */
        $sql = "SELECT goods_number FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . "AND parent_id = 0 AND goods_attr = '" . $res_attr . "' " . "AND is_integral = '{$is_integ}' AND goods_attr_id = '{$goods_attr_id}'";
        $row = $GLOBALS['db']->getRow($sql);
        if ($row) {
            $num += $row['goods_number'];
            $sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET goods_number = '{$num}'" . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . "AND parent_id = 0 AND goods_attr = '" . $res_attr . "' " . "AND goods_attr_id = '{$goods_attr_id}'";
            $GLOBALS['db']->query($sql);
        } else {
            $parent['goods_price'] = $is_integ == 1 && $goods['cat_id'] != 4 ? $goods['integral'] : max($goods_price, 0);
            $parent['goods_attr_id'] = $parent['goods_price'] > 100 ? $parent['goods_attr_id'] : 0;
            $parent['goods_number'] = $num;
            $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        }
    }
    /* 把赠品删除 */
    $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND is_gift <> 0";
    $GLOBALS['db']->query($sql);
    return true;
}
Beispiel #8
0
/**
 * 添加商品到购物车
 *
 * @access  public
 * @param   integer $goods_id   商品编号
 * @param   integer $num        商品数量
 * @param   array   $spec       规格值对应的id数组
 * @param   integer $parent     基本件
 * @return  boolean
 */
function addto_cart($goods_id, $num = 1, $spec = array(), $parent = 0)
{
    $GLOBALS['err']->clean();
    $_parent_id = $parent;
    /* 取得商品信息 */
    $sql = "SELECT g.goods_name, g.goods_sn, g.is_on_sale, g.is_real, " . "g.market_price, g.cost_price, g.shop_price AS org_price, g.promote_price, g.promote_start_date, " . "g.promote_end_date, g.goods_weight, g.integral, g.extension_code, " . "g.goods_number, g.is_alone_sale, g.is_shipping," . "IFNULL(mp.user_price, g.shop_price * '{$_SESSION['discount']}') AS shop_price " . " FROM " . $GLOBALS['ecs']->table('goods') . " AS g " . " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp " . "ON mp.goods_id = g.goods_id AND mp.user_rank = '{$_SESSION['user_rank']}' " . " WHERE g.goods_id = '{$goods_id}'" . " AND g.is_delete = 0";
    $goods = $GLOBALS['db']->getRow($sql);
    if (empty($goods)) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS);
        return false;
    }
    /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */
    if ($parent > 0) {
        $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') . " WHERE goods_id='{$parent}' AND session_id='" . SESS_ID . "' AND extension_code <> 'package_buy'";
        if ($GLOBALS['db']->getOne($sql) == 0) {
            $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS);
            return false;
        }
    }
    /* 是否正在销售 */
    if ($goods['is_on_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE);
        return false;
    }
    /* 不是配件时检查是否允许单独销售 */
    if (empty($parent) && $goods['is_alone_sale'] == 0) {
        $GLOBALS['err']->add($GLOBALS['_LANG']['cannt_alone_sale'], ERR_CANNT_ALONE_SALE);
        return false;
    }
    /* 如果商品有规格则取规格商品信息 配件除外 */
    $sql = "SELECT * FROM " . $GLOBALS['ecs']->table('products') . " WHERE goods_id = '{$goods_id}' LIMIT 0, 1";
    $prod = $GLOBALS['db']->getRow($sql);
    if (is_spec($spec) && !empty($prod)) {
        $product_info = get_products_info($goods_id, $spec);
    }
    if (empty($product_info)) {
        $product_info = array('product_number' => '', 'product_id' => 0);
    }
    /* 检查:库存 */
    if ($GLOBALS['_CFG']['use_storage'] == 1) {
        //检查:商品购买数量是否大于总库存
        if ($num > $goods['goods_number']) {
            $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $goods['goods_number']), ERR_OUT_OF_STOCK);
            return false;
        }
        //商品存在规格 是货品 检查该货品库存
        if (is_spec($spec) && !empty($prod)) {
            if (!empty($spec)) {
                /* 取规格的货品库存 */
                if ($num > $product_info['product_number']) {
                    $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $product_info['product_number']), ERR_OUT_OF_STOCK);
                    return false;
                }
            }
        }
    }
    /* 计算商品的促销价格 */
    $spec_price = spec_price($spec);
    $goods_price = get_final_price($goods_id, $num, true, $spec);
    $goods['market_price'] += $spec_price;
    $goods_attr = get_goods_attr_info($spec);
    $goods_attr_id = join(',', $spec);
    /* 初始化要插入购物车的基本件数据 */
    $parent = array('user_id' => $_SESSION['user_id'], 'session_id' => SESS_ID, 'goods_id' => $goods_id, 'goods_sn' => addslashes($goods['goods_sn']), 'product_id' => $product_info['product_id'], 'goods_name' => addslashes($goods['goods_name']), 'market_price' => $goods['market_price'], 'goods_attr' => addslashes($goods_attr), 'goods_attr_id' => $goods_attr_id, 'cost_price' => $goods['cost_price'], 'is_real' => $goods['is_real'], 'extension_code' => $goods['extension_code'], 'is_gift' => 0, 'is_shipping' => $goods['is_shipping'], 'add_time' => gmtime(), 'rec_type' => CART_GENERAL_GOODS);
    //初始化为普通商品
    $_SESSION['flow_type'] = CART_GENERAL_GOODS;
    /* 如果该配件在添加为基本件的配件时,所设置的“配件价格”比原价低,即此配件在价格上提供了优惠, */
    /* 则按照该配件的优惠价格卖,但是每一个基本件只能购买一个优惠价格的“该配件”,多买的“该配件”不享 */
    /* 受此优惠 */
    $basic_list = array();
    $sql = "SELECT parent_id, goods_price " . "FROM " . $GLOBALS['ecs']->table('group_goods') . " WHERE goods_id = '{$goods_id}'" . " AND goods_price < '{$goods_price}'" . " AND parent_id = '{$_parent_id}'" . " ORDER BY goods_price";
    $res = $GLOBALS['db']->query($sql);
    while ($row = $GLOBALS['db']->fetchRow($res)) {
        $basic_list[$row['parent_id']] = $row['goods_price'];
    }
    /* 取得购物车中该商品每个基本件的数量 */
    $basic_count_list = array();
    if ($basic_list) {
        $sql = "SELECT goods_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND parent_id = 0" . " AND extension_code <> 'package_buy' " . " AND goods_id " . db_create_in(array_keys($basic_list)) . " GROUP BY goods_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res)) {
            $basic_count_list[$row['goods_id']] = $row['count'];
        }
    }
    /* 取得购物车中该商品每个基本件已有该商品配件数量,计算出每个基本件还能有几个该商品配件 */
    /* 一个基本件对应一个该商品配件 */
    if ($basic_count_list) {
        $sql = "SELECT parent_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND goods_id = '{$goods_id}'" . " AND extension_code <> 'package_buy' " . " AND parent_id " . db_create_in(array_keys($basic_count_list)) . " GROUP BY parent_id";
        $res = $GLOBALS['db']->query($sql);
        while ($row = $GLOBALS['db']->fetchRow($res)) {
            $basic_count_list[$row['parent_id']] -= $row['count'];
        }
    }
    /* 循环插入配件 如果是配件则用其添加数量依次为购物车中所有属于其的基本件添加足够数量的该配件 */
    foreach ($basic_list as $parent_id => $fitting_price) {
        /* 如果已全部插入,退出 */
        if ($num <= 0) {
            break;
        }
        /* 如果该基本件不再购物车中,执行下一个 */
        if (!isset($basic_count_list[$parent_id])) {
            continue;
        }
        /* 如果该基本件的配件数量已满,执行下一个基本件 */
        if ($basic_count_list[$parent_id] <= 0) {
            continue;
        }
        /* 作为该基本件的配件插入 */
        $parent['goods_price'] = max($fitting_price, 0) + $spec_price;
        //允许该配件优惠价格为0
        $parent['goods_number'] = min($num, $basic_count_list[$parent_id]);
        $parent['parent_id'] = $parent_id;
        /* 添加 */
        $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        /* 改变数量 */
        $num -= $parent['goods_number'];
    }
    /* 如果数量不为0,作为基本件插入 */
    if ($num > 0) {
        /* 检查该商品是否已经存在在购物车中 */
        $sql = "SELECT goods_number FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . " AND extension_code <> 'package_buy' " . " AND user_id= '" . $_SESSION['user_id'] . "'" . " AND rec_type = 'CART_GENERAL_GOODS'";
        $row = $GLOBALS['db']->getRow($sql);
        if ($row) {
            $num += $row['goods_number'];
            if (is_spec($spec) && !empty($prod)) {
                $goods_storage = $product_info['product_number'];
            } else {
                $goods_storage = $goods['goods_number'];
            }
            if ($GLOBALS['_CFG']['use_storage'] == 0 || $num <= $goods_storage) {
                $goods_price = get_final_price($goods_id, $num, true, $spec);
                $sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET goods_number = '{$num}'" . " , goods_price = '{$goods_price}'" . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . " AND extension_code <> 'package_buy' " . "AND rec_type = 'CART_GENERAL_GOODS'";
                $GLOBALS['db']->query($sql);
            } else {
                $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $num), ERR_OUT_OF_STOCK);
                return false;
            }
        } else {
            // 判断是否为预售商品
            $pre_sale_id = is_pre_sale_goods($goods_id);
            if (!empty($pre_sale_id)) {
                /* 更新:记录购物流程类型:预售 */
                $_SESSION['flow_type'] = CART_PRE_SALE_GOODS;
                $_SESSION['extension_code'] = PRE_SALE_CODE;
                $_SESSION['extension_id'] = $pre_sale_id;
                $parent['extension_code'] = PRE_SALE_CODE;
                $parent['rec_type'] = CART_PRE_SALE_GOODS;
                //获取预售信息
                $pre_sale = pre_sale_info($pre_sale_id, $num);
                if ($pre_sale['deposit'] > 0) {
                    //定金大于0则使用定金金额
                    $goods_price = $pre_sale['deposit'];
                } else {
                    //计算当前价格
                    $goods_price = $pre_sale['cur_price'];
                    //加入规格价格
                    if (!empty($spec)) {
                        $spec_price = spec_price($spec);
                        $goods_price += $spec_price;
                    }
                }
            } else {
                $goods_price = get_final_price($goods_id, $num, true, $spec);
            }
            $parent['goods_price'] = max($goods_price, 0);
            $parent['goods_number'] = $num;
            $parent['parent_id'] = 0;
            $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT');
        }
        /**
         * 判断是否为虚拟团购商品
         */
        $virtual_sale_id = is_virtual_sale_goods($goods_id);
        if (!empty($virtual_sale_id)) {
            /* 更新:记录购物流程类型:预售 */
            $_SESSION['flow_type'] = CART_VIRTUAL_GROUP_GOODS;
            $_SESSION['extension_code'] = VIRTUAL_SALE_CODE;
            $_SESSION['extension_id'] = $virtual_sale_id;
            $GLOBALS['db']->query("update " . $GLOBALS['ecs']->table('cart') . " set rec_type=" . CART_VIRTUAL_GROUP_GOODS . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' ");
        }
    }
    /* 把赠品删除 */
    $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND is_gift <> 0";
    $GLOBALS['db']->query($sql);
    return true;
}