298 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			298 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | namespace app\shop\logic\seckill; | ||
|  | 
 | ||
|  | use app\common\basics\Logic; | ||
|  | use app\common\model\seckill\SeckillGoods; | ||
|  | use app\common\model\seckill\SeckillTime; | ||
|  | use app\common\model\goods\Goods; | ||
|  | use app\common\server\UrlServer; | ||
|  | use think\facade\Db; | ||
|  | 
 | ||
|  | class SeckillGoodsLogic extends Logic | ||
|  | { | ||
|  |     /** | ||
|  |      * 统计 | ||
|  |      */ | ||
|  |     public static function statistics($shop_id) | ||
|  |     { | ||
|  |         // 秒杀中商品
 | ||
|  |         $where = [ | ||
|  |             ['sg.del', '=', 0], | ||
|  |             ['sg.review_status', '=', 1], | ||
|  |             ['shop_id', '=', $shop_id], | ||
|  |         ]; | ||
|  |         $lists = SeckillGoods::alias('sg') | ||
|  |             ->leftJoin('seckill_time st', 'st.id=sg.seckill_id') | ||
|  |             ->field('sg.goods_id,sg.start_date,sg.end_date,st.start_time,st.end_time') | ||
|  |             ->where($where) | ||
|  |             ->group('sg.goods_id,sg.start_date,sg.end_date,st.start_time,st.end_time') | ||
|  |             ->order(['sg.id' => 'desc']) | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  |         $now = time(); | ||
|  |         $now_date = date('Y-m-d', $now); | ||
|  |         $unSeckillCount = 0; | ||
|  |         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($now >= $start_date_time && $now <= $end_date_time) { | ||
|  |                 $start_time = strtotime($now_date. ' '. $item['start_time']); | ||
|  |                 $end_time = strtotime($now_date. ' '. $item['end_time']); | ||
|  |                 if($now >= $start_time && $now <= $end_time) { | ||
|  |                     // 秒杀中的时段,无需处理
 | ||
|  |                 }else{ | ||
|  |                     unset($lists[$key]); // 未在秒杀时段
 | ||
|  |                     ++$unSeckillCount ; | ||
|  |                 } | ||
|  |             }else{ | ||
|  |                 unset($lists[$key]); // 未在秒杀时间日期
 | ||
|  |                 ++$unSeckillCount; | ||
|  |             } | ||
|  |         } | ||
|  |         $seckillCount = count($lists); | ||
|  | 
 | ||
|  |         // 待审核
 | ||
|  |         $waitReview = SeckillGoods::where(['del'=>0, 'review_status'=>0, 'shop_id'=>$shop_id])->group('seckill_id,goods_id,start_date,end_date')->count(); | ||
|  |         // 审核拒绝
 | ||
|  |         $refuseReview = SeckillGoods::where(['del'=>0, 'review_status'=>2, 'shop_id'=>$shop_id])->group('seckill_id,goods_id,start_date,end_date')->count(); | ||
|  | //
 | ||
|  |         return [ | ||
|  |             'unSeckillCount'  => $unSeckillCount, | ||
|  |             'seckillCount'  => $seckillCount, | ||
|  |             'waitReview' => $waitReview, | ||
|  |             'refuseReview' => $refuseReview, | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function getTimeAll(){ | ||
|  |         $time_list =  SeckillTime::where(['del'=>0])->order('start_time asc')->select()->toArray(); | ||
|  |         foreach ($time_list as &$item){ | ||
|  |             $item['time'] = $item['start_time'].' ~ '.$item['end_time']; | ||
|  |         } | ||
|  |         return $time_list; | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function addGoods($post){ | ||
|  |         try{ | ||
|  |             $now = time(); | ||
|  |             $add_data = []; | ||
|  | 
 | ||
|  |             // 开始日期结束日期处理
 | ||
|  |             $start_end = explode('~', $post['start_end']); | ||
|  | 
 | ||
|  |             foreach ($post['item'] as  $item){ | ||
|  |                 $add_data[] =[ | ||
|  |                     'seckill_id'        => $post['seckill_id'], | ||
|  |                     'goods_id'          => $item['goods_id'], | ||
|  |                     'item_id'           => $item['item_id'], | ||
|  |                     'price'             => $item['price'], | ||
|  |                     'create_time'       => $now, | ||
|  |                     'sales_sum'         => 0, | ||
|  |                     'update_time'       => $now, | ||
|  |                     'del'               => 0, | ||
|  |                     'shop_id'           => $post['shop_id'], | ||
|  |                     'start_date'        => trim($start_end[0]), | ||
|  |                     'end_date'          => trim($start_end[1]), | ||
|  |                 ]; | ||
|  |             } | ||
|  |             $seckillGoods = new SeckillGoods(); | ||
|  |             $seckillGoods->saveAll($add_data); | ||
|  |             return true; | ||
|  |         }catch(\Exception $e) { | ||
|  |             self::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function goodsList($get) | ||
|  |     { | ||
|  |         $where = [ | ||
|  |             ['sg.del', '=', 0], | ||
|  |             ['sg.shop_id', '=', $get['shop_id']] | ||
|  |         ]; | ||
|  | 
 | ||
|  |         // 商品名称
 | ||
|  |         if(isset($get['name']) && !($get['name'] == '')) { | ||
|  |             $where[] = ['g.name', 'like', '%'.trim($get['name']).'%']; | ||
|  |         } | ||
|  |         // 参与日期
 | ||
|  |         if(isset($get['start_end']) && !empty($get['start_end'])) { | ||
|  |             $start_end = explode('~', $get['start_end']); | ||
|  |             $where[] = ['sg.start_date', '>=', trim($start_end[0])]; | ||
|  |             $where[] = ['sg.end_date', '<=', trim($start_end[1])]; | ||
|  |         } | ||
|  |         // 参与时段
 | ||
|  |         if(isset($get['seckill_id']) && !empty($get['seckill_id'])) { | ||
|  |             $where[] = ['sg.seckill_id', '=', $get['seckill_id']]; | ||
|  |         } | ||
|  | 
 | ||
|  |         $lists = SeckillGoods::alias('sg') | ||
|  |             ->leftJoin('seckill_time st', 'st.id=sg.seckill_id') | ||
|  |             ->leftJoin('goods g', 'sg.goods_id=g.id') | ||
|  |             ->field('sg.seckill_id,sg.goods_id,review_status,review_desc,start_date,end_date,start_time,end_time,g.name,g.image,g.min_price,g.max_price') | ||
|  |             ->where($where) | ||
|  |             ->group('sg.seckill_id,sg.goods_id,review_status,review_desc,start_date,end_date,start_time,end_time,g.name,g.image,g.min_price,g.max_price') | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  |         // 按类型提取数据
 | ||
|  |         $unSeckill = []; | ||
|  |         $seckill = []; | ||
|  |         $waitReview = []; | ||
|  |         $refuseReview = []; | ||
|  |         $now = time(); | ||
|  |         $now_date = date('Y-m-d', $now); | ||
|  |         foreach($lists as $key => $item) { | ||
|  |             if($item['review_status'] == 0) { // 待审核
 | ||
|  |                 $waitReview[] = $item; | ||
|  |                 continue; | ||
|  |             }else if($item['review_status'] == 2){ // 审核拒绝
 | ||
|  |                 $refuseReview[] = $item; | ||
|  |                 continue; | ||
|  |             }else if($item['review_status'] == 1) { // 审核通过
 | ||
|  |                 $start_date_time = strtotime($item['start_date']. ' 00:00:00'); | ||
|  |                 $end_date_time = strtotime($item['end_date']. ' 23:59:59'); | ||
|  |                 // 日期校验
 | ||
|  |                 if($now >= $start_date_time && $now <= $end_date_time) { | ||
|  |                     $start_time = strtotime($now_date. ' '. $item['start_time']); | ||
|  |                     $end_time = strtotime($now_date. ' '. $item['end_time']); | ||
|  |                     if($now >= $start_time && $now <= $end_time) { | ||
|  |                         $seckill[] = $item; | ||
|  |                         continue; | ||
|  |                     }else{ | ||
|  |                         // 未在秒杀时段
 | ||
|  |                         $unSeckill[] = $item; | ||
|  |                         continue; | ||
|  |                     } | ||
|  |                 }else{ | ||
|  |                     // 未在秒杀时间日期
 | ||
|  |                     $unSeckill[] = $item; | ||
|  |                     continue; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         switch($get['type']) { | ||
|  |             case 'seckill': | ||
|  |                 $lists = $seckill; | ||
|  |                 break; | ||
|  |             case 'un_seckill': | ||
|  |                 $lists = $unSeckill; | ||
|  |                 break; | ||
|  |             case 'wait_review': | ||
|  |                 $lists = $waitReview; | ||
|  |                 break; | ||
|  |             case 'refuse_review': | ||
|  |                 $lists = $refuseReview; | ||
|  |                 break; | ||
|  |         } | ||
|  |         // 组装信息
 | ||
|  |         $review_status_desc = ['待审核','审核通过','审核拒绝']; | ||
|  |         foreach($lists as &$item) { | ||
|  |             // 秒杀价格
 | ||
|  |             $price = SeckillGoods::where([ | ||
|  |                 'del' => 0, | ||
|  |                 'shop_id' => $get['shop_id'], | ||
|  |                 'seckill_id' => $item['seckill_id'], | ||
|  |                 'goods_id' => $item['goods_id'], | ||
|  |                 'start_date' => $item['start_date'], | ||
|  |                 'end_date' => $item['end_date'], | ||
|  |             ])->column('price', 'id'); | ||
|  |             $seckill_min_price = min($price); | ||
|  |             $seckill_max_price = max($price); | ||
|  |             $item['seckill_price'] = $seckill_min_price == $seckill_max_price ? '¥ ' .$seckill_min_price : '¥ '. $seckill_min_price . ' ~ ¥ ' . $seckill_max_price; | ||
|  |             // 商品价格
 | ||
|  |             $item['goods_price'] = $item['min_price'] == $item['max_price'] ? '¥ ' .$item['min_price'] : '¥ '. $item['min_price'] .' ~ ¥ '. $item['max_price']; | ||
|  |             // 参与日期
 | ||
|  |             $item['date'] = $item['start_date'] . ' ~ ' . $item['end_date']; | ||
|  |             // 参与时段
 | ||
|  |             $item['time'] = $item['start_time'] . ' ~ ' . $item['end_time']; | ||
|  |             // 审核状态
 | ||
|  |             $item['review_status_desc'] = $review_status_desc[$item['review_status']]; | ||
|  |         } | ||
|  | 
 | ||
|  |         // 分页
 | ||
|  |         $count = count($lists); | ||
|  |         $index = ($get['page'] -1) * $get['limit']; | ||
|  |         $lists = array_slice($lists, $index, $get['limit']); | ||
|  | 
 | ||
|  |         // 返回
 | ||
|  |         return [ | ||
|  |             'count' => $count, | ||
|  |             'lists' => $lists, | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function getSeckillGoods($id,$seckill_id, $start_date, $end_date){ | ||
|  |         $skill_goods = SeckillGoods::alias('sg') | ||
|  |             ->join('goods_item gi','sg.item_id = gi.id') | ||
|  |             ->where(['del'=>0,'sg.goods_id'=>$id,'sg.seckill_id'=>$seckill_id, 'sg.start_date'=>$start_date,'sg.end_date'=>$end_date]) | ||
|  |             ->field('sg.*,gi.image,gi.spec_value_str,gi.price as goods_price') | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  | 
 | ||
|  |         $goods_id = $skill_goods[0]['goods_id']; | ||
|  |         $goods = Goods::where(['del'=>0,'id'=>$goods_id])->field('image,name')->find(); | ||
|  | 
 | ||
|  |         foreach ($skill_goods as &$item){ | ||
|  |             $item['name'] = $goods['name']; | ||
|  |             if(!$item['image']){ | ||
|  |                 $item['image'] = $goods['image']; | ||
|  |             } | ||
|  |             $item['date'] = $item['start_date'] . ' ~ ' . $item['end_date']; | ||
|  |         } | ||
|  | 
 | ||
|  |         return $skill_goods; | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function editGoods($post){ | ||
|  |         Db::startTrans(); | ||
|  |         try{ | ||
|  |             // 开始日期结束日期处理
 | ||
|  |             $start_end = explode('~', $post['start_end']); | ||
|  | 
 | ||
|  |             $now = time(); | ||
|  |             foreach ($post['item'] as  $goods){ | ||
|  |                 $review_status = SeckillGoods::where('id', $goods['id'])->value('review_status'); | ||
|  |                 $review_status = $review_status == 2 ? 0 : $review_status; | ||
|  |                 $update_data = [ | ||
|  |                     'start_date'    => trim($start_end[0]), | ||
|  |                     'end_date'      => trim($start_end[1]), | ||
|  |                     'seckill_id'    => $post['seckill_id'], | ||
|  |                     'price'         => $goods['price'], | ||
|  |                     'update_time'   => $now, | ||
|  |                     'review_status' => $review_status, | ||
|  |                 ]; | ||
|  |                 SeckillGoods::where(['id'=>$goods['id']])->update($update_data); | ||
|  |             } | ||
|  |             Db::commit(); | ||
|  |             return true; | ||
|  |         }catch(\Exception $e) { | ||
|  |             self::$error = $e->getMessage(); | ||
|  |             Db::rollback(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function delGoods($id,$seckill_id,$start_date,$end_date,$shop_id){ | ||
|  |         try{ | ||
|  |             $update_data = [ | ||
|  |                 'update_time'   => time(), | ||
|  |                 'del'           => 1, | ||
|  |             ]; | ||
|  |             SeckillGoods::where([ | ||
|  |                 'del'=>0, | ||
|  |                 'goods_id'=>$id, | ||
|  |                 'seckill_id'=>$seckill_id, | ||
|  |                 'shop_id' => $shop_id, | ||
|  |                 'start_date' => $start_date, | ||
|  |                 'end_date' => $end_date, | ||
|  |             ])->update($update_data); | ||
|  |             return true; | ||
|  |         }catch(\Exception $e) { | ||
|  |             self::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | } |