$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'"); } ?>