www.gusucode.com > iWebshop开源PHP商城系统 v2.8源码程序 > iwebshop/classes/regiment.php
<?php /** * 与团购相关的操作 * * @author walu * @package iwebshop */ class Regiment { /** * 检测某个团购是否满员 */ public static function isFull($id) { $regiment = self::getRegimentById($id); if($regiment === false) { return false; } else { $re = $regiment['store_nums']!=0 && $regiment['user_num'] >= $regiment['store_nums']; return $re; } } /** * 检测某个会员有没有报过名 * @param int $rid * @param int|string int为user_id,string为hash string */ public static function hasJoined($rid,$user_id) { if(!$user_id) { return false; } $tb = new IModel("regiment_user_relation"); $user_id = htmlspecialchars($user_id,ENT_QUOTES); $rid = intval($rid); if(is_numeric($user_id)) { $user_id = intval($user_id); $re = $tb->query("user_id={$user_id} AND regiment_id = {$rid} "); } else { $re = $tb->query("`hash`='{$user_id}' AND regiment_id = {$rid}"); } if($re) { $re = end($re); $time_limit = self::time_limit(); $join_time = time() - $time_limit*60; $re = $re['is_over'] == 0 && strtotime($re['join_time']) > $join_time; } else { $re = false; } return $re; } /** * 检测某个用户是否买过了 */ public static function hasBought($rid,$user_id) { $tb = new IModel("regiment_user_relation"); $user_id = intval($user_id); $rid = intval($rid); $re =(bool)$tb->query("user_id={$user_id} AND regiment_id = {$rid} AND is_over =1"); return $re; } /** * 获取往期的团购 * * 与LiMenglei确定后:此操作返回的结果为:前三十天内结束的团购,按照购买人数倒序排列 * * @static */ public static function getEverList() { $now = ITime::getNow(); $start_time = date("Y-m-d H:i:s", ITime::getNow() - 60*3600*24*30 ); $now = date("Y-m-d H:i:s",$now); $tb = new IModel("regiment"); $list = $tb->query(" end_time < '{$now}' AND start_time > '{$start_time}' ORDER BY id DESC "); return self::ps($list); } /** * 获取往期的团购,已结束的,按照结束时间倒序排列 * * @param int $page 获取列表中的第几页 * @return array 其中的query索引是本次查询用的query对象,传到view中用来生成分页 * @static */ public static function getEverListByPage($page=1) { $page = intval($page); $now = ITime::getNow(); $start_time = date("Y-m-d H:i:s", ITime::getNow() - 60*3600*24*30 ); $now = date("Y-m-d H:i:s",$now); $query = new IQuery("regiment"); $query->where = " end_time < '{$now}'"; $query->order = " end_time DESC "; $query->page = $page; $list = $query->find(); $list = self::ps($list); if(!$list) { $query = false; } return array('flag'=>true,'list'=>$list,'query'=>$query); } /** * 获取当前时间内生效的团购列表 * * @static */ public static function getList($id=null) { $now = ITime::getDateTime(); $tb = new IModel("regiment"); if($id===null) { $list = $tb->query(" start_time<='{$now}' AND end_time>='{$now}' AND is_close=0 ORDER BY id DESC "); } else { $id = intval($id); $list = $tb->query(" id = {$id} "); } $re = self::ps($list); //剔除满员的 foreach($re as $key=>$value) { /* if( $value['store_nums'] !=0 && $value['user_num']>=$value['store_nums']) { unset($re[$key]); } */ } return array("flag"=>true,'list'=>$re); } public static function getRegimentById($id) { $id = intval($id); $tb = new IModel("regiment"); $re = $tb->query(" id={$id} "); if($re) { $re = self::ps($re); $re = end($re); return $re; } else return false; } /** * 用户报名参加团购 * * 用户可以参加本次团购的条件: * 1.本次团购还没有满员 * 2.一小时二十五分钟内,用户在本次团购中没有未完成的交易 * * regiment_user_relation表中的is_over:0代表着还没有完成,1代表着已经完成交易了 * 如果用户没有登录便参加团购,会生成一个hash存在cookie里,名字为regiment_100,其中100是相应团购的id * 并将此hash保存在regiment_user_relation表的hash字段里。在用户付账需要登录的时候应该查询这个hash并更新相应的user_id * * @static */ public static function join($id,$user_id=null) { $id = intval($id); $now = time(); $regiment = self::getRegimentById($id); $time_limit=self::time_limit(); if($regiment===false || ( 0 !=$regiment['store_nums'] && $regiment['user_num'] >= $regiment['store_nums']) || strtotime($regiment['end_time'])<$now || strtotime($regiment['start_time'])>$now ) return array('flag'=>'msg','data'=>'本次团购已过期或者人满'); $tb = new IModel("regiment_user_relation"); $data = array('user_id'=>"",'hash'=>"",'regiment_id'=>$id,'join_time'=>date("Y-m-d H:i:s",$now),'is_over'=>0); if($user_id!==null) { $user_id = intval($user_id); $re = $tb->query("regiment_id={$id} AND user_id={$user_id} AND is_over=0"); $data['user_id'] = $user_id; } else { $hash = ICookie::get("regiment_{$id}"); if($hash===null) { $hash = IHash::md5(serialize($_SERVER).microtime(1)); ICookie::set("regiment_{$id}",$hash,$time=$time_limit*60); } $re = $tb->query("regiment_id={$id} AND hash='{$hash}' AND is_over=0"); $data['hash'] = $hash; } if($re) $re=end($re); if(count($re)==0 || strtotime( $re['join_time'] ) < ( $now-$time_limit*60 ) ) { $tb->setData($data); //$relation_id是关系表的主键 if($re) { $tb->update("id={$re['id']}"); $relation_id = $re['id']; } else { $relation_id = $tb->add(); } return array('flag'=>true,'data'=>'参与成功','relation_id'=>$relation_id); } else { return array('flag'=>false,'data'=>'本次团购您存在未完成交易'); } } /** * 整理从regiment表里提出的数据 * * 将会对每一行记录加上或整理以下索引的数据 * <ul> * <li>user_num,已报名人数</li> * <li>valid,本次团购是否还接受报名</li> * <li>sell_price,原价,整理成100.21的形式</li> * <li>regiment_price,团购价,整理成100.21的形式</li> * <li>discount,折扣</li> * </ul> * * @param array $list * @return array $list * @static */ public static function ps($list) { $list = Util::array_rekey($list,'id'); if($list) { //获取各个团购的已参与人数 $ids = array_keys($list); $ids = implode(",",$ids); $tb = new IModel("regiment_user_relation"); $time_limit=self::time_limit(); $join_time = ITime::getNow()-60*$time_limit; $join_time = date("Y-m-d H:i:s",$join_time); $user_relation = $tb->query("regiment_id IN ({$ids}) AND join_time>'{$join_time}' GROUP BY regiment_id "," COUNT(*) AS num,regiment_id"); $user_relation = Util::array_rekey($user_relation,"regiment_id"); $now = time(); foreach($list as $key=>$value) { $list[$key]['valid'] = true; $list[$key]['user_num'] = isset($user_relation[$value['id']])?$user_relation[$value['id']]['num']:0; if( 0!=$value['store_nums'] && $list[$key]['user_num'] >= $value['store_nums'] ) { $list[$key]['valid'] = false; } $tmp_time=strtotime($list[$key]['end_time']); if($tmp_time<$now) { $list[$key]['valid']=false; } $list[$key]['sell_price'] = round($value['sell_price'],2);//原价 $list[$key]['regiment_price'] = round($value['regiment_price'],2);//团购价 if($value['regiment_price']===round(0,2)) { $list[$key]['discount'] = 0; } else { if($list[$key]['sell_price']== round(0,2) ) { $list[$key]['discount'] = 0; } else { $list[$key]['discount'] = $list[$key]['regiment_price'] / $list[$key]['sell_price'] *10 ; $list[$key]['discount'] = round( $list[$key]['discount'],1 ); } } } } return $list; } public static function time_limit() { $site_config=new Config("site_config"); $site_config=$site_config->getInfo(); $re=60; if(isset($site_config['regiment_time_limit']) && $site_config['regiment_time_limit']>0 ) { $re=intval($site_config['regiment_time_limit']); } return $re; } } ?>