www.gusucode.com > Ectouch手机端网购商城系统PHP版源码程序 > ectouch/include/apps/default/model/UsersModel.class.php

    <?php

/**
 * ECTouch Open Source Project
 * ============================================================================
 * Copyright (c) 2012-2014 http://ectouch.cn All rights reserved.
 * ----------------------------------------------------------------------------
 * 文件名称:UserModel.php
 * ----------------------------------------------------------------------------
 * 功能描述:ECTouch 用户模型
 * ----------------------------------------------------------------------------
 * Licensed ( http://www.ectouch.cn/docs/license.txt )
 * ----------------------------------------------------------------------------
 */

/* 访问控制 */
defined('IN_ECTOUCH') or die('Deny Access');

class UsersModel extends BaseModel {

    protected $table = 'users';

    /**
     * 更新用户SESSION,COOKIE及登录时间、登录次数。
     *
     * @access  public
     * @return  void
     */
    function update_user_info() {
        if (!$_SESSION['user_id']) {
            return false;
        }

        /* 查询会员信息 */
        $time = date('Y-m-d');
        $sql = 'SELECT u.user_money,u.email, u.pay_points, u.user_rank, u.rank_points, ' .
                ' IFNULL(b.type_money, 0) AS user_bonus, u.last_login, u.last_ip' .
                ' FROM ' . $this->pre . 'users AS u ' .
                ' LEFT JOIN ' . $this->pre . 'user_bonus AS ub' .
                ' ON ub.user_id = u.user_id AND ub.used_time = 0 ' .
                ' LEFT JOIN ' . $this->pre . 'bonus_type AS b' .
                " ON b.type_id = ub.bonus_type_id AND b.use_start_date <= '$time' AND b.use_end_date >= '$time' " .
                " WHERE u.user_id = '$_SESSION[user_id]'";
        if ($row = $this->row($sql)) {
            /* 更新SESSION */
            $_SESSION['last_time'] = $row['last_login'];
            $_SESSION['last_ip'] = $row['last_ip'];
            $_SESSION['login_fail'] = 0;
            $_SESSION['email'] = $row['email'];

            /* 判断是否是特殊等级,可能后台把特殊会员组更改普通会员组 */
            if ($row['user_rank'] > 0) {
                $sql = "SELECT special_rank from " . $this->pre . "user_rank where rank_id='$row[user_rank]'";
                $res = $this->row($sql);
                if ($res['special_rank'] === '0' || $res['special_rank'] === null) {
                    $sql = "update " . $this->pre . "users set user_rank='0' where user_id='$_SESSION[user_id]'";
                    $this->query($sql);
                    $row['user_rank'] = 0;
                }
            }
            /* 取得用户等级和折扣 */
            if ($row['user_rank'] == 0) {
                // 非特殊等级,根据等级积分计算用户等级(注意:不包括特殊等级)
                $sql = 'SELECT rank_id, discount FROM ' . $this->pre . "user_rank WHERE special_rank = '0' AND min_points <= " . intval($row['rank_points']) . ' AND max_points > ' . intval($row['rank_points']);
                if ($row = $this->row($sql)) {
                    $_SESSION['user_rank'] = $row['rank_id'];
                    $_SESSION['discount'] = $row['discount'] / 100.00;
                } else {
                    $_SESSION['user_rank'] = 0;
                    $_SESSION['discount'] = 1;
                }
            } else {
                // 特殊等级
                $sql = 'SELECT rank_id, discount FROM ' . $this->pre . "user_rank WHERE rank_id = '$row[user_rank]'";
                if ($row = $this->row($sql)) {
                    $_SESSION['user_rank'] = $row['rank_id'];
                    $_SESSION['discount'] = $row['discount'] / 100.00;
                } else {
                    $_SESSION['user_rank'] = 0;
                    $_SESSION['discount'] = 1;
                }
            }
        }

        /* 更新登录时间,登录次数及登录ip */
        $sql = "UPDATE " . $this->pre . "users SET" .
                " visit_count = visit_count + 1, " .
                " last_ip = '" . real_ip() . "'," .
                " last_login = '" . gmtime() . "'" .
                " WHERE user_id = '" . $_SESSION['user_id'] . "'";
        $this->query($sql);
    }

    /**
     * 用户注册,登录函数
     *
     * @access  public
     * @param   string       $username          注册用户名
     * @param   string       $password          用户密码
     * @param   string       $email             注册email
     * @param   array        $other             注册的其他信息
     *
     * @return  bool         $bool
     */
    function register($username, $password, $email, $other = array()) {
        /* 检查注册是否关闭 */
        $shop_reg_closed = C('shop_reg_closed');
        if (!empty($shop_reg_closed)) {
            ECTouch::err()->add(L('shop_register_closed'));
        }
        /* 检查username */
        if (empty($username)) {
            ECTouch::err()->add(L('username_empty'));
        } else {
            if (preg_match('/\'\/^\\s*$|^c:\\\\con\\\\con$|[%,\\*\\"\\s\\t\\<\\>\\&\'\\\\]/', $username)) {
                ECTouch::err()->add(sprintf(L('username_invalid'), htmlspecialchars($username)));
            }
        }

        /* 检查email */
        if (empty($email)) {
            ECTouch::err()->add(L('email_empty'));
        } else {
            if (!is_email($email)) {
                ECTouch::err()->add(sprintf(L('email_invalid'), htmlspecialchars($email)));
            }
        }

        if (ECTouch::err()->error_no > 0) {
            return false;
        }

        /* 检查是否和管理员重名 */
        if (model('Users')->admin_registered($username)) {
            ECTouch::err()->add(sprintf(L('username_exist'), $username));
            return false;
        }

        if (!ECTouch::user()->add_user($username, $password, $email)) {
            if (ECTouch::user()->error == ERR_INVALID_USERNAME) {
                ECTouch::err()->add(sprintf(L('username_invalid'), $username));
            } elseif (ECTouch::user()->error == ERR_USERNAME_NOT_ALLOW) {
                ECTouch::err()->add(sprintf(L('username_not_allow'), $username));
            } elseif (ECTouch::user()->error == ERR_USERNAME_EXISTS) {
                ECTouch::err()->add(sprintf(L('username_exist'), $username));
            } elseif (ECTouch::user()->error == ERR_INVALID_EMAIL) {
                ECTouch::err()->add(sprintf(L('email_invalid'), $email));
            } elseif (ECTouch::user()->error == ERR_EMAIL_NOT_ALLOW) {
                ECTouch::err()->add(sprintf(L('email_not_allow'), $email));
            } elseif (ECTouch::user()->error == ERR_EMAIL_EXISTS) {
                ECTouch::err()->add(sprintf(L('email_exist'), $email));
            } else {
                ECTouch::err()->add('UNKNOWN ERROR!');
            }

            //注册失败
            return false;
        } else {
            //注册成功

            /* 设置成登录状态 */
            ECTouch::user()->set_session($username);
            ECTouch::user()->set_cookie($username);

            /* 注册送积分 */
            $register_points = C('register_points');
            if (!empty($register_points)) {
                model('ClipsBase')->log_account_change($_SESSION['user_id'], 0, 0, C('register_points'), C('register_points'), L('register_points'));
            }
            
            //定义other合法的变量数组
            $other_key_array = array('msn', 'qq', 'office_phone', 'home_phone', 'mobile_phone', 'parent_id');
            $update_data['reg_time'] = local_strtotime(local_date('Y-m-d H:i:s'));
            if ($other) {
                foreach ($other as $key => $val) {
                    //删除非法key值
                    if (!in_array($key, $other_key_array)) {
                        unset($other[$key]);
                    } else {
                        $other[$key] = htmlspecialchars(trim($val)); //防止用户输入javascript代码
                    }
                }
                $update_data = array_merge($update_data, $other);
            }
            $condition['user_id'] = $_SESSION['user_id'];
            $this->update($condition, $update_data);

            /* 推荐处理 */
            $affiliate = unserialize(C('affiliate'));
            if (isset($affiliate['on']) && $affiliate['on'] == 1) {
                // 推荐开关开启
                $up_uid = model('Users')->get_affiliate();
                empty($affiliate) && $affiliate = array();
                $affiliate['config']['level_register_all'] = intval($affiliate['config']['level_register_all']);
                $affiliate['config']['level_register_up'] = intval($affiliate['config']['level_register_up']);
                if ($up_uid) {
                    if (!empty($affiliate['config']['level_register_all'])) {
                        if (!empty($affiliate['config']['level_register_up'])) {
                            $res = $this->row("SELECT rank_points FROM " . $this->pre . "users WHERE user_id = '$up_uid'");
                            if ($res['rank_points'] + $affiliate['config']['level_register_all'] <= $affiliate['config']['level_register_up']) {
                                model('ClipsBase')->log_account_change($up_uid, 0, 0, $affiliate['config']['level_register_all'], 0, sprintf(L('register_affiliate'), $_SESSION['user_id'], $username));
                            }
                        } else {
                            model('ClipsBase')->log_account_change($up_uid, 0, 0, $affiliate['config']['level_register_all'], 0, L('register_affiliate'));
                        }
                    }

                    //设置推荐人
                    $sql = 'UPDATE ' . $this->pre . 'users SET parent_id = ' . $up_uid . ' WHERE user_id = ' . $_SESSION['user_id'];

                    $this->query($sql);
                }
            }

            model('Users')->update_user_info();      // 更新用户信息
            model('Users')->recalculate_price();     // 重新计算购物车中的商品价格

            return true;
        }
    }

