208 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			208 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | namespace app\api\logic; | ||
|  | 
 | ||
|  | use app\common\basics\Logic; | ||
|  | use app\common\model\Client_; | ||
|  | use app\common\model\seckill\SeckillGoods; | ||
|  | use app\common\model\seckill\SeckillTime; | ||
|  | use app\common\server\UrlServer; | ||
|  | use app\common\model\goods\Goods; | ||
|  | use app\common\enum\GoodsEnum; | ||
|  | 
 | ||
|  | class SeckillGoodsLogic extends Logic | ||
|  | { | ||
|  |     public static function seckillTime(){ | ||
|  |         $time_list = SeckillTime::where(['del'=>0]) | ||
|  |             ->order('start_time asc') | ||
|  |             ->field('id,start_time,end_time') | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  |         $now = time(); | ||
|  |         $today_date = date('Y-m-d'); | ||
|  |         foreach ($time_list as &$item){ | ||
|  |             $item['status'] = 2; | ||
|  |             $item['tips'] = ''; | ||
|  |             $start_time = strtotime($today_date.' '.$item['start_time']); | ||
|  |             $end_time = strtotime($today_date.' '.$item['end_time']); | ||
|  |             if($now >= $end_time ){ | ||
|  |                 $item['tips'] = '已结束'; | ||
|  |             } | ||
|  |             if($start_time <= $now && $now < $end_time){ | ||
|  |                 $item['status'] = 1; | ||
|  |                 $item['tips'] = '抢购中'; | ||
|  |             } | ||
|  |             if($start_time >= $now){ | ||
|  |                 $item['tips'] = '未开始'; | ||
|  |                 $item['status'] = 0; | ||
|  |             } | ||
|  |             $item['end_time_int'] = strtotime($item['end_time']); | ||
|  |         } | ||
|  |         return $time_list; | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function getSeckillGoods($get) | ||
|  |     { | ||
|  |         $where = [ | ||
|  |             ['sg.del', '=', 0], | ||
|  |             ['sg.seckill_id', '=', $get['seckill_id']], | ||
|  |             ['sg.review_status', '=', 1], | ||
|  |         ]; | ||
|  |         $field = 'sg.seckill_id,sg.start_date,sg.end_date,g.id as goods_id,g.name as goods_name,g.image as goods_image,g.min_price as goods_min_price'; | ||
|  |         $lists = SeckillGoods::alias('sg') | ||
|  |             ->leftJoin('seckill_time st', 'st.id=sg.seckill_id') | ||
|  |             ->leftJoin('goods g', 'g.id=sg.goods_id') | ||
|  |             ->group('sg.seckill_id,sg.start_date,sg.end_date,g.id') | ||
|  |             ->field($field) | ||
|  |             ->where($where) | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  | 
 | ||
|  |         // 过滤日期
 | ||
|  |         foreach($lists as $key => &$item) { | ||
|  |             $start_date_time = strtotime($item['start_date'].' 00:00:00'); | ||
|  |             $end_date_time = strtotime($item['end_date'].' 23:59:59'); | ||
|  |             if($start_date_time <= time() && $end_date_time >= time()) { | ||
|  |                 // 在活动日期,判断商品是否在线
 | ||
|  |                 $goods = Goods::where([ | ||
|  |                     'del' => GoodsEnum::DEL_NORMAL, | ||
|  |                     'status' => GoodsEnum::STATUS_SHELVES, | ||
|  |                     'audit_status' => GoodsEnum::AUDIT_STATUS_OK, | ||
|  |                     'id' => $item['goods_id'] | ||
|  |                 ])->findOrEmpty(); | ||
|  |                 if($goods->isEmpty()) { // 商品不存在或未处于销售状态
 | ||
|  |                     unset($lists[$key]); | ||
|  |                 } | ||
|  |             }else{ | ||
|  |                 // 非活动日期,去除记录
 | ||
|  |                 unset($lists[$key]); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         // 分页处理
 | ||
|  |         $count = count($lists); | ||
|  |         $index = ($get['page_no']-1) * $get['page_size']; | ||
|  |         $lists = array_slice($lists, $index, $get['page_size']); | ||
|  | 
 | ||
|  |         // 格式化信息
 | ||
|  |         foreach($lists as &$item) { | ||
|  |             // 图片加域名
 | ||
|  |             $item['goods_image'] = UrlServer::getFileUrl($item['goods_image']); | ||
|  |             // 秒杀价最小值
 | ||
|  |             $seckillGoodsArr = SeckillGoods::where([ | ||
|  |                 'seckill_id'=>$item['seckill_id'], | ||
|  |                 'start_date' => $item['start_date'], | ||
|  |                 'end_date' => $item['end_date'], | ||
|  |                 'goods_id' => $item['goods_id'] | ||
|  |             ])->select()->toArray(); | ||
|  | 
 | ||
|  |             $item['seckill_price'] = $item['goods_min_price']; | ||
|  |             $item['seckill_total'] = 0; | ||
|  |             foreach($seckillGoodsArr as $subItem) { | ||
|  |                 if($item['seckill_price'] > $subItem['price']) { | ||
|  |                     $item['seckill_price'] = $subItem['price']; | ||
|  |                 } | ||
|  |                 $item['seckill_total'] += $subItem['sales_sum']; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return [ | ||
|  |             'count' => $count, | ||
|  |             'lists' => $lists, | ||
|  |             'page_no' => $get['page_no'], | ||
|  |             'page_size' => $get['page_size'], | ||
|  |             'more' => is_more($count, $get['page_no'], $get['page_size']) | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function getSeckillGoodsTwo($seckill_id,$terminal) | ||
|  |     { | ||
|  |         $where = [ | ||
|  |             ['sg.del', '=', 0], | ||
|  |             ['sg.seckill_id', '=', $seckill_id], | ||
|  |             ['sg.review_status', '=', 1], | ||
|  |         ]; | ||
|  |         $field = 'sg.seckill_id,sg.start_date,sg.end_date,g.id as goods_id,g.name as goods_name,g.image as goods_image,g.min_price as goods_min_price'; | ||
|  |         $lists = SeckillGoods::alias('sg') | ||
|  |             ->leftJoin('seckill_time st', 'st.id=sg.seckill_id') | ||
|  |             ->leftJoin('goods g', 'g.id=sg.goods_id') | ||
|  |             ->group('sg.seckill_id,sg.start_date,sg.end_date,g.id') | ||
|  |             ->field($field) | ||
|  |             ->where($where) | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  | 
 | ||
|  |         // 过滤日期
 | ||
|  |         foreach($lists as $key => &$item) { | ||
|  |             $start_date_time = strtotime($item['start_date'].' 00:00:00'); | ||
|  |             $end_date_time = strtotime($item['end_date'].' 23:59:59'); | ||
|  |             if($start_date_time <= time() && $end_date_time >= time()) { | ||
|  |                 // 在活动日期,判断商品是否在线
 | ||
|  |                 $goods = Goods::where([ | ||
|  |                     'del' => GoodsEnum::DEL_NORMAL, | ||
|  |                     'status' => GoodsEnum::STATUS_SHELVES, | ||
|  |                     'audit_status' => GoodsEnum::AUDIT_STATUS_OK, | ||
|  |                     'id' => $item['goods_id'] | ||
|  |                 ])->findOrEmpty(); | ||
|  |                 if($goods->isEmpty()) { // 商品不存在或未处于销售状态
 | ||
|  |                     unset($lists[$key]); | ||
|  |                 } | ||
|  |             }else{ | ||
|  |                 // 非活动日期,去除记录
 | ||
|  |                 unset($lists[$key]); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         if($terminal == 'nmp'){ | ||
|  |             $lists = array_slice($lists, 0, 3); // 取3条记录
 | ||
|  |         }else{ | ||
|  |             $lists = array_slice($lists, 0, 6); // 取3条记录
 | ||
|  |         } | ||
|  | 
 | ||
|  |         // 格式化信息
 | ||
|  |         foreach($lists as &$item) { | ||
|  |             // 图片加域名
 | ||
|  |             $item['goods_image'] = UrlServer::getFileUrl($item['goods_image']); | ||
|  |             // 秒杀价最小值
 | ||
|  |             $seckillGoodsArr = SeckillGoods::where([ | ||
|  |                 'seckill_id'=>$item['seckill_id'], | ||
|  |                 'start_date' => $item['start_date'], | ||
|  |                 'end_date' => $item['end_date'], | ||
|  |                 'goods_id' => $item['goods_id'] | ||
|  |             ])->select()->toArray(); | ||
|  | 
 | ||
|  |             $item['seckill_price'] = $item['goods_min_price']; | ||
|  |             $item['seckill_total'] = 0; | ||
|  |             foreach($seckillGoodsArr as $subItem) { | ||
|  |                 if($item['seckill_price'] > $subItem['price']) { | ||
|  |                     $item['seckill_price'] = $subItem['price']; | ||
|  |                 } | ||
|  |                 $item['seckill_total'] += $subItem['sales_sum']; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return $lists; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 获取正在秒杀时段id | ||
|  |      */ | ||
|  |     public static function getSeckillTimeIng() | ||
|  |     { | ||
|  |         $time_list = SeckillTime::where(['del'=>0]) | ||
|  |             ->order('start_time asc') | ||
|  |             ->field('id,start_time,end_time') | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  |         $now = time(); | ||
|  |         $today_date = date('Y-m-d'); | ||
|  |         foreach ($time_list as &$item){ | ||
|  |             $start_time = strtotime($today_date.' '.$item['start_time']); | ||
|  |             $end_time = strtotime($today_date.' '.$item['end_time']); | ||
|  |             if($start_time <= $now && $now < $end_time){ | ||
|  |                return $item; | ||
|  |             } | ||
|  |         } | ||
|  |         return false; | ||
|  |     } | ||
|  | } |