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;
 | |
|         }
 | |
|     }
 | |
| }
 |