    /**
     *  发送激活验证邮件
     *
     * @access  public
     * @param   int     $user_id        用户ID
     *
     * @return boolen
     */
    function send_regiter_hash($user_id) {
        /* 设置验证邮件模板所需要的内容信息 */
        $template = model('Base')->get_mail_template('register_validate');
        $hash = model('Users')->register_hash('encode', $user_id);
        $validate_email = __HOST__ . url('user/validate_email', array('hash' => $hash)); //ECTouch::ecs()->url() . 'user.php?act=validate_email&hash=' . $hash;

        $sql = "SELECT user_name, email FROM " . $this->pre . "users WHERE user_id = '$user_id'";
        $row = $this->row($sql);

        ECTouch::view()->assign('user_name', $row['user_name']);
        ECTouch::view()->assign('validate_email', $validate_email);
        ECTouch::view()->assign('shop_name', C('shop_name'));
        ECTouch::view()->assign('send_date', date(C('date_format')));

        $content = ECTouch::view()->fetch('str:' . $template['template_content']);

        /* 发送激活验证邮件 */
        if (send_mail($row['user_name'], $row['email'], $template['template_subject'], $content, $template['is_html'])) {
            return true;
        } else {
            return false;
        }
    }

    /**
     *  生成邮件验证hash
     *
     * @access  public
     * @param
     *
     * @return void
     */
    function register_hash($operation, $key) {
        if ($operation == 'encode') {
            $user_id = intval($key);
            $sql = "SELECT reg_time " .
                    " FROM " . $this->pre .
                    "users WHERE user_id = '$user_id' LIMIT 1";
            $res = $this->row($sql);
            $reg_time = $res['reg_time'];
            $hash = substr(md5($user_id . C('hash_code') . $reg_time), 16, 4);

            return base64_encode($user_id . ',' . $hash);
        } else {
            $hash = base64_decode(trim($key));
            $row = explode(',', $hash);
            if (count($row) != 2) {
                return 0;
            }
            $user_id = intval($row[0]);
            $salt = trim($row[1]);

            if ($user_id <= 0 || strlen($salt) != 4) {
                return 0;
            }

            $sql = "SELECT reg_time " .
                    " FROM " . $this->pre .
                    "users WHERE user_id = '$user_id' LIMIT 1";
            $res = $this->row($sql);
            $reg_time = $res['reg_time'];
            $pre_salt = substr(md5($user_id . C('hash_code') . $reg_time), 16, 4);

            if ($pre_salt == $salt) {
                return $user_id;
            } else {
                return 0;
            }
        }
    }

    /**
     * 判断超级管理员用户名是否存在
     * @param   string      $adminname 超级管理员用户名
     * @return  boolean
     */
    function admin_registered($adminname) {
        $sql = "SELECT COUNT(*) as count FROM " . $this->pre .
                "admin_user WHERE user_name = '$adminname'";
        $res = $this->row($sql);
        return $res['count'];
    }

    /**
     * 修改个人资料(Email, 性别,生日)
     *
     * @access  public
     * @param   array       $profile       array_keys(user_id int, email string, sex int, birthday string);
     *
     * @return  boolen      $bool
     */
    function edit_profile($profile) {
        if (empty($profile['user_id'])) {
            ECTouch::err()->add(L('not_login'));
            return false;
        }

        $cfg = array();
        $sql = "SELECT user_name FROM " . $this->pre . "users WHERE user_id='" . $profile['user_id'] . "'";
        $res = $this->row($sql);
        $cfg['username'] = $res['user_name'];
        if (isset($profile['sex'])) {
            $cfg['gender'] = intval($profile['sex']);
        }
        if (!empty($profile['email'])) {
            if (!is_email($profile['email'])) {
                ECTouch::err()->add(sprintf(L('email_invalid'), $profile['email']));

                return false;
            }
            $cfg['email'] = $profile['email'];
        }
        if (!empty($profile['birthday'])) {
            $cfg['bday'] = $profile['birthday'];
        }


        if (!ECTouch::user()->edit_user($cfg)) {
            if (ECTouch::user()->error == ERR_EMAIL_EXISTS) {
                ECTouch::err()->add(sprintf(L('email_exist'), $profile['email']));
            } else {
                ECTouch::err()->add('DB ERROR!');
            }

            return false;
        }

        /* 过滤非法的键值 */
        $other_key_array = array('msn', 'qq', 'office_phone', 'home_phone', 'mobile_phone');
        foreach ($profile['other'] as $key => $val) {
            //删除非法key值
            if (!in_array($key, $other_key_array)) {
                unset($profile['other'][$key]);
            } else {
                $profile['other'][$key] = htmlspecialchars(trim($val)); //防止用户输入javascript代码
            }
        }
        /* 修改在其他资料 */
        if (!empty($profile['other'])) {
            $condition['user_id'] = $profile['user_id'];
            $this->update($condition, $profile['other']);
        }

        return true;
    }

    /**
     * 获取用户帐号信息
     *
     * @access  public
     * @param   int       $user_id        用户user_id
     *
     * @return void
     */
    function get_profile($user_id) {

        /* 会员帐号信息 */
        $info = array();
        $infos = array();
        $sql = "SELECT user_name, birthday, sex, question, answer, rank_points, pay_points,user_money, user_rank," .
                " msn, qq, office_phone, home_phone, mobile_phone, passwd_question, passwd_answer " .
                "FROM " . $this->pre . "users WHERE user_id = '$user_id'";
        $infos = $this->row($sql);
        $infos['user_name'] = addslashes($infos['user_name']);

        $row = ECTouch::user()->get_profile_by_name($infos['user_name']); //获取用户帐号信息
        $_SESSION['email'] = $row['email'];    //注册SESSION

        /* 会员等级 */
        if ($infos['user_rank'] > 0) {
            $sql = "SELECT rank_id, rank_name, discount FROM " . $this->pre .
                    "user_rank WHERE rank_id = '$infos[user_rank]'";
        } else {
            $sql = "SELECT rank_id, rank_name, discount, min_points" .
                    " FROM " . $this->pre .
                    "user_rank WHERE min_points<= " . intval($infos['rank_points']) . " ORDER BY min_points DESC";
        }

        if ($row = $this->row($sql)) {
            $info['rank_name'] = $row['rank_name'];
        } else {
            $info['rank_name'] = L('undifine_rank');
        }

        $cur_date = date('Y-m-d H:i:s');

        /* 会员红包 */
        $bonus = array();
        $sql = "SELECT type_name, type_money " .
                "FROM " . $this->pre . "bonus_type AS t1, " . $this->pre . "user_bonus AS t2 " .
                "WHERE t1.type_id = t2.bonus_type_id AND t2.user_id = '$user_id' AND t1.use_start_date <= '$cur_date' " .
                "AND t1.use_end_date > '$cur_date' AND t2.order_id = 0";
        $bonus = $this->query($sql);
        if ($bonus) {
            for ($i = 0, $count = count($bonus); $i < $count; $i++) {
                $bonus[$i]['type_money'] = price_format($bonus[$i]['type_money'], false);
            }
        }

        $info['discount'] = $_SESSION['discount'] * 100 . "%";
        $info['email'] = $_SESSION['email'];
        $info['user_name'] = $_SESSION['user_name'];
        $info['rank_points'] = isset($infos['rank_points']) ? $infos['rank_points'] : '';
        $info['pay_points'] = isset($infos['pay_points']) ? $infos['pay_points'] : 0;
        $info['user_money'] = isset($infos['user_money']) ? $infos['user_money'] : 0;
        $info['sex'] = isset($infos['sex']) ? $infos['sex'] : 0;
        $info['birthday'] = isset($infos['birthday']) ? $infos['birthday'] : '';
        $info['question'] = isset($infos['question']) ? htmlspecialchars($infos['question']) : '';

        $info['user_money'] = price_format($info['user_money'], false);
        $info['pay_points'] = $info['pay_points'] . C('integral_name');
        $info['bonus'] = $bonus;
        $info['qq'] = $infos['qq'];
        $info['msn'] = $infos['msn'];
        $info['office_phone'] = $infos['office_phone'];
        $info['home_phone'] = $infos['home_phone'];
        $info['mobile_phone'] = $infos['mobile_phone'];
        $info['passwd_question'] = $infos['passwd_question'];
        $info['passwd_answer'] = $infos['passwd_answer'];
        $info['user_rank'] = $infos['user_rank'];

        return $info;
    }

