You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
390 lines
13 KiB
390 lines
13 KiB
<?php
|
|
|
|
/**
|
|
* 取得某用户等级当前时间可以享受的优惠活动
|
|
* @param int $user_rank 用户等级id,0表示非会员
|
|
* @return array
|
|
*/
|
|
function favourable_list($user_rank)
|
|
{
|
|
/* 购物车中已有的优惠活动及数量 */
|
|
$used_list = cart_favourable();
|
|
/* 当前用户可享受的优惠活动 */
|
|
$favourable_list = array();
|
|
$user_rank = ',' . $user_rank . ',';
|
|
$now = gmtime();
|
|
$sql = "SELECT * " .
|
|
"FROM {pre}favourable_activity" .
|
|
" WHERE CONCAT(',', user_rank, ',') LIKE '%" . $user_rank . "%'" .
|
|
" AND start_time <= '$now' AND end_time >= '$now'" .
|
|
" ORDER BY sort_order";
|
|
$res = $GLOBALS['db']->query($sql);
|
|
$favourable_list = array();
|
|
if($res){
|
|
foreach($res as $favourable)
|
|
{
|
|
$favourable['start_time'] = local_date(C('shop.time_format'), $favourable['start_time']);
|
|
$favourable['end_time'] = local_date(C('shop.time_format'), $favourable['end_time']);
|
|
$favourable['formated_min_amount'] = price_format($favourable['min_amount'], false);
|
|
$favourable['formated_max_amount'] = price_format($favourable['max_amount'], false);
|
|
$favourable['gift'] = unserialize($favourable['gift']);
|
|
foreach ($favourable['gift'] as $key => $value)
|
|
{
|
|
$favourable['gift'][$key]['formated_price'] = price_format($value['price'], false);
|
|
$sql = "SELECT COUNT(*) FROM {pre}goods WHERE is_on_sale = 1 AND goods_id = ".$value['id'];
|
|
$is_sale = $GLOBALS['db']->getOne($sql);
|
|
if(!$is_sale)
|
|
{
|
|
unset($favourable['gift'][$key]);
|
|
}
|
|
}
|
|
$favourable['act_range_desc'] = act_range_desc($favourable);
|
|
$favourable['act_type_desc'] = sprintf($GLOBALS['_LANG']['fat_ext'][$favourable['act_type']], $favourable['act_type_ext']);
|
|
|
|
/* 是否能享受 */
|
|
$favourable['available'] = favourable_available($favourable);
|
|
if ($favourable['available'])
|
|
{
|
|
/* 是否尚未享受 */
|
|
$favourable['available'] = !favourable_used($favourable, $used_list);
|
|
}
|
|
$favourable_list[] = $favourable;
|
|
}
|
|
}
|
|
return $favourable_list;
|
|
}
|
|
/**
|
|
* 根据购物车判断是否可以享受某优惠活动
|
|
* @param array $favourable 优惠活动信息
|
|
* @return bool
|
|
*/
|
|
function favourable_available($favourable)
|
|
{
|
|
/* 会员等级是否符合 */
|
|
$user_rank = $_SESSION['user_rank'];
|
|
if (strpos(',' . $favourable['user_rank'] . ',', ',' . $user_rank . ',') === false)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/* 优惠范围内的商品总额 */
|
|
$amount = cart_favourable_amount($favourable);
|
|
|
|
/* 金额上限为0表示没有上限 */
|
|
return $amount >= $favourable['min_amount'] &&
|
|
($amount <= $favourable['max_amount'] || $favourable['max_amount'] == 0);
|
|
}
|
|
/**
|
|
* 取得购物车中某优惠活动范围内的总金额
|
|
* @param array $favourable 优惠活动
|
|
* @return float
|
|
*/
|
|
function cart_favourable_amount($favourable)
|
|
{
|
|
//ecmoban模板堂 --zhuo start
|
|
if(!empty($_SESSION['user_id'])){
|
|
$c_sess = " c.user_id = '" . $_SESSION['user_id'] . "' ";
|
|
}else{
|
|
$c_sess = " c.session_id = '" . real_cart_mac_ip() . "' ";
|
|
}
|
|
|
|
$fav_where = "";
|
|
if($favourable['userFav_type'] == 0){
|
|
$fav_where = " AND g.user_id = '" .$favourable['user_id']. "' ";
|
|
}
|
|
//ecmoban模板堂 --zhuo end
|
|
|
|
/* 查询优惠范围内商品总额的sql */
|
|
$sql = "SELECT SUM(c.goods_price * c.goods_number) " .
|
|
"FROM " . $GLOBALS['ecs']->table('cart') . " AS c, " . $GLOBALS['ecs']->table('goods') . " AS g " .
|
|
"WHERE c.goods_id = g.goods_id " .
|
|
"AND " .$c_sess. " AND c.rec_type = '" . CART_GENERAL_GOODS . "' " .
|
|
"AND c.is_gift = 0 " .
|
|
"AND c.goods_id > 0 " . $fav_where; //ecmoban模板堂 --zhuo
|
|
|
|
/* 根据优惠范围修正sql */
|
|
if ($favourable['act_range'] == FAR_ALL)
|
|
{
|
|
// sql do not change
|
|
}
|
|
elseif ($favourable['act_range'] == FAR_CATEGORY)
|
|
{
|
|
/* 取得优惠范围分类的所有下级分类 */
|
|
$id_list = array();
|
|
$cat_list = explode(',', $favourable['act_range_ext']);
|
|
foreach ($cat_list as $id)
|
|
{
|
|
$id_list = array_merge($id_list, array_keys(cat_list(intval($id), 0, false)));
|
|
}
|
|
|
|
$sql .= "AND g.cat_id " . db_create_in($id_list);
|
|
}
|
|
elseif ($favourable['act_range'] == FAR_BRAND)
|
|
{
|
|
$id_list = explode(',', $favourable['act_range_ext']);
|
|
|
|
$sql .= "AND g.brand_id " . db_create_in($id_list);
|
|
}
|
|
else
|
|
{
|
|
$id_list = explode(',', $favourable['act_range_ext']);
|
|
|
|
$sql .= "AND g.goods_id " . db_create_in($id_list);
|
|
}
|
|
|
|
/* 优惠范围内的商品总额 */
|
|
return $GLOBALS['db']->getOne($sql);
|
|
}
|
|
/**
|
|
* 取得优惠范围描述
|
|
* @param array $favourable 优惠活动
|
|
* @return string
|
|
*/
|
|
function act_range_desc($favourable)
|
|
{
|
|
if ($favourable['act_range'] == FAR_BRAND)
|
|
{
|
|
$sql = "SELECT brand_name FROM " . $GLOBALS['ecs']->table('brand') .
|
|
" WHERE brand_id " . db_create_in($favourable['act_range_ext']);
|
|
return join(',', $GLOBALS['db']->getCol($sql));
|
|
}
|
|
elseif ($favourable['act_range'] == FAR_CATEGORY)
|
|
{
|
|
$sql = "SELECT cat_name FROM " . $GLOBALS['ecs']->table('category') .
|
|
" WHERE cat_id " . db_create_in($favourable['act_range_ext']);
|
|
return join(',', $GLOBALS['db']->getCol($sql));
|
|
}
|
|
elseif ($favourable['act_range'] == FAR_GOODS)
|
|
{
|
|
$sql = "SELECT goods_name FROM " . $GLOBALS['ecs']->table('goods') .
|
|
" WHERE goods_id " . db_create_in($favourable['act_range_ext']);
|
|
return join(',', $GLOBALS['db']->getCol($sql));
|
|
}
|
|
else
|
|
{
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 取得购物车中已有的优惠活动及数量
|
|
*
|
|
* @return array
|
|
*/
|
|
function cart_favourable() {
|
|
$list = array();
|
|
$sql = "SELECT is_gift, COUNT(*) AS num " . "FROM {pre}cart WHERE session_id = '" . SESS_ID . "'" . " AND rec_type = '" . CART_GENERAL_GOODS . "'" . " AND is_gift > 0" . " GROUP BY is_gift";
|
|
$res = $GLOBALS['db']->getAll($sql);
|
|
$list = array();
|
|
if($res){
|
|
foreach ($res as $row) {
|
|
$list [$row ['is_gift']] = $row ['num'];
|
|
}
|
|
}
|
|
return $list;
|
|
}
|
|
|
|
/**
|
|
* 比较优惠活动的函数,用于排序(把可用的排在前面)
|
|
*
|
|
* @param array $a
|
|
* 优惠活动a
|
|
* @param array $b
|
|
* 优惠活动b
|
|
* @return int 相等返回0,小于返回-1,大于返回1
|
|
*/
|
|
function cmp_favourable($a, $b) {
|
|
if ($a ['available'] == $b ['available']) {
|
|
if ($a ['sort_order'] == $b ['sort_order']) {
|
|
return 0;
|
|
} else {
|
|
return $a ['sort_order'] < $b ['sort_order'] ? - 1 : 1;
|
|
}
|
|
} else {
|
|
return $a ['available'] ? - 1 : 1;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* 取得购物车条件
|
|
*/
|
|
function sess (){
|
|
//ecmoban模板堂 --zhuo start
|
|
if(!empty($_SESSION['user_id'])){
|
|
$info['sess_id'] = " user_id = '" . $_SESSION['user_id'] . "' ";
|
|
|
|
$info['a_sess'] = " a.user_id = '" . $_SESSION['user_id'] . "' ";
|
|
$info['b_sess'] = " b.user_id = '" . $_SESSION['user_id'] . "' ";
|
|
$info['c_sess'] = " c.user_id = '" . $_SESSION['user_id'] . "' ";
|
|
|
|
$info['sess_cart'] = "";
|
|
}else{
|
|
$info['sess_id'] = " session_id = '" . real_cart_mac_ip() . "' ";
|
|
|
|
$info['a_sess'] = " a.session_id = '" . real_cart_mac_ip() . "' ";
|
|
$info['b_sess'] = " b.session_id = '" . real_cart_mac_ip() . "' ";
|
|
$info['c_sess'] = " c.session_id = '" . real_cart_mac_ip() . "' ";
|
|
|
|
$info['sess_cart'] = real_cart_mac_ip();
|
|
}
|
|
//ecmoban模板堂 --zhuo ends
|
|
return $info;
|
|
}
|
|
/**
|
|
* 删除购物车中的商品
|
|
*
|
|
* @access public
|
|
* @param integer $id
|
|
* @return void
|
|
*/
|
|
function flow_drop_cart_goods($id) {
|
|
$sess=sess();
|
|
/* 取得商品id */
|
|
$sql = "SELECT * FROM {pre}cart WHERE rec_id = '$id'";
|
|
$row = $GLOBALS['db']->getRow($sql);
|
|
|
|
if ($row) {
|
|
// 如果是超值礼包
|
|
if ($row ['extension_code'] == 'package_buy') {
|
|
$sql = "DELETE FROM {pre}cart WHERE ".$sess['sess_id']." AND rec_id = '$id' LIMIT 1";
|
|
}
|
|
// 如果是普通商品,同时删除所有赠品及其配件
|
|
elseif ($row ['parent_id'] == 0 && $row ['is_gift'] == 0) {
|
|
/* 检查购物车中该普通商品的不可单独销售的配件并删除 */
|
|
$sql = "SELECT c.rec_id
|
|
FROM {pre}cart AS c, {pre}group_goods AS gg, {pre}goods AS g
|
|
WHERE gg.parent_id = '" . $row ['goods_id'] . "'
|
|
AND c.goods_id = gg.goods_id
|
|
AND c.parent_id = '" . $row ['goods_id'] . "'
|
|
AND c.extension_code <> 'package_buy'
|
|
AND gg.goods_id = g.goods_id
|
|
AND g.is_alone_sale = 0";
|
|
$res = $GLOBALS['db']->getAll($sql);
|
|
$_del_str = $id . ',';
|
|
foreach ($res as $id_alone_sale_goods) {
|
|
$_del_str .= $id_alone_sale_goods ['rec_id'] . ',';
|
|
}
|
|
$_del_str = trim($_del_str, ',');
|
|
|
|
$sql = "DELETE FROM {pre}cart WHERE ".$sess['sess_id']." AND (rec_id IN ($_del_str) OR parent_id = '$row[goods_id]' OR is_gift <> 0)";
|
|
}
|
|
// 如果不是普通商品,只删除该商品即可
|
|
else {
|
|
$sql = "DELETE FROM {pre}cart WHERE ".$sess['sess_id']." AND rec_id = '$id' LIMIT 1";
|
|
}
|
|
$GLOBALS['db']->query($sql);
|
|
}
|
|
//删除购物车中不能单独销售的商品
|
|
flow_clear_cart_alone();
|
|
}
|
|
|
|
|
|
/**
|
|
* 删除购物车中不能单独销售的商品
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function flow_clear_cart_alone() {
|
|
$sess=sess();
|
|
/* 查询:购物车中所有不可以单独销售的配件 */
|
|
$sql = "SELECT c.rec_id, gg.parent_id
|
|
FROM {pre}cart AS c
|
|
LEFT JOIN {pre}group_goods AS gg ON c.goods_id = gg.goods_id
|
|
LEFT JOIN {pre}goods AS g ON c.goods_id = g.goods_id
|
|
WHERE ".$sess['c_sess']."
|
|
AND c.extension_code <> 'package_buy'
|
|
AND gg.parent_id > 0
|
|
AND g.is_alone_sale = 0";
|
|
$res = $GLOBALS['db']->query($sql);
|
|
$rec_id = array();
|
|
foreach ($res as $row) {
|
|
$rec_id [$row ['rec_id']] [] = $row ['parent_id'];
|
|
}
|
|
if (empty($rec_id)) {
|
|
return;
|
|
}
|
|
|
|
/* 查询:购物车中所有商品 */
|
|
$sql = "SELECT DISTINCT goods_id
|
|
FROM {pre}cart WHERE ".$sess['sess_id']."
|
|
AND extension_code <> 'package_buy'";
|
|
$res = $GLOBALS['db']->query($sql);
|
|
$cart_good = array();
|
|
foreach ($res as $row) {
|
|
$cart_good [] = $row ['goods_id'];
|
|
}
|
|
if (empty($cart_good)) {
|
|
return;
|
|
}
|
|
|
|
/* 如果购物车中不可以单独销售配件的基本件不存在则删除该配件 */
|
|
$del_rec_id = '';
|
|
foreach ($rec_id as $key => $value) {
|
|
foreach ($value as $v) {
|
|
if (in_array($v, $cart_good)) {
|
|
continue 2;
|
|
}
|
|
}
|
|
|
|
$del_rec_id = $key . ',';
|
|
}
|
|
$del_rec_id = trim($del_rec_id, ',');
|
|
|
|
if ($del_rec_id == '') {
|
|
return;
|
|
}
|
|
|
|
/* 删除 */
|
|
$sql = "DELETE FROM {pre}cart WHERE ".$sess['sess_id']."
|
|
AND rec_id IN ($del_rec_id)";
|
|
$GLOBALS['db']->query($sql);
|
|
}
|
|
|
|
/**
|
|
* 调用购物车信息
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
function cart_number()
|
|
{
|
|
if(!empty($_SESSION['user_id'])){
|
|
$sess_id = " user_id = '" . $_SESSION['user_id'] . "' ";
|
|
}else{
|
|
$sess_id = " session_id = '" . real_cart_mac_ip() . "' ";
|
|
}
|
|
$sql = 'SELECT SUM(goods_number) AS number ' .
|
|
' FROM ' . $GLOBALS['ecs']->table('cart') .
|
|
" WHERE " . $sess_id . " AND rec_type = '" . CART_GENERAL_GOODS . "'";
|
|
$row = $GLOBALS['db']->GetRow($sql);
|
|
|
|
if ($row)
|
|
{
|
|
$number = intval($row['number']);
|
|
}
|
|
else
|
|
{
|
|
$number = 0;
|
|
}
|
|
return $number;
|
|
}
|
|
|
|
/**
|
|
* 购物车中是否已经有某优惠
|
|
* @param array $favourable 优惠活动
|
|
* @param array $cart_favourable购物车中已有的优惠活动及数量
|
|
*/
|
|
function favourable_used($favourable, $cart_favourable)
|
|
{
|
|
if ($favourable['act_type'] == FAT_GOODS)
|
|
{
|
|
return isset($cart_favourable[$favourable['act_id']]) &&
|
|
$cart_favourable[$favourable['act_id']] >= $favourable['act_type_ext'] &&
|
|
$favourable['act_type_ext'] > 0;
|
|
}
|
|
else
|
|
{
|
|
return isset($cart_favourable[$favourable['act_id']]);
|
|
}
|
|
}
|