bnbweb/includes/lib_order.php
2022-11-14 23:49:28 +08:00

709 lines
21 KiB
PHP
Executable File

<?php
if (!defined('IN_ECS'))
{
die('Hacking attempt');
}
/**
* 处理序列化的支付、配送的配置参数
* 返回一个以name为索引的数组
*
* @access public
* @param string $cfg
* @return void
*/
function unserialize_config($cfg)
{
if (is_string($cfg) && ($arr = unserialize($cfg)) !== false)
{
$config = array();
foreach ($arr AS $key => $val)
{
$config[$val['name']] = $val['value'];
}
return $config;
}
else
{
return false;
}
}
/**
* 取得已安装的支付方式列表
* @return array 已安装的配送方式列表
*/
function payment_list()
{
$sql = 'SELECT pay_id, pay_name ' .
'FROM ' . $GLOBALS['ecs']->table('payment') .
' WHERE enabled = 1';
return $GLOBALS['db']->getAll($sql);
}
/**
* 取得支付方式信息
* @param int $pay_id 支付方式id
* @return array 支付方式信息
*/
function payment_info($pay_id)
{
$sql = 'SELECT * FROM ' . $GLOBALS['ecs']->table('payment') .
" WHERE pay_id = '$pay_id' AND enabled = 1";
return $GLOBALS['db']->getRow($sql);
}
/**
* 获得订单需要支付的支付费用
*
* @access public
* @param integer $payment_id
* @param float $order_amount
* @param mix $cod_fee
* @return float
*/
function pay_fee($payment_id, $order_amount, $cod_fee=null)
{
$pay_fee = 0;
$payment = payment_info($payment_id);
$rate = ($payment['is_cod']) ? $payment['pay_fee'] : 0;
if (strpos($rate, '%') !== false)
{
/* 支付费用是一个比例 */
$val = floatval($rate) / 100;
$pay_fee = $val > 0 ? $order_amount * $val /(1- $val) : 0;
}
else
{
$pay_fee = floatval($rate);
}
return round($pay_fee, 2);
}
/**
* 取得可用的支付方式列表
* @param bool $support_cod 配送方式是否支持货到付款
* @param int $cod_fee 货到付款手续费(当配送方式支持货到付款时才传此参数)
* @param int $is_online 是否支持在线支付
* @return array 配送方式数组
*/
function available_payment_list($support_cod, $cod_fee = 0, $is_online = false)
{
$sql = 'SELECT pay_id, pay_code, pay_name, pay_fee, pay_desc, pay_config, is_cod' .
' FROM ' . $GLOBALS['ecs']->table('payment') .
' WHERE enabled = 1 ';
if (!$support_cod)
{
$sql .= 'AND is_cod = 0 '; // 如果不支持货到付款
}
if ($is_online)
{
$sql .= "AND is_online = '1' ";
}
$sql .= 'ORDER BY pay_order'; // 排序
$res = $GLOBALS['db']->query($sql);
$pay_list = array();
while ($row = $GLOBALS['db']->fetchRow($res))
{
if ($row['is_cod'] == '1')
{
$row['pay_fee'] = $cod_fee;
}
$row['format_pay_fee'] = strpos($row['pay_fee'], '%') !== false ? $row['pay_fee'] :
price_format($row['pay_fee'], false);
$modules[] = $row;
}
include_once(ROOT_PATH.'includes/lib_compositor.php');
if(isset($modules))
{
return $modules;
}
}
/**
* 判断订单是否已完成
* @param array $order 订单信息
* @return bool
*/
function order_finished($order)
{
return $order['order_status'] == OS_CONFIRMED &&
($order['shipping_status'] == SS_SHIPPED || $order['shipping_status'] == SS_RECEIVED) &&
($order['pay_status'] == PS_PAYED || $order['pay_status'] == PS_PAYING);
}
/**
* 得到新订单号
* @return string
*/
function get_order_sn()
{
/* 选择一个随机的方案 */
mt_srand((double) microtime() * 1000000);
return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}
/**
* 取得用户信息
* @param int $user_id 用户id
* @return array 用户信息
*/
function user_info($user_id)
{
$sql = "SELECT * FROM " . $GLOBALS['ecs']->table('users') .
" WHERE user_id = '$user_id'";
$user = $GLOBALS['db']->getRow($sql);
unset($user['question']);
unset($user['answer']);
/* 格式化帐户余额 */
if ($user)
{
// if ($user['user_money'] < 0)
// {
// $user['user_money'] = 0;
// }
$user['formated_user_money'] = price_format($user['user_money'], false);
$user['formated_frozen_money'] = price_format($user['frozen_money'], false);
}
return $user;
}
/**
* 修改用户
* @param int $user_id 订单id
* @param array $user key => value
* @return bool
*/
function update_user($user_id, $user)
{
return $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('users'),
$user, 'UPDATE', "user_id = '$user_id'");
}
/**
* 取得用户地址列表
* @param int $user_id 用户id
* @return array
*/
function bank_list($user_id)
{
$sql = "SELECT * FROM " . $GLOBALS['ecs']->table('user_bank') .
" WHERE user_id = '$user_id'";
return $GLOBALS['db']->getAll($sql);
}
/**
* 取得用户地址信息
* @param int $address_id 地址id
* @return array
*/
function bank_info($bank_id)
{
$sql = "SELECT * FROM " . $GLOBALS['ecs']->table('user_bank') .
" WHERE bank_id = '$bank_id'";
return $GLOBALS['db']->getRow($sql);
}
/**
* 取得用户当前可用红包
* @param int $user_id 用户id
* @param float $goods_amount 订单商品金额
* @return array 红包数组
*/
function user_bonus($user_id, $goods_amount = 0)
{
$day = getdate();
$today = local_mktime(23, 59, 59, $day['mon'], $day['mday'], $day['year']);
$sql = "SELECT t.type_id, t.type_name, t.type_money, b.bonus_id " .
"FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
$GLOBALS['ecs']->table('user_bonus') . " AS b " .
"WHERE t.type_id = b.bonus_type_id " .
"AND t.use_start_date <= '$today' " .
"AND t.use_end_date >= '$today' " .
"AND t.min_goods_amount <= '$goods_amount' " .
"AND b.user_id<>0 " .
"AND b.user_id = '$user_id' " .
"AND b.order_id = 0";
return $GLOBALS['db']->getAll($sql);
}
/**
* 取得红包信息
* @param int $bonus_id 红包id
* @param string $bonus_sn 红包序列号
* @param array 红包信息
*/
function bonus_info($bonus_id, $bonus_sn = '')
{
$sql = "SELECT t.*, b.* " .
"FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
$GLOBALS['ecs']->table('user_bonus') . " AS b " .
"WHERE t.type_id = b.bonus_type_id ";
if ($bonus_id > 0)
{
$sql .= "AND b.bonus_id = '$bonus_id'";
}
else
{
$sql .= "AND b.bonus_sn = '$bonus_sn'";
}
return $GLOBALS['db']->getRow($sql);
}
/**
* 检查红包是否已使用
* @param int $bonus_id 红包id
* @return bool
*/
function bonus_used($bonus_id)
{
$sql = "SELECT order_id FROM " . $GLOBALS['ecs']->table('user_bonus') .
" WHERE bonus_id = '$bonus_id'";
return $GLOBALS['db']->getOne($sql) > 0;
}
/**
* 设置红包为已使用
* @param int $bonus_id 红包id
* @param int $order_id 订单id
* @return bool
*/
function use_bonus($bonus_id, $order_id)
{
$sql = "UPDATE " . $GLOBALS['ecs']->table('user_bonus') .
" SET order_id = '$order_id', used_time = '" . gmtime() . "' " .
"WHERE bonus_id = '$bonus_id' LIMIT 1";
return $GLOBALS['db']->query($sql);
}
/**
* 设置红包为未使用
* @param int $bonus_id 红包id
* @param int $order_id 订单id
* @return bool
*/
function unuse_bonus($bonus_id)
{
$sql = "UPDATE " . $GLOBALS['ecs']->table('user_bonus') .
" SET order_id = 0, used_time = 0 " .
"WHERE bonus_id = '$bonus_id' LIMIT 1";
return $GLOBALS['db']->query($sql);
}
/**
* 计算积分的价值(能抵多少钱)
* @param int $integral 积分
* @return float 积分价值
*/
function value_of_integral($integral)
{
$scale = floatval($GLOBALS['_CFG']['integral_scale']);
return $scale > 0 ? round(($integral / 100) * $scale, 2) : 0;
}
/**
* 计算指定的金额需要多少积分
*
* @access public
* @param integer $value 金额
* @return void
*/
function integral_of_value($value)
{
$scale = floatval($GLOBALS['_CFG']['integral_scale']);
return $scale > 0 ? round($value / $scale * 100) : 0;
}
/**
* 获得上一次用户采用的支付和配送方式
*
* @access public
* @return void
*/
function last_shipping_and_payment()
{
$sql = "SELECT shipping_id, pay_id " .
" FROM " . $GLOBALS['ecs']->table('order_info') .
" WHERE user_id = '$_SESSION[user_id]' " .
" ORDER BY order_id DESC LIMIT 1";
$row = $GLOBALS['db']->getRow($sql);
if (empty($row))
{
/* 如果获得是一个空数组,则返回默认值 */
$row = array('shipping_id' => 0, 'pay_id' => 0);
}
return $row;
}
/**
* 取得当前用户应该得到的红包总额
*/
function get_total_bonus()
{
$day = getdate();
$today = local_mktime(23, 59, 59, $day['mon'], $day['mday'], $day['year']);
/* 按商品发的红包 */
$sql = "SELECT SUM(c.goods_number * t.type_money)" .
"FROM " . $GLOBALS['ecs']->table('cart') . " AS c, "
. $GLOBALS['ecs']->table('bonus_type') . " AS t, "
. $GLOBALS['ecs']->table('goods') . " AS g " .
"WHERE c.session_id = '" . SESS_ID . "' " .
"AND c.is_gift = 0 " .
"AND c.goods_id = g.goods_id " .
"AND g.bonus_type_id = t.type_id " .
"AND t.send_type = '" . SEND_BY_GOODS . "' " .
"AND t.send_start_date <= '$today' " .
"AND t.send_end_date >= '$today' " .
"AND c.rec_type = '" . CART_GENERAL_GOODS . "'";
$goods_total = floatval($GLOBALS['db']->getOne($sql));
/* 取得购物车中非赠品总金额 */
$sql = "SELECT SUM(goods_price * goods_number) " .
"FROM " . $GLOBALS['ecs']->table('cart') .
" WHERE session_id = '" . SESS_ID . "' " .
" AND is_gift = 0 " .
" AND rec_type = '" . CART_GENERAL_GOODS . "'";
$amount = floatval($GLOBALS['db']->getOne($sql));
/* 按订单发的红包 */
$sql = "SELECT FLOOR('$amount' / min_amount) * type_money " .
"FROM " . $GLOBALS['ecs']->table('bonus_type') .
" WHERE send_type = '" . SEND_BY_ORDER . "' " .
" AND send_start_date <= '$today' " .
"AND send_end_date >= '$today' " .
"AND min_amount > 0 ";
$order_total = floatval($GLOBALS['db']->getOne($sql));
return $goods_total + $order_total;
}
/**
* 处理红包(下订单时设为使用,取消(无效,退货)订单时设为未使用
* @param int $bonus_id 红包编号
* @param int $order_id 订单号
* @param int $is_used 是否使用了
*/
function change_user_bonus($bonus_id, $order_id, $is_used = true)
{
if ($is_used)
{
$sql = 'UPDATE ' . $GLOBALS['ecs']->table('user_bonus') . ' SET ' .
'used_time = ' . gmtime() . ', ' .
"order_id = '$order_id' " .
"WHERE bonus_id = '$bonus_id'";
}
else
{
$sql = 'UPDATE ' . $GLOBALS['ecs']->table('user_bonus') . ' SET ' .
'used_time = 0, ' .
'order_id = 0 ' .
"WHERE bonus_id = '$bonus_id'";
}
$GLOBALS['db']->query($sql);
}
/**
* 取得支付方式id列表
* @param bool $is_cod 是否货到付款
* @return array
*/
function payment_id_list($is_cod)
{
$sql = "SELECT pay_id FROM " . $GLOBALS['ecs']->table('payment');
if ($is_cod)
{
$sql .= " WHERE is_cod = 1";
}
else
{
$sql .= " WHERE is_cod = 0";
}
return $GLOBALS['db']->getCol($sql);
}
/**
* 发红包:发货时发红包
* @param int $order_id 订单号
* @return bool
*/
function send_order_bonus($order_id)
{
/* 取得订单应该发放的红包 */
$bonus_list = order_bonus($order_id);
/* 如果有红包,统计并发送 */
if ($bonus_list)
{
/* 用户信息 */
$sql = "SELECT u.user_id, u.user_name " .
"FROM " . $GLOBALS['ecs']->table('order_info') . " AS o, " .
$GLOBALS['ecs']->table('users') . " AS u " .
"WHERE o.order_id = '$order_id' " .
"AND o.user_id = u.user_id ";
$user = $GLOBALS['db']->getRow($sql);
/* 统计 */
$count = 0;
$money = '';
foreach ($bonus_list AS $bonus)
{
$count += $bonus['number'];
$money .= price_format($bonus['type_money']) . ' [' . $bonus['number'] . '], ';
/* 修改用户红包 */
$sql = "INSERT INTO " . $GLOBALS['ecs']->table('user_bonus') . " (bonus_type_id, user_id) " .
"VALUES('$bonus[type_id]', '$user[user_id]')";
for ($i = 0; $i < $bonus['number']; $i++)
{
if (!$GLOBALS['db']->query($sql))
{
return $GLOBALS['db']->errorMsg();
}
}
}
/* 如果有红包,发送邮件 */
if ($count > 0)
{
$tpl = get_mail_template('send_bonus');
$GLOBALS['smarty']->assign('user_name', $user['user_name']);
$GLOBALS['smarty']->assign('count', $count);
$GLOBALS['smarty']->assign('money', $money);
$GLOBALS['smarty']->assign('shop_name', $GLOBALS['_CFG']['shop_name']);
$GLOBALS['smarty']->assign('send_date', local_date($GLOBALS['_CFG']['date_format']));
$GLOBALS['smarty']->assign('sent_date', local_date($GLOBALS['_CFG']['date_format']));
$content = $GLOBALS['smarty']->fetch('str:' . $tpl['template_content']);
send_mail($user['user_name'], $user['email'], $tpl['template_subject'], $content, $tpl['is_html']);
}
}
return true;
}
/**
* 返回订单发放的红包
* @param int $order_id 订单id
*/
function return_order_bonus($order_id)
{
/* 取得订单应该发放的红包 */
$bonus_list = order_bonus($order_id);
/* 删除 */
if ($bonus_list)
{
/* 取得订单信息 */
$order = order_info($order_id);
$user_id = $order['user_id'];
foreach ($bonus_list AS $bonus)
{
$sql = "DELETE FROM " . $GLOBALS['ecs']->table('user_bonus') .
" WHERE bonus_type_id = '$bonus[type_id]' " .
"AND user_id = '$user_id' " .
"AND order_id = '0' LIMIT " . $bonus['number'];
$GLOBALS['db']->query($sql);
}
}
}
/**
* 取得订单应该发放的红包
* @param int $order_id 订单id
* @return array
*/
function order_bonus($order_id)
{
/* 查询按商品发的红包 */
$day = getdate();
$today = local_mktime(23, 59, 59, $day['mon'], $day['mday'], $day['year']);
$sql = "SELECT b.type_id, b.type_money, SUM(o.goods_number) AS number " .
"FROM " . $GLOBALS['ecs']->table('order_goods') . " AS o, " .
$GLOBALS['ecs']->table('goods') . " AS g, " .
$GLOBALS['ecs']->table('bonus_type') . " AS b " .
" WHERE o.order_id = '$order_id' " .
" AND o.is_gift = 0 " .
" AND o.goods_id = g.goods_id " .
" AND g.bonus_type_id = b.type_id " .
" AND b.send_type = '" . SEND_BY_GOODS . "' " .
" AND b.send_start_date <= '$today' " .
" AND b.send_end_date >= '$today' " .
" GROUP BY b.type_id ";
$list = $GLOBALS['db']->getAll($sql);
/* 查询定单中非赠品总金额 */
$amount = order_amount($order_id, false);
/* 查询订单日期 */
$sql = "SELECT add_time " .
" FROM " . $GLOBALS['ecs']->table('order_info') .
" WHERE order_id = '$order_id' LIMIT 1";
$order_time = $GLOBALS['db']->getOne($sql);
/* 查询按订单发的红包 */
$sql = "SELECT type_id, type_money, IFNULL(FLOOR('$amount' / min_amount), 1) AS number " .
"FROM " . $GLOBALS['ecs']->table('bonus_type') .
"WHERE send_type = '" . SEND_BY_ORDER . "' " .
"AND send_start_date <= '$order_time' " .
"AND send_end_date >= '$order_time' ";
$list = array_merge($list, $GLOBALS['db']->getAll($sql));
return $list;
}
/**
* 计算购物车中的商品能享受红包支付的总额
* @return float 享受红包支付的总额
*/
function compute_discount_amount()
{
/* 查询优惠活动 */
$now = gmtime();
$user_rank = ',' . $_SESSION['user_rank'] . ',';
$sql = "SELECT *" .
"FROM " . $GLOBALS['ecs']->table('favourable_activity') .
" WHERE start_time <= '$now'" .
" AND end_time >= '$now'" .
" AND CONCAT(',', user_rank, ',') LIKE '%" . $user_rank . "%'" .
" AND act_type " . db_create_in(array(FAT_DISCOUNT, FAT_PRICE));
$favourable_list = $GLOBALS['db']->getAll($sql);
if (!$favourable_list)
{
return 0;
}
/* 查询购物车商品 */
$sql = "SELECT c.goods_id, c.goods_price * c.goods_number AS subtotal, g.cat_id, g.brand_id " .
"FROM " . $GLOBALS['ecs']->table('cart') . " AS c, " . $GLOBALS['ecs']->table('goods') . " AS g " .
"WHERE c.goods_id = g.goods_id " .
"AND c.session_id = '" . SESS_ID . "' " .
"AND c.parent_id = 0 " .
"AND c.is_gift = 0 " .
"AND rec_type = '" . CART_GENERAL_GOODS . "'";
$goods_list = $GLOBALS['db']->getAll($sql);
if (!$goods_list)
{
return 0;
}
/* 初始化折扣 */
$discount = 0;
$favourable_name = array();
/* 循环计算每个优惠活动的折扣 */
foreach ($favourable_list as $favourable)
{
$total_amount = 0;
if ($favourable['act_range'] == FAR_ALL)
{
foreach ($goods_list as $goods)
{
$total_amount += $goods['subtotal'];
}
}
elseif ($favourable['act_range'] == FAR_CATEGORY)
{
/* 找出分类id的子分类id */
$id_list = array();
$raw_id_list = explode(',', $favourable['act_range_ext']);
foreach ($raw_id_list as $id)
{
$id_list = array_merge($id_list, array_keys(cat_list($id, 0, false)));
}
$ids = join(',', array_unique($id_list));
foreach ($goods_list as $goods)
{
if (strpos(',' . $ids . ',', ',' . $goods['cat_id'] . ',') !== false)
{
$total_amount += $goods['subtotal'];
}
}
}
elseif ($favourable['act_range'] == FAR_BRAND)
{
foreach ($goods_list as $goods)
{
if (strpos(',' . $favourable['act_range_ext'] . ',', ',' . $goods['brand_id'] . ',') !== false)
{
$total_amount += $goods['subtotal'];
}
}
}
elseif ($favourable['act_range'] == FAR_GOODS)
{
foreach ($goods_list as $goods)
{
if (strpos(',' . $favourable['act_range_ext'] . ',', ',' . $goods['goods_id'] . ',') !== false)
{
$total_amount += $goods['subtotal'];
}
}
}
else
{
continue;
}
if ($total_amount > 0 && $total_amount >= $favourable['min_amount'] && ($total_amount <= $favourable['max_amount'] || $favourable['max_amount'] == 0))
{
if ($favourable['act_type'] == FAT_DISCOUNT)
{
$discount += $total_amount * (1 - $favourable['act_type_ext'] / 100);
}
elseif ($favourable['act_type'] == FAT_PRICE)
{
$discount += $favourable['act_type_ext'];
}
}
}
return $discount;
}
/**
* 使用者訂單
* @param int $order_id 订单id
* @param array $order key => value
* @return bool
*/
function update_order($id, $order)
{
return $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('user_account'),
$order, 'UPDATE', "id = '$id'");
}
?>