    /**
     * 取得收货人地址列表
     * @param   int     $user_id    用户编号
     * @param   int     $id         收货地址id
     * @return  array
     */
    function get_consignee_list($user_id, $id = 0, $num = 10, $start = 0) {
        if ($id) {
            $where['address_id'] = $id;
            $this->table = 'user_address';
            return $this->find($where);
        } else {
            $sql = 'select * from ' . $this->pre . 'user_address where user_id = ' . $user_id . ' order by address_id limit ' . $start . ', ' . $num;
            return $this->query($sql);
        }
    }

    /**
     *  给指定用户添加一个指定红包
     *
     * @access  public
     * @param   int         $user_id        用户ID
     * @param   string      $bouns_sn       红包序列号
     *
     * @return  boolen      $result
     */
    function add_bonus($user_id, $bouns_sn) {
        if (empty($user_id)) {
            ECTouch::err()->add(L('not_login'));

            return false;
        }
        /* 查询红包序列号是否已经存在 */
        $sql = "SELECT bonus_id, bonus_sn, user_id, bonus_type_id FROM " . $this->pre .
                "user_bonus WHERE bonus_sn = '$bouns_sn'";
        $row = $this->row($sql);
        if ($row) {
            if ($row['user_id'] == 0) {
                //红包没有被使用
                $sql = "SELECT send_end_date, use_end_date " .
                        " FROM " . $this->pre .
                        "bonus_type WHERE type_id = '" . $row['bonus_type_id'] . "'";

                $bonus_time = $this->row($sql);

                $now = gmtime();
                if ($now > $bonus_time['use_end_date']) {
                    ECTouch::err()->add(L('bonus_use_expire'));
                    return false;
                }

                $sql = "UPDATE " . $this->pre . "user_bonus SET user_id = '$user_id' " .
                        "WHERE bonus_id = '$row[bonus_id]'";
                $result = $this->query($sql);
                if ($result) {
                    return true;
                } else {
                    return M()->errorMsg();
                }
            } else {
                if ($row['user_id'] == $user_id) {
                    //红包已经添加过了。
                    ECTouch::err()->add(L('bonus_is_used'));
                } else {
                    //红包被其他人使用过了。
                    ECTouch::err()->add(L('bonus_is_used_by_other'));
                }

                return false;
            }
        } else {
            //红包不存在
            ECTouch::err()->add(L('bonus_not_exist'));
            return false;
        }
    }

    /**
     *  获取用户指定范围的订单列表
     *
     * @access  public
     * @param   int         $user_id        用户ID号
     * @param   int         $pay            订单状态,0未付款,1全部,默认1
     * @param   int         $num            列表最大数量
     * @param   int         $start          列表起始位置
     * @return  array       $order_list     订单列表
     */
    function get_user_orders($user_id, $pay = 1, $num = 10, $start = 0) {
        /* 取得订单列表 */
        $arr = array();

        if ($pay == 1) {
            $pay = '';
        } else {
            $pay = 'and pay_status = ' . PS_UNPAYED;
        }

        $sql = "SELECT order_id, order_sn, shipping_id, order_status, shipping_status, pay_status, add_time, " .
                "(goods_amount + shipping_fee + insure_fee + pay_fee + pack_fee + card_fee + tax - discount) AS total_fee " .
                " FROM " . $this->pre .
                "order_info WHERE user_id = '$user_id' " . $pay . " ORDER BY add_time DESC LIMIT $start , $num";
        $res = M()->query($sql);
        foreach ($res as $key => $value) {
            if ($value['order_status'] == OS_UNCONFIRMED) {
                $value['handler'] = "<a href=\"" . url('user/cancel_order', array('order_id' => $value['order_id'])) . "\" onclick=\"if (!confirm('" . L('confirm_cancel') . "')) return false;\">" . L('cancel') . "</a>";
            } else if ($value['order_status'] == OS_SPLITED) {
                /* 对配送状态的处理 */
                if ($value['shipping_status'] == SS_SHIPPED) {
                    @$value['handler'] = "<a href=\"" . url('user/affirm_received', array('order_id' => $value['order_id'])) . "\" onclick=\"if (!confirm('" . L('confirm_received') . "')) return false;\">" . L('received') . "</a>";
                } elseif ($value['shipping_status'] == SS_RECEIVED) {
                    @$value['handler'] = '<span style="color:red">' . L('ss_received') . '</span>';
                } else {
                    if ($value['pay_status'] == PS_UNPAYED) {
                        @$value['handler'] = "<a href=\"" . url('user/cancel_order', array('order_id' => $value['order_id'])) . "\">" . L('pay_money') . "</a>";
                    } else {
                        @$value['handler'] = "<a href=\"" . url('user/cancel_order', array('order_id' => $value['order_id'])) . "\">" . L('view_order') . "</a>";
                    }
                }
            } else {
                $value['handler'] = '<span>' . L('os.' . $value['order_status']) . '</span>';
            }

            $value['shipping_status'] = ($value['shipping_status'] == SS_SHIPPED_ING) ? SS_PREPARING : $value['shipping_status'];
            $value['order_status'] = L('os.' . $value['order_status']) . ',' . L('ps.' . $value['pay_status']) . ',' . L('ss.' . $value['shipping_status']);



            $arr[] = array('order_id' => $value['order_id'],
                'order_sn' => $value['order_sn'],
                'img' => get_image_path(0, model('Order')->get_order_thumb($value['order_id'])),
                'order_time' => local_date(C('time_format'), $value['add_time']),
                'order_status' => $value['order_status'],
                'shipping_id' => $value['shipping_id'],
                'total_fee' => price_format($value['total_fee'], false),
                'url' => url('user/order_detail', array('order_id' => $value['order_id'])),
                'goods_count' => model('Users')->get_order_goods_count($value['order_id']),
                'handler' => $value['handler']);
        }
        return $arr;
    }

    /**
     * 取消一个用户订单
     *
     * @access  public
     * @param   int         $order_id       订单ID
     * @param   int         $user_id        用户ID
     *
     * @return void
     */
    function cancel_order($order_id, $user_id = 0) {
        /* 查询订单信息,检查状态 */
        $sql = "SELECT user_id, order_id, order_sn , surplus , integral , bonus_id, order_status, shipping_status, pay_status FROM " . $this->pre . "order_info WHERE order_id = '$order_id'";
        $order = $this->row($sql);

        if (empty($order)) {
            ECTouch::err()->add(L('order_exist'));
            return false;
        }

        // 如果用户ID大于0,检查订单是否属于该用户
        if ($user_id > 0 && $order['user_id'] != $user_id) {
            ECTouch::err()->add(L('no_priv'));

            return false;
        }

        // 订单状态只能是“未确认”或“已确认”
        if ($order['order_status'] != OS_UNCONFIRMED && $order['order_status'] != OS_CONFIRMED) {
            ECTouch::err()->add(L('current_os_not_unconfirmed'));

            return false;
        }

        //订单一旦确认,不允许用户取消
        if ($order['order_status'] == OS_CONFIRMED) {
            ECTouch::err()->add(L('current_os_already_confirmed'));

            return false;
        }

        // 发货状态只能是“未发货”
        if ($order['shipping_status'] != SS_UNSHIPPED) {
            ECTouch::err()->add(L('current_ss_not_cancel'));

            return false;
        }

        // 如果付款状态是“已付款”、“付款中”,不允许取消,要取消和商家联系
        if ($order['pay_status'] != PS_UNPAYED) {
            ECTouch::err()->add(L('current_ps_not_cancel'));

            return false;
        }

        //将用户订单设置为取消
        $sql = "UPDATE " . $this->pre . "order_info SET order_status = '" . OS_CANCELED . "' WHERE order_id = '$order_id'";
        if ($this->query($sql)) {
            /* 记录log */
            model('OrderBase')->order_action($order['order_sn'], OS_CANCELED, $order['shipping_status'], PS_UNPAYED, L('buyer_cancel'), 'buyer');
            /* 退货用户余额、积分、红包 */
            if ($order['user_id'] > 0 && $order['surplus'] > 0) {
                $change_desc = sprintf(L('return_surplus_on_cancel'), $order['order_sn']);
                model('ClipsBase')->log_account_change($order['user_id'], $order['surplus'], 0, 0, 0, $change_desc);
            }
            if ($order['user_id'] > 0 && $order['integral'] > 0) {
                $change_desc = sprintf(L('return_integral_on_cancel'), $order['order_sn']);
                model('ClipsBase')->log_account_change($order['user_id'], 0, 0, 0, $order['integral'], $change_desc);
            }
            if ($order['user_id'] > 0 && $order['bonus_id'] > 0) {
                model('Order')->change_user_bonus($order['bonus_id'], $order['order_id'], false);
            }

            /* 如果使用库存,且下订单时减库存,则增加库存 */
            if (C('use_storage') == '1' && C('stock_dec_time') == SDT_PLACE) {
                model('Order')->change_order_goods_storage($order['order_id'], false, 1);
            }

            /* 修改订单 */
            $arr = array(
                'bonus_id' => 0,
                'bonus' => 0,
                'integral' => 0,
                'integral_money' => 0,
                'surplus' => 0
            );
            model('Users')->update_order($order['order_id'], $arr);

            return true;
        } else {
            die(M()->errorMsg());
        }
    }

