www.gusucode.com > iWebshop开源PHP商城系统 v2.8源码程序 > iwebshop/classes/prorule.php

    <?php
/**
 * @copyright (c) 2011 jooyea.cn
 * @file ProRule.php
 * @brief 促销规则处理类
 * @author chendeshan
 * @date 2011-03-10
 * @version 0.6
 */

/**
 * @class ProRule
 * @brief 促销活动规则奖励
          奖励方式分为 (1)现金奖励,(2)赠品奖励。
          (1)现金奖励就是直接减少订单总额中的金钱数
          (2)赠品奖励就是订单支持成功后,系统自动发送的赠品
 */
class ProRule
{
	//商品总金额
	private $sum;

	//用户组
	private $user_group = null;

	//现金促销规则奖励仅一次 true:1次;false:多次不限
	public $isCashOnce = true;

	//赠品促销规则奖励仅一次 true:1次;false:多次不限
	public $isGiftOnce = false;

	//现金促销规则奖励方式 1减金额 2奖励折扣
	private $cash_award_type = array(1,2);

	//赠品促销规则奖励方式 3赠送积分 4赠送代金券 5赠送赠品 6免运费 7赠送经验值
	private $gift_award_type = array(3,4,5,6,7);

	/**
	 * @brief 构造函数 初始化商品金额
	 * @param float $sum 商品金额
	 */
	public function __construct($sum)
	{
		//商品金额必须为数字
		if(!is_numeric($sum))
		{
			IError::show(403,array('message'=>'order sum must a num'));
		}
		$this->sum = $sum;
	}

	/**
	 * @brief 设置用户组
	 * @param string 用户组
	 */
	public function setUserGroup($groupId)
	{
		$this->user_group = $groupId;
	}

	/**
	 * @brief 获取现金促销规则优惠后的金额
	 * @return float 优惠后金额
	 */
	public function getSum()
	{
		//获取现金奖励信息
		$cashInfo = $this->getAwardInfo($this->cash_award_type,$this->isCashOnce);

		if(!empty($cashInfo))
		{
			//执行现金奖励运算
			return $this->cashAction($cashInfo);
		}
		else
		{
			return $this->sum;
		}
	}

	/**
	 * @brief 进行赠品促销规则的奖励
	 * @param int $user_id 用户的ID值
	 */
	public function setAward($user_id)
	{
		//获取赠品奖励信息
		$giftInfo = $this->getAwardInfo($this->gift_award_type,$this->isGiftOnce);
		return $this->giftAction($giftInfo,$user_id);
	}

	/**
	 * @brief 获取促销规则的数据
	 * @return array plan:活动方案名称; info:具体促销信息;
	 */
	public function getInfo()
	{
		$explain  = array();

		$giftInfo = $this->getAwardInfo($this->gift_award_type,$this->isGiftOnce);
		$cashInfo = $this->getAwardInfo($this->cash_award_type,$this->isCashOnce);

		$allInfo  = array_merge($cashInfo,$giftInfo);
		foreach($allInfo as $key => $val)
		{
			$explain[$key]['plan'] = $val['name'];
			$explain[$key]['info'] = $this->typeExplain($val['award_type'],$val['condition'],$val['award_value']);
		}
		return $explain;
	}

	/**
	 * @brief 奖励类型解释
	 * @param int 类型id值
	 * @param string 满足条件
	 * @param string 奖励数据
	 * @return string 类型说明
	 */
	private function typeExplain($awardType,$condition,$awardValue)
	{
		switch($awardType)
		{
			case "1":
			{
				return '购物满¥'.$condition.' 优惠¥'.$awardValue;
			}
			break;

			case "2":
			{
				return '购物满¥'.$condition.' 优惠'.$awardValue.'%';
			}
			break;

			case "3":
			{
				return '购物满¥'.$condition.' 增加'.$awardValue.'积分';
			}
			break;

			case "4":
			{
				$ticketObj = new IModel('ticket');
				$where     = 'id = '.$awardValue;
				$ticketRow = $ticketObj->getObj($where);
				return '购物满¥'.$condition.' 立得¥'.$ticketRow['value'].'代金券';
			}
			break;

			case "5":
			{
				return '购物满¥'.$condition.' 送赠品';
			}
			break;

			case "6":
			{
				return '购物满¥'.$condition.' 免运费';
			}
			break;

			case "7":
			{
				return '购物满¥'.$condition.' 立加'.$awardValue.'经验';
			}
			break;

			default:
			{
				return null;
			}
			break;
		}
	}

