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

    <?php

/**
 * ECTouch Open Source Project
 * ============================================================================
 * Copyright (c) 2012-2014 http://ectouch.cn All rights reserved.
 * ----------------------------------------------------------------------------
 * 文件名称:GroupbuyBaseModel.class.php
 * ----------------------------------------------------------------------------
 * 功能描述:ECTOUCH 团购基础模型
 * ----------------------------------------------------------------------------
 * Licensed ( http://www.ectouch.cn/docs/license.txt )
 * ----------------------------------------------------------------------------
 */

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

class GroupBuyBaseModel extends BaseModel {

    /**
     * 取得团购活动信息
     * @param   int     $group_buy_id   团购活动id
     * @param   int     $current_num    本次购买数量(计算当前价时要加上的数量)
     * @return  array
     *                  status          状态:
     */
    function group_buy_info($group_buy_id, $current_num = 0) {
        /* 取得团购活动信息 */
        $group_buy_id = intval($group_buy_id);
        $sql = "SELECT *, a.act_id AS group_buy_id, a.act_desc AS group_buy_desc, a.start_time AS start_date, a.end_time AS end_date ,
        ta.sales_count ,ta.act_banner , ta.click_num " .
                "FROM " . $this->pre .
                "goods_activity as a LEFT JOIN " . $this->pre . 'touch_goods_activity as ta ON a.act_id = ta.act_id ' .
                "WHERE a.act_id = '$group_buy_id' " .
                "AND a.act_type = '" . GAT_GROUP_BUY . "'";
        $group_buy = $this->row($sql);

        /* 如果为空,返回空数组 */
        if (empty($group_buy)) {
            return array();
        }

        $ext_info = unserialize($group_buy['ext_info']);
        $group_buy = array_merge($group_buy, $ext_info);

        /* 格式化时间 */
        $group_buy['formated_start_date'] = local_date('Y-m-d H:i', $group_buy['start_time']);
        $group_buy['formated_end_date'] = local_date('Y-m-d H:i', $group_buy['end_time']);

        /* 格式化保证金 */
        $group_buy['formated_deposit'] = price_format($group_buy['deposit'], false);

        /* 处理价格阶梯 */
        $price_ladder = $group_buy['price_ladder'];
        if (!is_array($price_ladder) || empty($price_ladder)) {
            $price_ladder = array(array('amount' => 0, 'price' => 0));
        } else {
            foreach ($price_ladder as $key => $amount_price) {
                $price_ladder[$key]['formated_price'] = price_format($amount_price['price'], false);
            }
        }
        $group_buy['price_ladder'] = $price_ladder;

        /* 统计信息 */
        $stat = $this->group_buy_stat($group_buy_id, $group_buy['deposit']);
        $group_buy = array_merge($group_buy, $stat);

        /* 计算当前价 */
        $cur_price = $price_ladder[0]['price']; // 初始化
        $cur_amount = $stat['valid_goods'] + $current_num; // 当前数量
        foreach ($price_ladder as $amount_price) {
            if ($cur_amount >= $amount_price['amount']) {
                $cur_price = $amount_price['price'];
            } else {
                break;
            }
        }
        $group_buy['cur_price'] = $cur_price;
        $group_buy['formated_cur_price'] = price_format($cur_price, false);

        /* 最终价 */
        $group_buy['trans_price'] = $group_buy['cur_price'];
        $group_buy['formated_trans_price'] = $group_buy['formated_cur_price'];
        $group_buy['trans_amount'] = $group_buy['valid_goods'];

        /* 状态 */
        $group_buy['status'] = $this->group_buy_status($group_buy);
        if (L('gbs.' . $group_buy['status']) != '') {
            $group_buy['status_desc'] = L('gbs.' . $group_buy['status']);
        }

        $group_buy['start_time'] = $group_buy['formated_start_date'];
        $group_buy['end_time'] = $group_buy['formated_end_date'];
        $group_buy['act_banner'] = $group_buy['act_banner'];
        $group_buy['click_num'] = $group_buy['click_num'];
        $group_buy['sales_count'] = $group_buy['sales_count'] ? $group_buy['sales_count'] : 0;

        $sql = 'SELECT IFNULL(SUM(g.goods_number), 0) ' .
            'as count FROM ' . $this->model->pre . 'order_info AS o LEFT JOIN ' .
            $this->model->pre . 'order_goods AS g  ON o.order_id = g.order_id ' .
            'LEFT JOIN ' . $this->model->pre . 'goods_activity as ga ON ga.goods_id = g.goods_id ' .
            "WHERE o.extension_code = 'group_buy'  AND g.goods_id = '" . $group_buy['goods_id'] . "'";
        
        $nCount = $this->query($sql);
        $group_buy['sales_count']  = $nCount[0]['count'];
        
        return $group_buy;
    }