    /**
     * 确认一个用户订单
     *
     * @access  public
     * @param   int         $order_id       订单ID
     * @param   int         $user_id        用户ID
     *
     * @return  bool        $bool
     */
    function affirm_received($order_id, $user_id = 0) {
        /* 查询订单信息,检查状态 */
        $sql = "SELECT user_id, order_sn , order_status, shipping_status, pay_status FROM " . $this->pre . "order_info WHERE order_id = '$order_id'";

        $order = $this->row($sql);

        // 如果用户ID大于 0 。检查订单是否属于该用户
        if ($user_id > 0 && $order['user_id'] != $user_id) {
            ECTouch::err()->add(L('no_priv'));

            return false;
        }
        /* 检查订单 */ elseif ($order['shipping_status'] == SS_RECEIVED) {
            ECTouch::err()->add(L('order_already_received'));

            return false;
        } elseif ($order['shipping_status'] != SS_SHIPPED) {
            ECTouch::err()->add(L('order_invalid'));

            return false;
        }
        /* 修改订单发货状态为“确认收货” */ else {
            $sql = "UPDATE " . $this->pre . "order_info SET shipping_status = '" . SS_RECEIVED . "' WHERE order_id = '$order_id'";
            if ($this->query($sql)) {
                /* 记录日志 */
                model('OrderBase')->order_action($order['order_sn'], $order['order_status'], SS_RECEIVED, $order['pay_status'], '', L('buyer'));

                return true;
            } else {
                die(M()->errorMsg());
            }
        }
    }

    /**
     * 保存用户的收货人信息
     * 如果收货人信息中的 id 为 0 则新增一个收货人信息
     *
     * @access  public
     * @param   array   $consignee
     * @param   boolean $default        是否将该收货人信息设置为默认收货人信息
     * @return  boolean
     */
    function save_consignee($consignee, $default = false) {
        if ($consignee['address_id'] > 0) {
            /* 修改地址 */
            $this->table = 'user_address';
            $data['address_id'] = $consignee['address_id'];
            $condition['address_id'] = $consignee['address_id'];
            $condition['user_id'] = $_SESSION['user_id'];
            $res = $this->update($condition, $consignee);
        } else {
            /* 添加地址 */
            $this->table = 'user_address';
            $res = $this->insert($consignee);
            $consignee['address_id'] = M()->insert_id();
        }

        if ($default) {
            /* 保存为用户的默认收货地址 */
            $sql = "UPDATE " . $this->pre .
                    "users SET address_id = '$consignee[address_id]' WHERE user_id = '$_SESSION[user_id]'";

            $res = $this->query($sql);
        }

        return $res !== false;
    }

    /**
     * 删除一个收货地址
     *
     * @access  public
     * @param   integer $id
     * @return  boolean
     */
    function drop_consignee($id) {
        $sql = "SELECT user_id FROM " . $this->pre . "user_address WHERE address_id = '$id'";
        $res = $this->row($sql);
        $uid = $res['user_id'];

        if ($uid != $_SESSION['user_id']) {
            return false;
        } else {
            $sql = "DELETE FROM " . $this->pre . "user_address WHERE address_id = '$id'";
            $res = $this->query($sql);
            return $res;
        }
    }

    /**
     *  添加或更新指定用户收货地址
     *
     * @access  public
     * @param   array       $address
     * @return  bool
     */
    function update_address($address) {
        $address_id = intval($address['address_id']);
        unset($address['address_id']);
        $this->table = 'user_address';
        if ($address_id > 0) {
            /* 更新指定记录 */
            $condition['address_id'] = $address_id;
            $condition['user_id'] = $address['user_id'];
            $this->update($condition, $address);
        } else {
            /* 插入一条新记录 */
            $this->insert($address);
            $address_id = mysql_insert_id();
        }

        if (isset($address['defalut']) && $address['default'] > 0 && isset($address['user_id'])) {
            $sql = "UPDATE " . $this->pre .
                    "users SET address_id = '" . $address_id . "' " .
                    " WHERE user_id = '" . $address['user_id'] . "'";
            $this->query($sql);
        }

        return true;
    }

