676 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			676 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | namespace  app\api\logic; | ||
|  | 
 | ||
|  | use app\common\basics\Logic; | ||
|  | use app\common\enum\FootprintEnum; | ||
|  | use app\common\model\coupon\Coupon; | ||
|  | use app\common\model\coupon\CouponGoods; | ||
|  | use app\common\model\coupon\CouponList; | ||
|  | use app\common\model\goods\Goods; | ||
|  | use app\common\model\Cart; | ||
|  | use app\common\model\goods\GoodsItem; | ||
|  | 
 | ||
|  | class CouponLogic extends Logic | ||
|  | { | ||
|  |     public static function getCouponList($get) | ||
|  |     { | ||
|  |         // 未删除 & 上架中 & 发放时间内
 | ||
|  |         $where = [ | ||
|  |             ['del', '=', 0], | ||
|  |             ['status', '=', 1], | ||
|  |             ['send_time_start', '<=', time()], | ||
|  |             ['send_time_end', '>=', time()], | ||
|  |             ['get_type', '=', 1], // 直接领取
 | ||
|  |         ]; | ||
|  | 
 | ||
|  |         if(isset($get['goods_id'])) { | ||
|  |             $shop_id = Goods::where('id', $get['goods_id'])->value('shop_id'); | ||
|  |             $where[] = ['shop_id', '=', $shop_id]; | ||
|  |         } | ||
|  | 
 | ||
|  |         if(isset($get['shop_id'])) { | ||
|  |          $where[] = ['shop_id', '=', $get['shop_id']]; | ||
|  |         } | ||
|  | 
 | ||
|  |         // 券类型 type all-全部(默认) shop-店铺券 platform-平台通用券
 | ||
|  |         if(isset($get['type']) && !empty($get['type'])) { | ||
|  |             switch ($get['type']) { | ||
|  |                 case 'shop': | ||
|  |                     $where[] = ['shop_id', '<>', 0]; | ||
|  |                     break; | ||
|  |                 case 'platform': | ||
|  |                     $where[] = ['shop_id', '=', 0]; // 0 代表平台券
 | ||
|  |                     break; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         $lists = Coupon::field(true) | ||
|  |             ->with('shop') | ||
|  |             ->where($where) | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  | 
 | ||
|  |         // 过滤没有库存的优惠券
 | ||
|  |         foreach($lists as $key => &$item) { | ||
|  |             if($item['send_total_type'] == 2) { // 限制张数
 | ||
|  |                 // 已发放数量
 | ||
|  |                 $already_issue = CouponList::where(['del'=>0, 'coupon_id'=>$item['id']])->count(); | ||
|  |                 if($already_issue >= $item['send_total']) { | ||
|  |                     // 已发完,前端不展示
 | ||
|  |                     unset($lists[$key]); | ||
|  |                     // 下一轮循环
 | ||
|  |                     continue; | ||
|  |                 } | ||
|  |             } | ||
|  |             // === 拼装信息
 | ||
|  |             // 小数点去0
 | ||
|  |             $item['money'] = clearZero($item['money']); | ||
|  |             $item['condition_money'] = clearZero($item['condition_money']); | ||
|  |             // 优惠券名称
 | ||
|  |             $item['coupon_name'] = $item['shop']['name'].$item['name']; | ||
|  |             // 使用门槛
 | ||
|  |             switch($item['condition_type']) { | ||
|  |                 case 1: | ||
|  |                     $item['condition_type_desc'] = '无门槛'; | ||
|  |                     break; | ||
|  |                 case 2: | ||
|  |                     $item['condition_type_desc'] = "满{$item['condition_money']}减{$item['money']}"; | ||
|  |                     break; | ||
|  |             } | ||
|  |             // 用券时间
 | ||
|  |             switch($item['use_time_type']) { | ||
|  |                 case 1: | ||
|  |                     $item['user_time_desc'] = date('Y-m-d H:i:s',$item['use_time_start']). ' 至 ' . date('Y-m-d H:i:s', $item['use_time_end']); | ||
|  |                     break; | ||
|  |                 case 2: | ||
|  |                     $item['user_time_desc'] = "领取当天{$item['use_time']}天内可用"; | ||
|  |                     break; | ||
|  |                 case 3: | ||
|  |                     $item['user_time_desc'] = "领取次日{$item['use_time']}天内可用"; | ||
|  |                     break; | ||
|  |             } | ||
|  |             // 使用场景
 | ||
|  |             switch($item['use_goods_type']) { | ||
|  |                 case 1: | ||
|  |                     $item['use_scene_desc'] = $item['shop']['name'].'全店通用'; | ||
|  |                     break; | ||
|  |                 case 2: | ||
|  |                     $item['use_scene_desc'] = $item['shop']['name'].'部分商品可用'; | ||
|  |                     if(isset($get['goods_id'])) { | ||
|  |                         $goodsArr = CouponGoods::where(['coupon_id'=>$item['id'], 'goods_id'=>$get['goods_id']])->select()->toArray(); | ||
|  |                         if(!$goodsArr) { | ||
|  |                             // 该券不适用此商品
 | ||
|  |                             unset($lists[$key]); | ||
|  |                         } | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 3: | ||
|  |                     $item['use_scene_desc'] = $item['shop']['name'].'部分商品不可用'; | ||
|  |                     if(isset($get['goods_id'])) { | ||
|  |                         $goodsArr = CouponGoods::where(['coupon_id'=>$item['id'], 'goods_id'=>$get['goods_id']])->select()->toArray(); | ||
|  |                         if($goodsArr) { | ||
|  |                             // 该券不适用此商品
 | ||
|  |                             unset($lists[$key]); | ||
|  |                         } | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  |             // 判断该券用户是否已领取过
 | ||
|  |             $count = CouponList::where([ | ||
|  |                 'del' => 0, | ||
|  |                 'user_id' => $get['user_id'], | ||
|  |                 'coupon_id' => $item['id'] | ||
|  |             ])->count(); | ||
|  |             $item['is_get'] = $count ? 1: 0; | ||
|  |         } | ||
|  | 
 | ||
|  |         // 分页处理
 | ||
|  |         $count = count($lists); | ||
|  |         $index = ($get['page_no'] -1) * $get['page_size']; | ||
|  |         $lists = array_slice($lists, $index, $get['page_size']); | ||
|  | 
 | ||
|  |         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 getCoupon($post) | ||
|  |     { | ||
|  |         try{ | ||
|  |             // 未删除 & 上架中 & 发放时间内
 | ||
|  |             $where = [ | ||
|  |                 ['del', '=', 0], | ||
|  |                 ['status', '=', 1], | ||
|  |                 ['send_time_start', '<=', time()], | ||
|  |                 ['send_time_end', '>=', time()], | ||
|  |                 ['id', '=', $post['coupon_id']], | ||
|  |             ]; | ||
|  |             // 校验优惠券信息
 | ||
|  |             $coupon = Coupon::where($where)->findOrEmpty(); | ||
|  |             if($coupon->isEmpty()) { | ||
|  |                 throw new \think\Exception('优惠券已失效'); | ||
|  |             } | ||
|  |             // 校验限制数量
 | ||
|  |             if($coupon['send_total_type'] == 2) { | ||
|  |                 // 已发放数量
 | ||
|  |                 $already_issue = CouponList::where(['del'=>0, 'coupon_id'=>$coupon['id']])->count(); | ||
|  |                 if($already_issue >= $coupon['send_total']) { | ||
|  |                     throw new \think\Exception('优惠券已领取完了'); | ||
|  |                 } | ||
|  |             } | ||
|  |             // 校验领取次数限制
 | ||
|  |             switch($coupon['get_num_type']) { | ||
|  |                 case 2: // 限制总领取次数
 | ||
|  |                     // 当前用户已领取次数
 | ||
|  |                     $already_get = CouponList::where(['del'=>0, 'coupon_id'=>$coupon['id'], 'user_id'=>$post['user_id']])->count(); | ||
|  |                     if($already_get >= $coupon['get_num']) { | ||
|  |                         throw new \think\Exception('您已超过领取次数'); | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 3: // 限制每天领取次数
 | ||
|  |                     $today_date = date('Y-m-d', time()); | ||
|  |                     $today_time = strtotime($today_date.' 00:00:00'); | ||
|  |                     // 当前用户今天已领取次数
 | ||
|  |                     $already_today_get = CouponList::where([ | ||
|  |                         ['del', '=', 0], | ||
|  |                         ['coupon_id', '=', $coupon['id']], | ||
|  |                         ['user_id', '=', $post['user_id']], | ||
|  |                         ['create_time', '>=', $today_time], | ||
|  |                     ])->count(); | ||
|  |                     if($already_today_get >= $coupon['get_num']) { | ||
|  |                         throw new \think\Exception('今天您已超过领取次数'); | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  |             // 开始领券
 | ||
|  |             $time = time(); | ||
|  |             $addData = [ | ||
|  |                 'user_id' => $post['user_id'], | ||
|  |                 'coupon_id' => $post['coupon_id'], | ||
|  |                 'coupon_code' => create_coupon_code(), | ||
|  |                 'status' => 0, | ||
|  |                 'create_time' => $time, | ||
|  |                 'update_time' => $time, | ||
|  |                 'del' => 0 | ||
|  |             ]; | ||
|  |             CouponList::create($addData); | ||
|  | 
 | ||
|  |             // 记录访问足迹
 | ||
|  |             event('Footprint', [ | ||
|  |                 'type'    => FootprintEnum::RECEIVE_COUPON, | ||
|  |                 'user_id' => $post['user_id'], | ||
|  |                 'foreign_id' => $post['coupon_id'] | ||
|  |             ]); | ||
|  | 
 | ||
|  |             return true; | ||
|  |         }catch(\Exception $e){ | ||
|  |             self::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public static function myCouponList($get) | ||
|  |     { | ||
|  |         // 提取用户未删除的优惠券
 | ||
|  |         $whereOne = [ | ||
|  |             ['cl.del', '=', 0], | ||
|  |             ['cl.user_id', '=', $get['user_id']] | ||
|  |         ]; | ||
|  |         $fieldOne = 'cl.*, c.name,c.use_time_type,c.use_time_start,c.use_time_end,c.use_time as coupon_use_time,s.name as shop_name,c.condition_type,c.condition_money,c.money,c.use_goods_type'; | ||
|  |         $count_list = CouponList::alias('cl') | ||
|  |             ->leftJoin('coupon c', 'c.id=cl.coupon_id') | ||
|  |             ->leftJoin('shop s', 's.id=c.shop_id') | ||
|  |             ->field($fieldOne) | ||
|  |             ->where($whereOne) | ||
|  |             ->order('id', 'desc') | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  |         // 循环标识每条记录的券是否过期
 | ||
|  |         foreach($count_list as &$item) { | ||
|  |             $item['is_expired'] = 0; // 默认先标识为未过期
 | ||
|  |             switch($item['use_time_type']) { | ||
|  |                 case 1: // 固定时间
 | ||
|  |                     if($item['use_time_end'] <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 2:  // 领券当天起
 | ||
|  |                     $days = '+'.$item['coupon_use_time'].' day'; | ||
|  |                     $expired_time = strtotime($days, $item['create_time']); | ||
|  |                     if($expired_time <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 3: // 领券次日起
 | ||
|  |                     $days = '+'.($item['coupon_use_time']+1).' day'; | ||
|  |                     $expired_time = strtotime($days, $item['create_time']); | ||
|  |                     if($expired_time <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         $used_array = array_filter($count_list, function($item) { | ||
|  |             return $item['status'] == 1; // 已使用
 | ||
|  |         }); | ||
|  |         $valid_array = array_filter($count_list, function($item) { | ||
|  |             return $item['status'] == 0 && $item['is_expired'] == 0; // 未使用,未过期
 | ||
|  |         }); | ||
|  |         $expired_array = array_filter($count_list, function($item) { | ||
|  |             return $item['status'] == 0 && $item['is_expired'] == 1; // 未使用,已过期
 | ||
|  |         }); | ||
|  |         $used = count($used_array); // 已使用数量
 | ||
|  |         $valid = count($valid_array); // 可用数量
 | ||
|  |         $expired = count($expired_array); //已过期数量
 | ||
|  | 
 | ||
|  |         // 根据类型过滤记录提取 type: used-已使用 valid-可使用 expired-已过期
 | ||
|  |         if(isset($get['type'])) { | ||
|  |             switch($get['type']) { | ||
|  |                 case 'used': | ||
|  |                     $count_list = array_filter($count_list, function($item) { | ||
|  |                         return $item['status'] == 1; // 已使用
 | ||
|  |                     }); | ||
|  |                     break; | ||
|  |                 case 'valid': | ||
|  |                     $count_list = array_filter($count_list, function($item) { | ||
|  |                         return $item['status'] == 0 && $item['is_expired'] == 0; // 未使用,未过期
 | ||
|  |                     }); | ||
|  |                     break; | ||
|  |                 case 'expired': | ||
|  |                     $count_list = array_filter($count_list, function($item) { | ||
|  |                         return $item['status'] == 0 && $item['is_expired'] == 1; // 未使用,已过期
 | ||
|  |                     }); | ||
|  |                     break; | ||
|  |             } | ||
|  |         }else{ // 默认 valid 可使用的
 | ||
|  |             $count_list = array_filter($count_list, function($item) { | ||
|  |                 return $item['status'] == 0 && $item['is_expired'] == 0; // 未使用,未过期
 | ||
|  |             }); | ||
|  |         } | ||
|  |         // 拼装信息
 | ||
|  |         $count_list = self::formatInfo($count_list); | ||
|  | 
 | ||
|  |         // 分页处理
 | ||
|  |         $count = count($count_list); | ||
|  |         $index = ($get['page_no'] -1) * $get['page_size']; | ||
|  |         $lists = array_slice($count_list, $index, $get['page_size']); | ||
|  |         $expand = [ | ||
|  |             'used' => $used, //已使用
 | ||
|  |             'valid' => $valid, //可用
 | ||
|  |             'expired' => $expired //已过期
 | ||
|  |         ]; | ||
|  |         // 返回数据
 | ||
|  |         return [ | ||
|  |             'count' => $count, | ||
|  |             'expand' => $expand, | ||
|  |             '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 formatInfo($coupon_list) | ||
|  |     { | ||
|  |         foreach($coupon_list as  &$item) { | ||
|  |             // 去除无效的0
 | ||
|  |             $item['money'] = clearZero($item['money']); | ||
|  |             $item['condition_money'] = clearZero($item['condition_money']); | ||
|  |             // 优惠券名称
 | ||
|  |             $item['coupon_name'] = $item['shop_name'].$item['name']; | ||
|  |             // 使用门槛
 | ||
|  |             switch($item['condition_type']) { | ||
|  |                 case 1: | ||
|  |                     $item['condition_type_desc'] = '无门槛'; | ||
|  |                     break; | ||
|  |                 case 2: | ||
|  |                     $item['condition_type_desc'] = "满{$item['condition_money']}减{$item['money']}"; | ||
|  |                     break; | ||
|  |             } | ||
|  |             // 用券时间
 | ||
|  |             switch($item['use_time_type']) { | ||
|  |                 case 1: | ||
|  |                     $item['user_time_desc'] = date('Y-m-d H:i:s',$item['use_time_start']). ' 至 ' . date('Y-m-d H:i:s', $item['use_time_end']); | ||
|  |                     break; | ||
|  |                 case 2: | ||
|  |                     $item['user_time_desc'] = "领取当天{$item['coupon_use_time']}天内可用"; | ||
|  |                     break; | ||
|  |                 case 3: | ||
|  |                     $item['user_time_desc'] = "领取次日{$item['coupon_use_time']}天内可用"; | ||
|  |                     break; | ||
|  |             } | ||
|  |             // 使用场景
 | ||
|  |             switch($item['use_goods_type']) { | ||
|  |                 case 1: | ||
|  |                     $item['use_scene_desc'] = $item['shop_name'].'全店通用'; | ||
|  |                     $item['use_goods_desc'] = '所有商品可用'; | ||
|  |                     break; | ||
|  |                 case 2: | ||
|  |                     $item['use_scene_desc'] = $item['shop_name'].'部分商品可用'; | ||
|  |                     $goods = CouponGoods::alias('cg') | ||
|  |                         ->field('g.name as goods_name') | ||
|  |                         ->leftJoin('goods g', 'g.id=cg.goods_id') | ||
|  |                         ->where(['coupon_id'=>$item['coupon_id']]) | ||
|  |                         ->select() | ||
|  |                         ->toArray(); | ||
|  |                     $item['use_goods_desc'] = count($goods) ? '仅限 ' : ''; | ||
|  |                     $item['use_goods_desc'] .= implode('、', array_column($goods, 'goods_name')); | ||
|  |                     $item['use_goods_desc'] .= ' 商品可用'; | ||
|  |                     break; | ||
|  |                 case 3: | ||
|  |                     $item['use_scene_desc'] = $item['shop_name'].'部分商品不可用'; | ||
|  |                     $goods = CouponGoods::alias('cg') | ||
|  |                         ->field('g.name as goods_name') | ||
|  |                         ->leftJoin('goods g', 'g.id=cg.goods_id') | ||
|  |                         ->where(['coupon_id'=>$item['coupon_id']]) | ||
|  |                         ->select() | ||
|  |                         ->toArray(); | ||
|  |                     $item['use_goods_desc'] = count($goods) ? '仅限 ' : ''; | ||
|  |                     $item['use_goods_desc'] .= implode('、', array_column($goods, 'goods_name')); | ||
|  |                     $item['use_goods_desc'] .= ' 之外的商品可用'; | ||
|  |                     break; | ||
|  |             } | ||
|  |         } | ||
|  |         return $coupon_list; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 统计订单价格 | ||
|  |      */ | ||
|  |     public static function calcMoney($buy_type, $get) | ||
|  |     { | ||
|  |        if($buy_type == 'buy') { // 立即购买
 | ||
|  |           $price =  GoodsItem::where('id', $get['item_id'])->value('price'); | ||
|  |           return $price * $get['num']; | ||
|  |        } | ||
|  |        if($buy_type == 'cart') { // 购买车
 | ||
|  |            $total = 0; | ||
|  |            $buyGoodsArr = Cart::alias('c') | ||
|  |                ->leftJoin('goods_item gi', 'gi.id=c.item_id') | ||
|  |                ->field('c.item_id,c.goods_num,gi.price') | ||
|  |                ->where([ | ||
|  |                ['id', 'in', $get['param']], | ||
|  |                ['selected', '=', '1'] | ||
|  |            ])->select()->toArray(); | ||
|  |            foreach($buyGoodsArr as $item) { | ||
|  |                 $total += $item['price'] * $item['goods_num']; | ||
|  |            } | ||
|  |            return $total; | ||
|  |        } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 统计订单商品及金额 | ||
|  |      */ | ||
|  |     public static  function getGoodsInfo($goods) | ||
|  |     { | ||
|  |         $buyGoodsArr = []; | ||
|  |         $buyMoney = 0; | ||
|  |         foreach($goods as $item) { | ||
|  |             $buyGoodsArr[] = $item['goods_id']; | ||
|  |             $price = GoodsItem::where('id', $item['item_id'])->value('price'); | ||
|  |             $buyMoney += $item['num'] * $price; | ||
|  |         } | ||
|  |         return [ | ||
|  |             'buyGoodsArr' => $buyGoodsArr, | ||
|  |             'buyMoney' => $buyMoney, | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     public static function getBuyCouponList($post) | ||
|  |     { | ||
|  | //        $post['goods'] = json_decode($post['goods'], true);
 | ||
|  | 
 | ||
|  |         // 提取用户未删除的优惠券
 | ||
|  |         $whereOne = [ | ||
|  |             ['cl.del', '=', 0], | ||
|  |             ['cl.user_id', '=', $post['user_id']], | ||
|  |             ['s.id', '=', $post['shop_id']], | ||
|  |         ]; | ||
|  |         $fieldOne = 'cl.*, c.name,c.use_time_type,c.use_time_start,c.use_time_end,c.use_time as coupon_use_time,s.name as shop_name,c.condition_type,c.condition_money,c.money,c.use_goods_type'; | ||
|  |         $count_list = CouponList::alias('cl') | ||
|  |             ->leftJoin('coupon c', 'c.id=cl.coupon_id') | ||
|  |             ->leftJoin('shop s', 's.id=c.shop_id') | ||
|  |             ->field($fieldOne) | ||
|  |             ->where($whereOne) | ||
|  |             ->order('id', 'desc') | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  |       | ||
|  |         // 循环标识每条记录的券是否过期
 | ||
|  |         $tempData = []; | ||
|  |         foreach($count_list as $item) { | ||
|  |             $item['is_expired'] = 0; // 默认先标识为未过期
 | ||
|  |             switch($item['use_time_type']) { | ||
|  |                 case 1: // 固定时间
 | ||
|  |                     if($item['use_time_end'] <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 2:  // 领券当天起
 | ||
|  |                     $days = '+'.$item['coupon_use_time'].' day'; | ||
|  |                     $expired_time = strtotime($days, $item['create_time']); | ||
|  |                     if($expired_time <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 3: // 领券次日起
 | ||
|  |                     $days = '+'.($item['coupon_use_time']+1).' day'; | ||
|  |                     $expired_time = strtotime($days, $item['create_time']); | ||
|  |                     if($expired_time <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  |             $tempData[] = $item; | ||
|  |         } | ||
|  | 
 | ||
|  |         // 根据类型过滤记录提取
 | ||
|  |         $count_list = array_filter($tempData, function($item) { | ||
|  |             return $item['status'] == 0 && $item['is_expired'] == 0; // 未使用,未过期
 | ||
|  |         }); | ||
|  | 
 | ||
|  |         // 结算页优惠券列表
 | ||
|  |         $goodsInfo = self::getGoodsInfo($post['goods']); | ||
|  |         $buyGoodsArr = $goodsInfo['buyGoodsArr']; | ||
|  |         $buyMoney = $goodsInfo['buyMoney']; | ||
|  | 
 | ||
|  |         $suit = []; // 适用券
 | ||
|  |         $unSuit = []; // 不适用券
 | ||
|  |         foreach($count_list as $key => $item) { | ||
|  |             $flag = true; // 默认先标识为适用
 | ||
|  |             // 使用场景校验
 | ||
|  |             switch($item['use_goods_type']) { | ||
|  |                 case 2: // 部分商品可用
 | ||
|  |                     $goods = CouponGoods::alias('cg') | ||
|  |                         ->where(['coupon_id'=>$item['coupon_id']]) | ||
|  |                         ->column('cg.goods_id'); | ||
|  |                     foreach($buyGoodsArr as $subItem) { | ||
|  |                         if(!in_array($subItem, $goods)) { // 是否在可用商品列表
 | ||
|  |                             $flag = false; | ||
|  |                             break; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 3: // 部分商品不可用
 | ||
|  |                     $goods = CouponGoods::alias('cg') | ||
|  |                         ->where(['coupon_id'=>$item['coupon_id']]) | ||
|  |                         ->column('cg.goods_id'); | ||
|  |                     foreach($buyGoodsArr as $subItem) { | ||
|  |                         if(in_array($subItem, $goods)) { // 是否在不可用商品列表
 | ||
|  |                             $flag = false; | ||
|  |                             break; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 使用门槛校验
 | ||
|  |             switch($item['condition_type']) { | ||
|  |                 case 2: | ||
|  |                     if($buyMoney < $item['condition_money']) { | ||
|  |                         // 不满足门槛
 | ||
|  |                         $flag = false; | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 固定时间
 | ||
|  |             if (true == $flag && $item['use_time_type'] == 1) { | ||
|  |                 $item['use_time_start'] > time() && $flag = false; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 次日起可以用
 | ||
|  |             if (true == $flag && $item['use_time_type'] == 3) { | ||
|  |                 $today = date('Y-m-d 00:00:00', $item['create_time']); | ||
|  |                 // 有效开始使用时间
 | ||
|  |                 $effectiveStartTime = strtotime($today) + 24 * 60 * 60; | ||
|  |                 $effectiveStartTime >= time() && $flag = false; | ||
|  |             } | ||
|  | 
 | ||
|  |             if($flag) { | ||
|  |                 // 符合场景、符合门槛
 | ||
|  |                 $suit[] = $item; | ||
|  |             }else{ | ||
|  |                 // 不符合场景或门槛
 | ||
|  |                 $unSuit[] = $item; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         $suit = self::formatInfo($suit); | ||
|  |         $unSuit = self::formatInfo($unSuit); | ||
|  | 
 | ||
|  |         return [ | ||
|  |             'suit' => $suit, | ||
|  |             'un_suit' => $unSuit, | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes PC结算页店铺优惠券 | ||
|  |      * @param $post | ||
|  |      * @return array | ||
|  |      * @author suny | ||
|  |      * @date 2021/10/28 5:31 下午 | ||
|  |      */ | ||
|  |     public static function getShopCouponList($post) | ||
|  |     { | ||
|  |         // 提取用户未删除的优惠券
 | ||
|  |         $whereOne = [ | ||
|  |             ['cl.del', '=', 0], | ||
|  |             ['cl.user_id', '=', $post['user_id']], | ||
|  |             ['s.id', '=', $post['shop_id']], | ||
|  |         ]; | ||
|  |         $fieldOne = 'cl.*, c.name,c.use_time_type,c.use_time_start,c.use_time_end,c.use_time as coupon_use_time,s.name as shop_name,c.condition_type,c.condition_money,c.money,c.use_goods_type'; | ||
|  |         $count_list = CouponList::alias('cl') | ||
|  |             ->leftJoin('coupon c', 'c.id=cl.coupon_id') | ||
|  |             ->leftJoin('shop s', 's.id=c.shop_id') | ||
|  |             ->field($fieldOne) | ||
|  |             ->where($whereOne) | ||
|  |             ->order('id', 'desc') | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  | 
 | ||
|  |         // 循环标识每条记录的券是否过期
 | ||
|  |         foreach($count_list as &$item) { | ||
|  |             $item['is_expired'] = 0; // 默认先标识为未过期
 | ||
|  |             switch($item['use_time_type']) { | ||
|  |                 case 1: // 固定时间
 | ||
|  |                     if($item['use_time_end'] <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 2:  // 领券当天起
 | ||
|  |                     $days = '+'.$item['coupon_use_time'].' day'; | ||
|  |                     $expired_time = strtotime($days, $item['create_time']); | ||
|  |                     if($expired_time <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 3: // 领券次日起
 | ||
|  |                     $days = '+'.($item['coupon_use_time']+1).' day'; | ||
|  |                     $expired_time = strtotime($days, $item['create_time']); | ||
|  |                     if($expired_time <= time()) { | ||
|  |                         $item['is_expired'] = 1; | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         // 根据类型过滤记录提取
 | ||
|  |         $count_list = array_filter($count_list, function($item) { | ||
|  |             return $item['status'] == 0 && $item['is_expired'] == 0; // 未使用,未过期
 | ||
|  |         }); | ||
|  | 
 | ||
|  |         // 结算页优惠券列表
 | ||
|  |         $goodsInfo = self::getGoodsInfo($post['goods']); | ||
|  |         $buyGoodsArr = $goodsInfo['buyGoodsArr']; | ||
|  |         $buyMoney = $goodsInfo['buyMoney']; | ||
|  | 
 | ||
|  |         $suit = []; // 适用券
 | ||
|  |         $unSuit = []; // 不适用券
 | ||
|  |         foreach($count_list as $key => $item) { | ||
|  |             $flag = true; // 默认先标识为适用
 | ||
|  |             // 使用场景校验
 | ||
|  |             switch($item['use_goods_type']) { | ||
|  |                 case 2: // 部分商品可用
 | ||
|  |                     $goods = CouponGoods::alias('cg') | ||
|  |                         ->where(['coupon_id'=>$item['coupon_id']]) | ||
|  |                         ->column('cg.goods_id'); | ||
|  |                     foreach($buyGoodsArr as $subItem) { | ||
|  |                         if(!in_array($subItem, $goods)) { // 是否在可用商品列表
 | ||
|  |                             $flag = false; | ||
|  |                             break; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case 3: // 部分商品不可用
 | ||
|  |                     $goods = CouponGoods::alias('cg') | ||
|  |                         ->where(['coupon_id'=>$item['coupon_id']]) | ||
|  |                         ->column('cg.goods_id'); | ||
|  |                     foreach($buyGoodsArr as $subItem) { | ||
|  |                         if(in_array($subItem, $goods)) { // 是否在不可用商品列表
 | ||
|  |                             $flag = false; | ||
|  |                             break; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 使用门槛校验
 | ||
|  |             switch($item['condition_type']) { | ||
|  |                 case 2: | ||
|  |                     if($buyMoney < $item['condition_money']) { | ||
|  |                         // 不满足门槛
 | ||
|  |                         $flag = false; | ||
|  |                     } | ||
|  |                     break; | ||
|  |             } | ||
|  |             if($flag) { | ||
|  |                 // 符合场景、符合门槛
 | ||
|  |                 $suit[] = $item; | ||
|  |             }else{ | ||
|  |                 // 不符合场景或门槛
 | ||
|  |                 $unSuit[] = $item; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         $suit = self::formatInfo($suit); | ||
|  |         $unSuit = self::formatInfo($unSuit); | ||
|  |         return [ | ||
|  |             'suit' => $suit, | ||
|  |             'un_suit' => $unSuit, | ||
|  |         ]; | ||
|  |     } | ||
|  | } |