    /**
     * 获得团购的状态
     *
     * @access  public
     * @param   array
     * @return  integer
     */
    function group_buy_status($group_buy) {
        $now = gmtime();
        if ($group_buy['is_finished'] == 0) {
            /* 未处理 */
            if ($now < $group_buy['start_time']) {
                $status = GBS_PRE_START;
            } elseif ($now > $group_buy['end_time']) {
                $status = GBS_FINISHED;
            } else {
                if ($group_buy['restrict_amount'] == 0 || $group_buy['valid_goods'] < $group_buy['restrict_amount']) {
                    $status = GBS_UNDER_WAY;
                } else {
                    $status = GBS_FINISHED;
                }
            }
        } elseif ($group_buy['is_finished'] == GBS_SUCCEED) {
            /* 已处理,团购成功 */
            $status = GBS_SUCCEED;
        } elseif ($group_buy['is_finished'] == GBS_FAIL) {
            /* 已处理,团购失败 */
            $status = GBS_FAIL;
        }

        return $status;
    }

    /*
     * 取得某团购活动统计信息
     * @param   int     $group_buy_id   团购活动id
     * @param   float   $deposit        保证金
     * @return  array   统计信息
     *                  total_order     总订单数
     *                  total_goods     总商品数
     *                  valid_order     有效订单数
     *                  valid_goods     有效商品数
     */

    function group_buy_stat($group_buy_id, $deposit) {
        $group_buy_id = intval($group_buy_id);

        /* 取得团购活动商品ID */
        $sql = "SELECT goods_id " .
                "FROM " . $this->pre .
                "goods_activity WHERE act_id = '$group_buy_id' " .
                "AND act_type = '" . GAT_GROUP_BUY . "'";
        $result = $this->row($sql);
        $group_buy_goods_id = $result['goods_id'];

        /* 取得总订单数和总商品数 */
        $sql = "SELECT COUNT(*) AS total_order, SUM(g.goods_number) AS total_goods " .
                "FROM " . $this->pre . "order_info AS o, " .
                $this->pre . "order_goods AS g " .
                " WHERE o.order_id = g.order_id " .
                "AND o.extension_code = 'group_buy' " .
                "AND o.extension_id = '$group_buy_id' " .
                "AND g.goods_id = '$group_buy_goods_id' " .
                "AND (order_status = '" . OS_CONFIRMED . "' OR order_status = '" . OS_UNCONFIRMED . "')";
        $stat = $this->row($sql);
        if ($stat['total_order'] == 0) {
            $stat['total_goods'] = 0;
        }

        /* 取得有效订单数和有效商品数 */
        $deposit = floatval($deposit);
        if ($deposit > 0 && $stat['total_order'] > 0) {
            $sql .= " AND (o.money_paid + o.surplus) >= '$deposit'";
            $row = M()->getRow($sql);
            $stat['valid_order'] = $row['total_order'];
            if ($stat['valid_order'] == 0) {
                $stat['valid_goods'] = 0;
            } else {
                $stat['valid_goods'] = $row['total_goods'];
            }
        } else {
            $stat['valid_order'] = $stat['total_order'];
            $stat['valid_goods'] = $stat['total_goods'];
        }

        return $stat;
    }

}