	/**
	 * @brief 是否减免订单的运费
	 * @return bool true:减免; false:不减免
	 */
	public function isFreeFreight()
	{
		$proList = $this->satisfyPromotion(6);
		if(!empty($proList))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * @brief 根据商品金额获取所满足的$award_type类别促销规则信息
	 * @param int $award_type 奖励类别 1减金额 2奖励折扣 3赠送积分 4赠送代金券 5赠送赠品 6免运费 7赠送经验
	 * @return array 促销规则信息
	 */
	private function satisfyPromotion($award_type = null)
	{
		$datetime = ITime::getDateTime();
		$proObj   = new IModel('promotion');
		$where    = '`condition` between 0 and '.$this->sum.' and type = 0 and is_close = 0 and start_time <= "'.$datetime.'" and end_time >= "'.$datetime.'"';

		//奖励类别分析
		if($award_type != null)
		{
			$where.=' and award_type in ('.$award_type.')';
		}

		//用户组
		if($this->user_group != null)
		{
			$where.=' and (user_group = "all" or FIND_IN_SET('.$this->user_group.',user_group))';
		}
		else
		{
			$where.=' and user_group = "all" ';
		}
		$proList = $proObj->query($where,'*','`condition`');
		return $proList;
	}

	/**
	 * @brief 现金促销规则奖励操作
	 * @param array 现金促销规则奖励信息
	 * @return float 处理后金额
	 */
	private function cashAction($cashArray)
	{
		$sum = $this->sum;
		foreach($cashArray as $val)
		{
			$award_type  = $val['award_type'];
			$award_value = $val['award_value'];

			switch($award_type)
			{
				//减少总额数
				case "1":
				{
					$sum = $sum - $award_value;
				}
				break;

				//减少百分比
				case "2":
				{
					$sum = $sum - ($sum * ($award_value/100));
				}
				break;
			}
		}
		return $sum;
	}

	/**
	 * @brief 赠品促销规则奖励操作
	 * @param array 赠品促销规则奖励信息
	 */
	private function giftAction($giftArray,$user_id)
	{
		foreach($giftArray as $key => $val)
		{
			$award_type  = $val['award_type'];
			$award_value = $val['award_value'];
			switch($award_type)
			{
				//积分
				case "3":
				{
					$pointConfig = array(
						'user_id' => $user_id,
						'point'   => $award_value,
						'log'     => '促销奖励,消费满'.$this->sum.'元,奖励'.$award_value.'积分',
					);
					$pointObj = new Point;
					$pointObj->update($pointConfig);
				}
				break;

				//代金券
				case "4":
				{
					/*(1)修改prop表*/
					$ticketObj = new IModel('ticket');
					$where     = 'id = '.$award_value;
					$ticketRow = $ticketObj->getObj($where);

					//奖励的红包没有过期
					$time = ITime::getDateTime();
					if(($time > $ticketRow['start_time']) && ($time < $ticketRow['end_time']))
					{
						$dataArray = array(
							'condition' => $award_value,
							'name'      => $ticketRow['name'],
							'card_name' => 'T'.IHash::random(8),
							'card_pwd'  => IHash::random(8),
							'value'     => $ticketRow['value'],
							'start_time'=> $ticketRow['start_time'],
							'end_time'  => $ticketRow['end_time'],
							'is_send'   => 1,
						);
						$propObj = new IModel('prop');
						$propObj->setData($dataArray);
						$insert_id = $propObj->add();

						/*(2)修改member表*/
						$memberObj = new IModel('member');

						//用户prop字段值null时
						$memberArray = array('prop' => ','.$insert_id.',');
						$memberObj->setData($memberArray);
						$result      = $memberObj->update('user_id = '.$user_id.' and ( prop is NULL or prop = "" )');

						//用户prop字段值非null时
						if(!$result)
						{
							$memberArray = array(
								'prop' => 'concat(prop,"'.$insert_id.',")',
							);
							$memberObj->setData($memberArray);
							$memberObj->update('user_id = '.$user_id,'prop');
						}
					}
				}
				break;

				//赠送经验
				case "5":
				{
					$memberObj   = new IModel('member');
					$memberArray = array(
						'exp' => 'exp' + $award_value,
					);
					$memberObj->setData($memberArray);
					$memberObj->update('user_id = '.$user_id,'exp');
				}
				break;
			}
		}
	}

	/**
	 * @brief 获取奖励信息
	 * @param array $award_type 奖励类型数组值
	 * @param bool  $is_once    奖励方案是否允许叠加
	 * @return array            奖励信息
	 */
	private function getAwardInfo($award_type,$is_once)
	{
		$awardInfo = array();

		//获取所有现金促销规则奖励信息
		$award_type_str = join(',',$award_type);
		$allAwardInfo   = $this->satisfyPromotion($award_type_str);

		//当现金奖励仅为一次时,奖励优惠最大化
		if(!empty($allAwardInfo))
		{
			if($is_once == true)
			{
				$awardInfo[0] = current($allAwardInfo);
			}
			else
			{
				$awardInfo = $allAwardInfo;
			}
		}
		return $awardInfo;
	}
}