    /**
     *  获取指订单的详情
     *
     * @access  public
     * @param   int         $order_id       订单ID
     * @param   int         $user_id        用户ID
     *
     * @return   arr        $order          订单所有信息的数组
     */
    function get_order_detail($order_id, $user_id = 0) {

        $order_id = intval($order_id);
        if ($order_id <= 0) {
            ECTouch::err()->add(L('invalid_order_id'));

            return false;
        }
        $order = model('Order')->order_info($order_id);

        //切换手机订单的关联的支付方式
        if ($order['mobile_pay'] <= 0) {
            //查询手机版支付方式的配置参数
            $sql = "SELECT pay_id, pay_config FROM " . $this->pre . 'touch_payment';
            $touch_payment_list = $this->query($sql);
            if (is_array($touch_payment_list)) {
                foreach ($touch_payment_list as $vo) {
                    $touch_store = unserialize($vo['pay_config']);
                    /* 取出已经设置属性的code */
                    $touch_code_list = array();
                    foreach ($touch_store as $key => $value) {
                        if ($value['name'] == 'relate_pay' && $value['value'] == $order['pay_id']) {
                            $touch_pay_id = $vo['pay_id'];
                        }
                    }
                }
            }

            // 默认没有设置关联支付方式的
            if ($touch_pay_id <= 0) {
                $payment_list = model('Order')->available_payment_list(false, 0, true);
                /* 过滤掉余额支付方式 */
                if (is_array($payment_list)) {
                    foreach ($payment_list as $key => $payment) {
                        if ($payment['pay_code'] != 'balance') {
                            $touch_pay_id = $payment['pay_id'];
                            break;
                        }
                    }
                }
            }

            /* 检查订单是否未付款和未发货 以及订单金额是否为0 和支付id是否为改变 */
            if ($touch_pay_id > 0 && $order['pay_status'] == PS_UNPAYED && $order['shipping_status'] == SS_UNSHIPPED && $order['goods_amount'] > 0) {
                //查询电脑版支付方式
                $touch_payment_info = model('Order')->payment_info($touch_pay_id);
                $order['pay_id'] = $touch_payment_info['pay_id'];
                $order['pay_name'] = $touch_payment_info['pay_name'];

                $order_amount = $order['order_amount'] - $order['pay_fee'];
                $pay_fee = pay_fee($touch_pay_id, $order_amount);
                $order_amount += $pay_fee;

                $sql = "UPDATE " . $this->pre .
                        "order_info SET pay_id='$touch_pay_id', pay_name='$touch_payment_info[pay_name]', pay_fee='$pay_fee', order_amount='$order_amount', `mobile_pay` = '1'" .
                        " WHERE order_id = '$order_id'";
                $this->query($sql);
            }
        }

        //检查订单是否属于该用户
        if ($user_id > 0 && $user_id != $order['user_id']) {
            ECTouch::err()->add(L('no_priv'));

            return false;
        }

        /* 对发货号处理 */
        if (!empty($order['invoice_no'])) {
            $sql = "SELECT shipping_code FROM " . $this->pre . "shipping WHERE shipping_id = '$order[shipping_id]'";
            $res = $this->row($sql);
            $shipping_code = $res['shipping_code'];
            $plugin = ROOT_PATH . 'includes/modules/shipping/' . $shipping_code . '.php';
            if (file_exists($plugin)) {
                include_once($plugin);
                $shipping = new $shipping_code;
                $order['invoice_no'] = $shipping->query($order['invoice_no']);
            }
        }

        /* 只有未确认才允许用户修改订单地址 */
        if ($order['order_status'] == OS_UNCONFIRMED) {
            $order['allow_update_address'] = 1; //允许修改收货地址
        } else {
            $order['allow_update_address'] = 0;
        }

        /* 获取订单中实体商品数量 */
        $order['exist_real_goods'] = model('Order')->exist_real_goods($order_id);

        /* 如果是未付款状态,生成支付按钮 */
        if ($order['pay_status'] == PS_UNPAYED && ($order['order_status'] == OS_UNCONFIRMED || $order['order_status'] == OS_CONFIRMED)) {
            /*
             * 在线支付按钮
             */
            //支付方式信息
            $payment_info = array();
            $payment_info = Model('Order')->payment_info($order['pay_id']);

            //无效支付方式
            if ($payment_info === false || substr($payment_info['pay_code'], 0 , 4) == 'pay_') {
                $order['pay_online'] = '';
            } else {
                //取得支付信息,生成支付代码
                $payment = unserialize_config($payment_info['pay_config']);

                //获取需要支付的log_id
                $order['log_id'] = model('ClipsBase')->get_paylog_id($order['order_id'], $pay_type = PAY_ORDER);
                $order['user_name'] = $_SESSION['user_name'];
                $order['pay_desc'] = $payment_info['pay_desc'];

                /* 调用相应的支付方式文件 */
                include_once(ROOT_PATH . 'plugins/payment/' . $payment_info['pay_code'] . '.php');

                /* 取得在线支付方式的支付按钮 */
                $pay_obj = new $payment_info['pay_code'];
                $order['pay_online'] = $pay_obj->get_code($order, $payment);
            }
        } else {
            $order['pay_online'] = '';
        }

        /* 无配送时的处理 */
        $order['shipping_id'] == -1 and $order['shipping_name'] = L('shipping_not_need');

        /* 其他信息初始化 */
        $order['how_oos_name'] = $order['how_oos'];
        $order['how_surplus_name'] = $order['how_surplus'];

        /* 虚拟商品付款后处理 */
        if ($order['pay_status'] != PS_UNPAYED) {
            /* 取得已发货的虚拟商品信息 */
            $virtual_goods = model('OrderBase')->get_virtual_goods($order_id, true);
            $virtual_card = array();
            foreach ($virtual_goods AS $code => $goods_list) {
                /* 只处理虚拟卡 */
                if ($code == 'virtual_card') {
                    foreach ($goods_list as $goods) {
                        if ($info = model('OrderBase')->virtual_card_result($order['order_sn'], $goods)) {
                            $virtual_card[] = array('goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name'], 'info' => $info);
                        }
                    }
                }
                /* 处理超值礼包里面的虚拟卡 */
                if ($code == 'package_buy') {
                    foreach ($goods_list as $goods) {
                        $sql = 'SELECT g.goods_id FROM ' . $this->pre . 'package_goods AS pg, ' . $this->pre . 'goods AS g ' .
                                "WHERE pg.goods_id = g.goods_id AND pg.package_id = '" . $goods['goods_id'] . "' AND extension_code = 'virtual_card'";
                        $vcard_arr = $this->query($sql);

                        foreach ($vcard_arr AS $val) {
                            if ($info = model('OrderBase')->virtual_card_result($order['order_sn'], $val)) {
                                $virtual_card[] = array('goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name'], 'info' => $info);
                            }
                        }
                    }
                }
            }
            $var_card = deleteRepeat($virtual_card);
            ECTouch::view()->assign('virtual_card', $var_card);
        }

        /* 确认时间 支付时间 发货时间 */
        if ($order['confirm_time'] > 0 && ($order['order_status'] == OS_CONFIRMED || $order['order_status'] == OS_SPLITED || $order['order_status'] == OS_SPLITING_PART)) {
            $order['confirm_time'] = sprintf(L('confirm_time'), local_date(C('time_format'), $order['confirm_time']));
        } else {
            $order['confirm_time'] = '';
        }
        if ($order['pay_time'] > 0 && $order['pay_status'] != PS_UNPAYED) {
            $order['pay_time'] = sprintf(L('pay_time'), local_date(C('time_format'), $order['pay_time']));
        } else {
            $order['pay_time'] = '';
        }
        if ($order['shipping_time'] > 0 && in_array($order['shipping_status'], array(SS_SHIPPED, SS_RECEIVED))) {
            $order['shipping_time'] = sprintf(L('shipping_time'), local_date(C('time_format'), $order['shipping_time']));
        } else {
            $order['shipping_time'] = '';
        }

        return $order;
    }

    /**
     *  获取用户可以和并的订单数组
     *
     * @access  public
     * @param   int         $user_id        用户ID
     *
     * @return  array       $merge          可合并订单数组
     */
    function get_user_merge($user_id) {
        $sql = "SELECT order_sn FROM " . $this->pre .
                "order_info WHERE user_id  = '$user_id' " . order_query_sql('unprocessed') .
                "AND extension_code = '' " .
                " ORDER BY add_time DESC";
        $list = $this->query($sql);
        $merge = array();
        foreach ($list as $key => $value) {

            $merge[$value['order_sn']] = $value['order_sn'];
        }
        return $merge;
    }

    /**
     *  合并指定用户订单
     *
     * @access  public
     * @param   string      $from_order         合并的从订单号
     * @param   string      $to_order           合并的主订单号
     *
     * @return  boolen      $bool
     */
    function merge_user_order($from_order, $to_order, $user_id = 0) {
        if ($user_id > 0) {
            /* 检查订单是否属于指定用户 */
            if (strlen($to_order) > 0) {
                $sql = "SELECT user_id FROM " . $this->pre .
                        "order_info WHERE order_sn = '$to_order'";
                $res = $this->row($sql);
                $order_user = $res['user_id'];
                if ($order_user != $user_id) {
                    ECTouch::err()->add(L('no_priv'));
                }
            } else {
                ECTouch::err()->add(L('order_sn_empty'));
                return false;
            }
        }

        $result = model('Order')->merge_order($from_order, $to_order);
        if ($result === true) {
            return true;
        } else {
            ECTouch::err()->add($result);
            return false;
        }
    }

    /**
     *  将指定订单中的商品添加到购物车
     *
     * @access  public
     * @param   int         $order_id
     *
     * @return  mix         $message        成功返回true, 错误返回出错信息
     */
    function return_to_cart($order_id) {
        /* 初始化基本件数量 goods_id => goods_number */
        $basic_number = array();

        /* 查订单商品:不考虑赠品 */
        $sql = "SELECT goods_id, product_id,goods_number, goods_attr, parent_id, goods_attr_id" .
                " FROM " . $this->pre .
                "order_goods WHERE order_id = '$order_id' AND is_gift = 0 AND extension_code <> 'package_buy'" .
                " ORDER BY parent_id ASC";
        $res = $this->query($sql);

        $time = gmtime();
        foreach ($res as $row) {
            // 查该商品信息:是否删除、是否上架

            $sql = "SELECT goods_sn, goods_name, goods_number, market_price, " .
                    "IF(is_promote = 1 AND '$time' BETWEEN promote_start_date AND promote_end_date, promote_price, shop_price) AS goods_price," .
                    "is_real, extension_code, is_alone_sale, goods_type " .
                    "FROM " . $this->pre .
                    "goods WHERE goods_id = '$row[goods_id]' " .
                    " AND is_delete = 0 LIMIT 1";
            $goods = $this->row($sql);

            // 如果该商品不存在,处理下一个商品
            if (empty($goods)) {
                continue;
            }
            if ($row['product_id']) {
                $order_goods_product_id = $row['product_id'];
                $sql = "SELECT product_number from " . $this->pre . "products where product_id='$order_goods_product_id'";
                $res = $this->row($sql);
                $product_number = $res['product_number'];
            }
            // 如果使用库存,且库存不足,修改数量
            if (C('use_storage') == 1 && ($row['product_id'] ? ($product_number < $row['goods_number']) : ($goods['goods_number'] < $row['goods_number']))) {
                if ($goods['goods_number'] == 0 || $product_number === 0) {
                    // 如果库存为0,处理下一个商品
                    continue;
                } else {
                    if ($row['product_id']) {
                        $row['goods_number'] = $product_number;
                    } else {
                        // 库存不为0,修改数量
                        $row['goods_number'] = $goods['goods_number'];
                    }
                }
            }

            //检查商品价格是否有会员价格
            $sql = "SELECT goods_number FROM" . $this->pre . " " .
                    "cart WHERE session_id = '" . SESS_ID . "' " .
                    "AND goods_id = '" . $row['goods_id'] . "' " .
                    "AND rec_type = '" . CART_GENERAL_GOODS . "' LIMIT 1";
            $res = $this->row($sql);
            $temp_number = $res['goods_number'];
            $row['goods_number'] += $temp_number;

            $attr_array = empty($row['goods_attr_id']) ? array() : explode(',', $row['goods_attr_id']);
            $goods['goods_price'] = model('GoodsBase')->get_final_price($row['goods_id'], $row['goods_number'], true, $attr_array);

            // 要返回购物车的商品
            $return_goods = array(
                'goods_id' => $row['goods_id'],
                'goods_sn' => addslashes($goods['goods_sn']),
                'goods_name' => addslashes($goods['goods_name']),
                'market_price' => $goods['market_price'],
                'goods_price' => $goods['goods_price'],
                'goods_number' => $row['goods_number'],
                'goods_attr' => empty($row['goods_attr']) ? '' : addslashes($row['goods_attr']),
                'goods_attr_id' => empty($row['goods_attr_id']) ? '' : addslashes($row['goods_attr_id']),
                'is_real' => $goods['is_real'],
                'extension_code' => addslashes($goods['extension_code']),
                'parent_id' => '0',
                'is_gift' => '0',
                'rec_type' => CART_GENERAL_GOODS
            );

            // 如果是配件
            if ($row['parent_id'] > 0) {
                // 查询基本件信息:是否删除、是否上架、能否作为普通商品销售
                $sql = "SELECT goods_id " .
                        "FROM " . $this->pre .
                        "goods WHERE goods_id = '$row[parent_id]' " .
                        " AND is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1 LIMIT 1";
                $parent = $this->row($sql);
                if ($parent) {
                    // 如果基本件存在,查询组合关系是否存在
                    $sql = "SELECT goods_price " .
                            "FROM " . $this->pre .
                            "group_goods WHERE parent_id = '$row[parent_id]' " .
                            " AND goods_id = '$row[goods_id]' LIMIT 1";
                    $fitting_price = $this->row($sql);
                    if ($fitting_price['goods_price']) {
                        // 如果组合关系存在,取配件价格,取基本件数量,改parent_id
                        $return_goods['parent_id'] = $row['parent_id'];
                        $return_goods['goods_price'] = $fitting_price['goods_price'];
                        $return_goods['goods_number'] = $basic_number[$row['parent_id']];
                    }
                }
            } else {
                // 保存基本件数量
                $basic_number[$row['goods_id']] = $row['goods_number'];
            }

            // 返回购物车:看有没有相同商品
            $sql = "SELECT goods_id " .
                    "FROM " . $this->pre .
                    "cart WHERE session_id = '" . SESS_ID . "' " .
                    " AND goods_id = '$return_goods[goods_id]' " .
                    " AND goods_attr = '$return_goods[goods_attr]' " .
                    " AND parent_id = '$return_goods[parent_id]' " .
                    " AND is_gift = 0 " .
                    " AND rec_type = '" . CART_GENERAL_GOODS . "'";
            $res = $this->row($sql);
            $cart_goods = $res['goods_id'];
            if (empty($cart_goods)) {
                // 没有相同商品,插入
                $return_goods['session_id'] = SESS_ID;
                $return_goods['user_id'] = $_SESSION['user_id'];
                $this->table = 'cart';
                $this->insert($return_goods);
            } else {
                // 有相同商品,修改数量
                $sql = "UPDATE " . $this->pre . "cart SET " .
                        "goods_number = '" . $return_goods['goods_number'] . "' " .
                        ",goods_price = '" . $return_goods['goods_price'] . "' " .
                        "WHERE session_id = '" . SESS_ID . "' " .
                        "AND goods_id = '" . $return_goods['goods_id'] . "' " .
                        "AND rec_type = '" . CART_GENERAL_GOODS . "' LIMIT 1";
                $this->query($sql);
            }
        }


        // 清空购物车的赠品
        $sql = "DELETE FROM " . $this->pre .
                "cart WHERE session_id = '" . SESS_ID . "' AND is_gift = 1";
        $this->query($sql);

        return true;
    }

    /**
     *  保存用户收货地址
     *
     * @access  public
     * @param   array   $address        array_keys(consignee string, email string, address string, zipcode string, tel string, mobile stirng, sign_building string, best_time string, order_id int)
     * @param   int     $user_id        用户ID
     *
     * @return  boolen  $bool
     */
    function save_order_address($address, $user_id) {
        ECTouch::err()->clean();
        /* 数据验证 */
        empty($address['consignee']) and ECTouch::err()->add(L('consigness_empty'));
        empty($address['address']) and ECTouch::err()->add(L('address_empty'));
        $address['order_id'] == 0 and ECTouch::err()->add(L('order_id_empty'));
        if (empty($address['email'])) {
            ECTouch::err()->add($GLOBALS['email_empty']);
        } else {
            if (!is_email($address['email'])) {
                ECTouch::err()->add(sprintf(L('email_invalid'), $address['email']));
            }
        }
        if (ECTouch::err()->error_no > 0) {
            return false;
        }

        /* 检查订单状态 */
        $sql = "SELECT user_id, order_status FROM " . $this->pre . "order_info WHERE order_id = '" . $address['order_id'] . "'";
        $row = $this->row($sql);
        if ($row) {
            if ($user_id > 0 && $user_id != $row['user_id']) {
                ECTouch::err()->add(L('no_priv'));
                return false;
            }
            if ($row['order_status'] != OS_UNCONFIRMED) {
                ECTouch::err()->add(L('require_unconfirmed'));
                return false;
            }
            $this->table = 'order_info';
            $condition['order_id'] = $address['order_id'];
            $this->update($condition, $address);
            return true;
        } else {
            /* 订单不存在 */
            ECTouch::err()->add(L('order_exist'));
            return false;
        }
    }

    /**
     *
     * @access  public
     * @param   int         $user_id         用户ID
     * @param   int         $num             列表显示条数
     * @param   int         $start           显示起始位置
     *
     * @return  array       $arr             红保列表
     */
    function get_user_bouns_list($user_id, $num = 10, $start = 0) {
        $sql = "SELECT u.bonus_sn, u.order_id, b.type_name, b.type_money, b.min_goods_amount, b.use_start_date, b.use_end_date " .
                " FROM " . $this->pre . "user_bonus AS u ," .
                $this->pre . "bonus_type AS b" .
                " WHERE u.bonus_type_id = b.type_id AND u.user_id = '" . $user_id . "' LIMIT $start , $num";
        $res = $this->query($sql);
        $arr = array();

        $day = getdate();
        $cur_date = local_mktime(23, 59, 59, $day['mon'], $day['mday'], $day['year']);
        foreach ($res as $row) {
            /* 先判断是否被使用,然后判断是否开始或过期 */
            if (empty($row['order_id'])) {
                /* 没有被使用 */
                if ($row['use_start_date'] > $cur_date) {
                    $row['status'] = L('not_start');
                } else if ($row['use_end_date'] < $cur_date) {
                    $row['status'] = L('overdue');
                } else {
                    $row['status'] = L('not_use');
                }
            } else {
                $url = url('user/order_detail', array('order_id'=>$row['order_id']));
                $row['status'] = '<a href="'.$url.'" >' . L('had_use') . '</a>';
            }

            $row['use_startdate'] = local_date(C('date_format'), $row['use_start_date']);
            $row['use_enddate'] = local_date(C('date_format'), $row['use_end_date']);

            $arr[] = $row;
        }
        return $arr;
    }

    /**
     * 通过判断is_feed 向UCenter提交Feed
     *
     * @access public
     * @param  integer $value_id  $order_id or $comment_id
     * @param  interger $feed_type BUY_GOODS or COMMENT_GOODS
     *
     * @return void
     */
    function add_feed($id, $feed_type) {
        $feed = array();
        if ($feed_type == BUY_GOODS) {
            if (empty($id)) {
                return;
            }
            $id = intval($id);
            $sql = "SELECT g.goods_id, g.goods_name, g.goods_sn, g.goods_desc, g.goods_thumb, o.goods_price FROM " . $this->pre . "order_goods AS o, " . $this->pre . "goods AS g WHERE o.order_id='{$id}' AND o.goods_id=g.goods_id";
            $order_res = $this->query($sql);
            foreach ($order_res as $goods_data) {
                if (!empty($goods_data['goods_thumb'])) {
                    $url = __URL__ . $goods_data['goods_thumb']; //ECTouch::ecs()->url() . $goods_data['goods_thumb'];
                } else {
                    $url = __URL__ . C('no_picture'); //ECTouch::ecs()->url() . C('no_picture');
                }
                $link = __HOST__ . url('goods/index', array('id' => $goods_data["goods_id"])); //ECTouch::ecs()->url() . "goods.php?id=" . $goods_data["goods_id"];

                $feed['icon'] = "goods";
                $feed['title_template'] = '<b>{username} ' . L('feed_user_buy') . ' {goods_name}</b>';
                $feed['title_data'] = array('username' => $_SESSION['user_name'], 'goods_name' => $goods_data['goods_name']);
                $feed['body_template'] = '{goods_name}  ' . L('feed_goods_price') . ':{goods_price}  ' . L('feed_goods_desc') . ':{goods_desc}';
                $feed['body_data'] = array('goods_name' => $goods_data['goods_name'], 'goods_price' => $goods_data['goods_price'], 'goods_desc' => sub_str(strip_tags($goods_data['goods_desc']), 150, true));
                $feed['images'][] = array('url' => $url,
                    'link' => $link);
                uc_call("uc_feed_add", array($feed['icon'], $_SESSION['user_id'], $_SESSION['user_name'], $feed['title_template'], $feed['title_data'], $feed ['body_template'], $feed['body_data'], '', '', $feed['images']));
            }
        }
        return;
    }

    /**
     * 指定默认配送地址
     * 
     */
    function save_consignee_default($address_id) {
        /* 保存为用户的默认收货地址 */
        $sql = "UPDATE " . $this->pre .
                "users SET address_id = '$address_id' WHERE user_id = '$_SESSION[user_id]'";

        $res = $this->query($sql);

        return $res !== false;
    }

    /**
     * 根据商品id获取购物车中此id的数量
     */
    function get_goods_number($goods_id) {
        // 查询
        $sql = "SELECT IFNULL(SUM(goods_number), 0) as number " .
                " FROM " . $this->pre .
                "cart WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "' AND goods_id = " . $goods_id;
        $res = $this->row($sql);
        return $res['number'];
    }

    /**
     *  获取用户信息数组
     *
     * @access  public
     * @param
     *
     * @return array        $user       用户信息数组
     */
    function get_user_info($id = 0) {
        if ($id == 0) {
            $id = $_SESSION['user_id'];
        }
        $time = date('Y-m-d');
        $sql = 'SELECT u.user_id, u.email, u.user_name, u.user_money, u.pay_points' .
                ' FROM ' . $this->pre . 'users AS u ' .
                " WHERE u.user_id = '$id'";
        $user = $this->row($sql);
        $bonus = model('ClipsBase')->get_user_bonus($id);

        $user['username'] = $user['user_name'];
        $user['user_points'] = $user['pay_points'] . C('integral_name');
        $user['user_money'] = price_format($user['user_money'], false);
        $user['user_bonus'] = price_format($bonus['bonus_value'], false);

        return $user;
    }

    /**
     * 获得订单中的费用信息
     *
     * @access  public
     * @param   array   $order
     * @param   array   $goods
     * @param   array   $consignee
     * @param   bool    $is_gb_deposit  是否团购保证金(如果是,应付款金额只计算商品总额和支付费用,可以获得的积分取 $gift_integral)
     * @return  array
     */
    function order_fee($order, $goods, $consignee) {
        /* 初始化订单的扩展code */
        if (!isset($order['extension_code'])) {
            $order['extension_code'] = '';
        }

        if ($order['extension_code'] == 'group_buy') {
            $group_buy = model('GroupBuyBase')->group_buy_info($order['extension_id']);
        }

        $total = array('real_goods_count' => 0,
            'gift_amount' => 0,
            'goods_price' => 0,
            'market_price' => 0,
            'discount' => 0,
            'pack_fee' => 0,
            'card_fee' => 0,
            'shipping_fee' => 0,
            'shipping_insure' => 0,
            'integral_money' => 0,
            'bonus' => 0,
            'surplus' => 0,
            'cod_fee' => 0,
            'pay_fee' => 0,
            'tax' => 0);
        $weight = 0;

        /* 商品总价 */
        foreach ($goods AS $val) {
            /* 统计实体商品的个数 */
            if ($val['is_real']) {
                $total['real_goods_count']++;
            }

            $total['goods_price'] += $val['goods_price'] * $val['goods_number'];
            $total['market_price'] += $val['market_price'] * $val['goods_number'];
        }

        $total['saving'] = $total['market_price'] - $total['goods_price'];
        $total['save_rate'] = $total['market_price'] ? round($total['saving'] * 100 / $total['market_price']) . '%' : 0;

        $total['goods_price_formated'] = price_format($total['goods_price'], false);
        $total['market_price_formated'] = price_format($total['market_price'], false);
        $total['saving_formated'] = price_format($total['saving'], false);

        /* 折扣 */
        if ($order['extension_code'] != 'group_buy') {
            $discount = model('Order')->compute_discount();
            $total['discount'] = $discount['discount'];
            if ($total['discount'] > $total['goods_price']) {
                $total['discount'] = $total['goods_price'];
            }
        }
        $total['discount_formated'] = price_format($total['discount'], false);

        /* 税额 */
        if (!empty($order['need_inv']) && $order['inv_type'] != '') {
            /* 查税率 */
            $rate = 0;
            $invoice_type = C('invoice_type');
            foreach ($invoice_type['type'] as $key => $type) {
                if ($type == $order['inv_type']) {
                    $rate = floatval($invoice_type['rate'][$key]) / 100;
                    break;
                }
            }
            if ($rate > 0) {
                $total['tax'] = $rate * $total['goods_price'];
            }
        }
        $total['tax_formated'] = price_format($total['tax'], false);

        /* 包装费用 */
        if (!empty($order['pack_id'])) {
            $total['pack_fee'] = pack_fee($order['pack_id'], $total['goods_price']);
        }
        $total['pack_fee_formated'] = price_format($total['pack_fee'], false);

        /* 贺卡费用 */
        if (!empty($order['card_id'])) {
            $total['card_fee'] = card_fee($order['card_id'], $total['goods_price']);
        }
        $total['card_fee_formated'] = price_format($total['card_fee'], false);

        /* 红包 */

        if (!empty($order['bonus_id'])) {
            $bonus = model('Order')->bonus_info($order['bonus_id']);
            $total['bonus'] = $bonus['type_money'];
        }
        $total['bonus_formated'] = price_format($total['bonus'], false);

        /* 线下红包 */
        if (!empty($order['bonus_kill'])) {
            $bonus = model('Order')->bonus_info(0, $order['bonus_kill']);
            $total['bonus_kill'] = $order['bonus_kill'];
            $total['bonus_kill_formated'] = price_format($total['bonus_kill'], false);
        }



        /* 配送费用 */
        $shipping_cod_fee = NULL;

        if ($order['shipping_id'] > 0 && $total['real_goods_count'] > 0) {
            $region['country'] = $consignee['country'];
            $region['province'] = $consignee['province'];
            $region['city'] = $consignee['city'];
            $region['district'] = $consignee['district'];
            $shipping_info = model('Shipping')->shipping_area_info($order['shipping_id'], $region);

            if (!empty($shipping_info)) {
                if ($order['extension_code'] == 'group_buy') {
                    $weight_price = model('Order')->cart_weight_price(CART_GROUP_BUY_GOODS);
                } else {
                    $weight_price = model('Order')->cart_weight_price();
                }

                // 查看购物车中是否全为免运费商品,若是则把运费赋为零
                $sql = 'SELECT count(*) as count FROM ' . $this->pre . "cart WHERE  `session_id` = '" . SESS_ID . "' AND `extension_code` != 'package_buy' AND `is_shipping` = 0";
                $res = $this->row($sql);
                $shipping_count = $res['count'];

                $total['shipping_fee'] = ($shipping_count == 0 AND $weight_price['free_shipping'] == 1) ? 0 : shipping_fee($shipping_info['shipping_code'], $shipping_info['configure'], $weight_price['weight'], $total['goods_price'], $weight_price['number']);

                if (!empty($order['need_insure']) && $shipping_info['insure'] > 0) {
                    $total['shipping_insure'] = shipping_insure_fee($shipping_info['shipping_code'], $total['goods_price'], $shipping_info['insure']);
                } else {
                    $total['shipping_insure'] = 0;
                }

                if ($shipping_info['support_cod']) {
                    $shipping_cod_fee = $shipping_info['pay_fee'];
                }
            }
        }

        $total['shipping_fee_formated'] = price_format($total['shipping_fee'], false);
        $total['shipping_insure_formated'] = price_format($total['shipping_insure'], false);

        // 购物车中的商品能享受红包支付的总额
        $bonus_amount = model('Order')->compute_discount_amount();
        // 红包和积分最多能支付的金额为商品总额
        $max_amount = $total['goods_price'] == 0 ? $total['goods_price'] : $total['goods_price'] - $bonus_amount;

        /* 计算订单总额 */
        if ($order['extension_code'] == 'group_buy' && $group_buy['deposit'] > 0) {
            $total['amount'] = $total['goods_price'];
        } else {
            $total['amount'] = $total['goods_price'] - $total['discount'] + $total['tax'] + $total['pack_fee'] + $total['card_fee'] +
                    $total['shipping_fee'] + $total['shipping_insure'] + $total['cod_fee'];

            // 减去红包金额
            $use_bonus = min($total['bonus'], $max_amount); // 实际减去的红包金额
            if (isset($total['bonus_kill'])) {
                $use_bonus_kill = min($total['bonus_kill'], $max_amount);
                $total['amount'] -= $price = number_format($total['bonus_kill'], 2, '.', ''); // 还需要支付的订单金额
            }

            $total['bonus'] = $use_bonus;
            $total['bonus_formated'] = price_format($total['bonus'], false);

            $total['amount'] -= $use_bonus; // 还需要支付的订单金额
            $max_amount -= $use_bonus; // 积分最多还能支付的金额
        }

        /* 余额 */
        $order['surplus'] = $order['surplus'] > 0 ? $order['surplus'] : 0;
        if ($total['amount'] > 0) {
            if (isset($order['surplus']) && $order['surplus'] > $total['amount']) {
                $order['surplus'] = $total['amount'];
                $total['amount'] = 0;
            } else {
                $total['amount'] -= floatval($order['surplus']);
            }
        } else {
            $order['surplus'] = 0;
            $total['amount'] = 0;
        }
        $total['surplus'] = $order['surplus'];
        $total['surplus_formated'] = price_format($order['surplus'], false);

        /* 积分 */
        $order['integral'] = $order['integral'] > 0 ? $order['integral'] : 0;
        if ($total['amount'] > 0 && $max_amount > 0 && $order['integral'] > 0) {
            $integral_money = value_of_integral($order['integral']);

            // 使用积分支付
            $use_integral = min($total['amount'], $max_amount, $integral_money); // 实际使用积分支付的金额
            $total['amount'] -= $use_integral;
            $total['integral_money'] = $use_integral;
            $order['integral'] = integral_of_value($use_integral);
        } else {
            $total['integral_money'] = 0;
            $order['integral'] = 0;
        }
        $total['integral'] = $order['integral'];
        $total['integral_formated'] = price_format($total['integral_money'], false);

        /* 保存订单信息 */
        $_SESSION['flow_order'] = $order;

        $se_flow_type = isset($_SESSION['flow_type']) ? $_SESSION['flow_type'] : '';

        /* 支付费用 */
        if (!empty($order['pay_id']) && ($total['real_goods_count'] > 0 || $se_flow_type != CART_EXCHANGE_GOODS)) {
            $total['pay_fee'] = pay_fee($order['pay_id'], $total['amount'], $shipping_cod_fee);
        }

        $total['pay_fee_formated'] = price_format($total['pay_fee'], false);

        $total['amount'] += $total['pay_fee']; // 订单总额累加上支付费用
        $total['amount_formated'] = price_format($total['amount'], false);

        /* 取得可以得到的积分和红包 */
        if ($order['extension_code'] == 'group_buy') {
            $total['will_get_integral'] = $group_buy['gift_integral'];
        } elseif ($order['extension_code'] == 'exchange_goods') {
            $total['will_get_integral'] = 0;
        } else {
            $total['will_get_integral'] = model('Order')->get_give_integral($goods);
        }
        $total['will_get_bonus'] = $order['extension_code'] == 'exchange_goods' ? 0 : price_format(model('Order')->get_total_bonus(), false);
        $total['formated_goods_price'] = price_format($total['goods_price'], false);
        $total['formated_market_price'] = price_format($total['market_price'], false);
        $total['formated_saving'] = price_format($total['saving'], false);

        if ($order['extension_code'] == 'exchange_goods') {
            $sql = 'SELECT SUM(eg.exchange_integral) ' .
                    'as sum FROM ' . $this->pre . 'cart AS c,' . $this->pre . 'exchange_goods AS eg ' .
                    "WHERE c.goods_id = eg.goods_id AND c.session_id= '" . SESS_ID . "' " .
                    "  AND c.rec_type = '" . CART_EXCHANGE_GOODS . "' " .
                    '  AND c.is_gift = 0 AND c.goods_id > 0 ' .
                    'GROUP BY eg.goods_id';
            $res = $this->row($sql);
            $exchange_integral = $res['sum'];
            $total['exchange_integral'] = $exchange_integral;
        }

        return $total;
    }

    /**
     * 修改订单
     * @param   int     $order_id   订单id
     * @param   array   $order      key => value
     * @return  bool
     */
    function update_order($order_id, $order) {
        $this->table = 'order_info';
        $condition['order_id'] = $order_id;
        
        $res = $this->query('DESC ' . $this->pre . $this->table);
        
        while ($row = mysql_fetch_row($res)) {
            $field_names[] = $row[0];
        }
        foreach ($field_names as $value) {
            if (array_key_exists($value, $order) == true) {
                $order_info[$value] = $order[$value];
            }
        }
        return $this->update($condition, $order_info);
    }

    /**
     * 重新计算购物车中的商品价格:目的是当用户登录时享受会员价格,当用户退出登录时不享受会员价格
     * 如果商品有促销,价格不变
     *
     * @access  public
     * @return  void
     */
    function recalculate_price() {
        /* 取得有可能改变价格的商品:除配件和赠品之外的商品 */
        $sql = 'SELECT c.rec_id, c.goods_id, c.goods_attr_id, g.promote_price, g.promote_start_date, c.goods_number,' .
                "g.promote_end_date, IFNULL(mp.user_price, g.shop_price * '$_SESSION[discount]') AS member_price " .
                'FROM ' . $this->pre . 'cart AS c ' .
                'LEFT JOIN ' . $this->pre . 'goods AS g ON g.goods_id = c.goods_id ' .
                "LEFT JOIN " . $this->pre . "member_price AS mp " .
                "ON mp.goods_id = g.goods_id AND mp.user_rank = '" . $_SESSION['user_rank'] . "' " .
                "WHERE session_id = '" . SESS_ID . "' AND c.parent_id = 0 AND c.is_gift = 0 AND c.goods_id > 0 " .
                "AND c.rec_type = '" . CART_GENERAL_GOODS . "' AND c.extension_code <> 'package_buy'";

        $res = $this->query($sql);

        foreach ($res AS $row) {
            $attr_id = empty($row['goods_attr_id']) ? array() : explode(',', $row['goods_attr_id']);


            $goods_price = model('GoodsBase')->get_final_price($row['goods_id'], $row['goods_number'], true, $attr_id);


            $goods_sql = "UPDATE " . $this->pre . "cart SET goods_price = '$goods_price' " .
                    "WHERE goods_id = '" . $row['goods_id'] . "' AND session_id = '" . SESS_ID . "' AND rec_id = '" . $row['rec_id'] . "'";

            $this->query($goods_sql);
        }

        /* 删除赠品,重新选择 */
        $this->query('DELETE FROM ' . $this->pre .
                "cart WHERE session_id = '" . SESS_ID . "' AND is_gift > 0");
    }

    /**
     * 获取推荐uid
     *
     * @access  public
     * @param   void
     *
     * @return int
     * @author xuanyan
     * */
    function get_affiliate() {
        if (!empty($_COOKIE['ecshop_affiliate_uid'])) {
            $uid = intval($_COOKIE['ecshop_affiliate_uid']);
            if ($this->row('SELECT user_id FROM ' . $this->pre . "users WHERE user_id = '$uid'")) {
                return $uid;
            } else {
                setcookie('ecshop_affiliate_uid', '', 1);
            }
        }
        elseif($_SESSION['user_id'] !== 0){
            //推荐 by ecmoban
            $reg_info = $this->model->table('users')->field('reg_time, parent_id')->where('user_id = '.$_SESSION['user_id'])->find();
            //推荐信息
            $config = unserialize(C('affiliate'));
            if (!empty($config['config']['expire'])) {
                if ($config['config']['expire_unit'] == 'hour') {
                    $c = 1;
                } elseif ($config['config']['expire_unit'] == 'day') {
                    $c = 24;
                } elseif ($config['config']['expire_unit'] == 'week') {
                    $c = 24 * 7;
                } else {
                    $c = 1;
                }
                //有效时间
                $eff_time = 3600 * $config['config']['expire'] * $c;
                //有效时间内
                if(gmtime() - $reg_info['reg_time'] <= $eff_time){
                    return $reg_info['parent_id'];
                }
            }
        }

        return 0;
    }
    /**
     * 检查是否为第三方用户
     * @param type $user_id
     * @return type
     */
    function is_third_user($user_id) {
        $sql = 'SELECT count(*) as count FROM ' . $this->pre . 'touch_user_info t LEFT JOIN ' . $this->pre .
                'users u ON t.user_id = u.user_id  WHERE u.user_id = "' . $user_id . '" ';
        $res = $this->row($sql);
        return $res['count'];
    }
    /**
     * 检查该用户是否启动过第三方登录 
     * @param type $aite_id
     * @return type 
     */
    function get_one_user($aite_id) {
        $sql = 'SELECT u.user_name FROM ' . $this->pre . 'users u LEFT JOIN ' . $this->pre .
                'touch_user_info t ON t.user_id = u.user_id WHERE t.aite_id = "' . $aite_id . '" ';
        $res = $this->row($sql);
        return $res['user_name'];
    }

    /**
     * 插入第三方登录信息到数据库 
     * @param type $info
     * @return boolean
     */
    function third_reg($info) {
        $username = $info['user_name'];
        $password = time();
        $email = $info['email'];
        if ($this->register($username, $password, $email) !== false) {
            // 更新附表
            $this->table = "touch_user_info";
            $touch_data['user_id'] = $uid;
            $touch_data['aite_id'] = $info['aite_id'];
            $this->insert($touch_data);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 检查用户名是否重名 by leah
     * @param type $user_name
     * @return type
     */
    function check_user_name($user_name) {
        $this->table = 'users';
        $condition['user_name'] = $user_name;
        return $this->count($condition);
    }
	
	 /**
     * 获取订单商品数量
     * @return type
     */
    function get_order_goods_count($order_id) {
    
        $sql = "SELECT  COUNT(*) as count " .
            "FROM " . $this->pre . "order_goods AS o " .
            "LEFT JOIN " . $this->pre . "products AS p ON o.product_id = p.product_id " .
            "LEFT JOIN " . $this->pre . "goods AS g ON o.goods_id = g.goods_id " .
            "WHERE o.order_id = '$order_id' ";
        $res = $this->row($sql);
        return $res['count'];
    }
    
    /**
     * 查询会员账户明细
     * @access  public
     * @param   int     $user_id    会员ID
     * @param   int     $num        每页显示数量
     * @param   int     $start      开始显示的条数
     * @return  array
     */
    public function get_account_detail($user_id, $num, $start) {
        
        // 获取余额记录
        $account_log = array();
        
        $sql = 'SELECT * FROM ' . $this->pre . "account_log WHERE user_id = " . $user_id . ' AND user_money <> 0' .
        " ORDER BY log_id DESC limit " . $start . ',' . $num;
        $res = $this->query($sql);
        
        if (empty($res)) {
            return array();
            exit;
        }
        
        foreach ($res as $k => $v) {
            $res[$k]['change_time'] = local_date(C('date_format'), $v['change_time']);
            $res[$k]['type'] = $v['user_money'] > 0 ? L('account_inc') : L('account_dec');
            $res[$k]['user_money'] = price_format(abs($v['user_money']), false);
            $res[$k]['frozen_money'] = price_format(abs($v['frozen_money']), false);
            $res[$k]['rank_points'] = abs($v['rank_points']);
            $res[$k]['pay_points'] = abs($v['pay_points']);
            $res[$k]['short_change_desc'] = sub_str($v['change_desc'], 60);
            $res[$k]['amount'] = $v['user_money'];
        }
        
        return $res;
        
       
    }

}