454 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			454 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | likeshop开源商城系统
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
 | |||
|  | // | gitee下载:https://gitee.com/likeshop_gitee
 | |||
|  | // | github下载:https://github.com/likeshop-github
 | |||
|  | // | 访问官网:https://www.likeshop.cn
 | |||
|  | // | 访问社区:https://home.likeshop.cn
 | |||
|  | // | 访问手册:http://doc.likeshop.cn
 | |||
|  | // | 微信公众号:likeshop技术社区
 | |||
|  | // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
 | |||
|  | // |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
 | |||
|  | // | 禁止对系统程序代码以任何目的,任何形式的再发布
 | |||
|  | // | likeshop团队版权所有并拥有最终解释权
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | author: likeshop.cn.team
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | namespace app\shop\logic\coupon; | |||
|  | 
 | |||
|  | use app\common\model\user\User; | |||
|  | use app\common\server\UrlServer; | |||
|  | use app\common\basics\Logic; | |||
|  | use think\facade\Db; | |||
|  | use app\common\model\coupon\Coupon; | |||
|  | use app\common\model\coupon\CouponGoods; | |||
|  | use app\common\model\coupon\CouponList; | |||
|  | use app\common\model\user\UserLevel; | |||
|  | 
 | |||
|  | 
 | |||
|  | class CouponLogic extends Logic{ | |||
|  |     public static function lists($get){ | |||
|  |         // 下架本店过了发放时间的优惠券
 | |||
|  |         $now = time(); | |||
|  |         $updateWhere = [ | |||
|  |             ['send_time_start','<',$now], | |||
|  |             ['send_time_end','<',$now], | |||
|  |             ['status','=',1], | |||
|  |             ['shop_id', '=', $get['shop_id']] | |||
|  |         ]; | |||
|  |         Coupon::where($updateWhere) | |||
|  |             ->update(['status'=>0,'update_time'=>$now]); | |||
|  | 
 | |||
|  |         $where = [ | |||
|  |             ['del','=',0], | |||
|  |             ['shop_id','=', $get['shop_id']] | |||
|  |         ]; | |||
|  | 
 | |||
|  |         if(empty($get['type'])) { | |||
|  |             // 已下架
 | |||
|  |             $where[] = ['status', '=', '0']; | |||
|  |         }else{ | |||
|  |             $where[] = ['status', '=', '1']; | |||
|  |         } | |||
|  | 
 | |||
|  |         // 名称
 | |||
|  |         if(isset($get['name']) && !empty($get['name'])) { | |||
|  |             $where[] = ['name', 'like', '%'.trim($get['name']).'%' ]; | |||
|  |         } | |||
|  | 
 | |||
|  |         // 领取方式
 | |||
|  |         if(isset($get['get_type']) && !empty($get['get_type'])) { | |||
|  |             $where[] = ['get_type', '=', $get['get_type'] ]; | |||
|  |         } | |||
|  | 
 | |||
|  |         // 创建时间
 | |||
|  |         if(isset($get['start_time']) && !empty($get['start_time'])) { | |||
|  |             $where[] = ['create_time', '>=', strtotime($get['start_time']) ]; | |||
|  |         } | |||
|  | 
 | |||
|  |         if(isset($get['end_time']) && !empty($get['end_time'])) { | |||
|  |             $where[] = ['create_time', '<=', strtotime($get['end_time']) ]; | |||
|  |         } | |||
|  | 
 | |||
|  |         $coupon_count = Coupon::where($where)->count(); | |||
|  | 
 | |||
|  |         $coupon_list = Coupon::field('id,name,money,use_goods_type,use_goods_type as use_goods_type_desc,condition_type,condition_money,condition_type as condition_type_desc,send_total_type,send_total_type as send_total_type_desc,send_total,get_type,get_type as get_type_desc,status,status as statusDesc,send_time_start,send_time_end,send_time_start as send_time,use_time_type,use_time_start,use_time_end,use_time,use_time_type as use_time_desc,create_time') | |||
|  |             ->where($where) | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->order('id desc') | |||
|  |             ->select() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         return ['count' => $coupon_count, 'list' => $coupon_list]; | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  |     //新增优惠券
 | |||
|  |     public static function add($post){ | |||
|  |         $time = time(); | |||
|  |         //拼接数据
 | |||
|  |         $add_data = [ | |||
|  |             'shop_id'           => $post['shop_id'], | |||
|  |             'name'              => trim($post['name']), | |||
|  |             'money'             => $post['money'], | |||
|  |             'send_time_start'   => strtotime($post['send_time_start']), | |||
|  |             'send_time_end'     => strtotime($post['send_time_end']), | |||
|  |             'send_total_type'   => $post['send_total_type'], | |||
|  |             'send_total'        => $post['send_total_type'] == 2 ? $post['send_total'] : '', | |||
|  |             'condition_type'    => $post['condition_type'], | |||
|  |             'condition_money'   => $post['condition_type'] == 2 ? $post['condition_money'] : '', | |||
|  |             'use_time_type'     => $post['use_time_type'], | |||
|  |             'use_time_start'    => $post['use_time_type'] == 1 ? strtotime($post['use_time_start']) : '', | |||
|  |             'use_time_end'      => $post['use_time_type'] == 1 ? strtotime($post['use_time_end']) : '', | |||
|  |             'use_time'          => $post['use_time_type'] == 2 ? $post['use_time'] : '', | |||
|  |             'get_type'          => $post['get_type'], | |||
|  |             'get_num_type'      => $post['get_num_type'], | |||
|  |             'get_num'           => $post['get_num'], | |||
|  |             'use_goods_type'    => $post['use_goods_type'], | |||
|  |             'status'            => $post['status'], | |||
|  |             'create_time'       => $time, | |||
|  |             'update_time'       => $time, | |||
|  |         ]; | |||
|  |         //用券时间
 | |||
|  |         if($post['use_time_type'] == 3){ | |||
|  |             $update_data['use_time'] = $post['tomorrow_use_time']; | |||
|  |         } | |||
|  |         //领取次数
 | |||
|  |         if($post['get_num_type'] == 3){ | |||
|  |             $update_data['get_num'] = $post['day_get_num']; | |||
|  |         } | |||
|  | 
 | |||
|  |         //提交订单
 | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             $coupon = Coupon::create($add_data); | |||
|  |             if($coupon && $coupon['use_goods_type'] != 1){ | |||
|  |                 $goods_coupon = []; | |||
|  |                 $now = time(); | |||
|  |                 foreach ($post['goods_ids'] as $item){ | |||
|  |                     $goods_coupon[] = [ | |||
|  |                         'coupon_id'     => $coupon->id, | |||
|  |                         'goods_id'      => $item, | |||
|  |                         'create_time'   => $now, | |||
|  |                     ]; | |||
|  |                 } | |||
|  |                 $couponGoods = new CouponGoods(); | |||
|  |                 $couponGoods->saveAll($goods_coupon); | |||
|  |             } | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         } catch (\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  | 
 | |||
|  |     } | |||
|  |     public static function edit($post){ | |||
|  |         //拼接数据
 | |||
|  |         $update_data = [ | |||
|  |             'shop_id'           => $post['shop_id'], | |||
|  |             'name'              => $post['name'], | |||
|  |             'money'             => $post['money'], | |||
|  |             'send_time_start'   => strtotime($post['send_time_start']), | |||
|  |             'send_time_end'     => strtotime($post['send_time_end']), | |||
|  |             'send_total_type'   => $post['send_total_type'], | |||
|  |             'send_total'        => $post['send_total_type'] == 2 ? $post['send_total'] : '', | |||
|  |             'condition_type'    => $post['condition_type'], | |||
|  |             'condition_money'   => $post['condition_type'] == 2 ? $post['condition_money'] : '', | |||
|  |             'use_time_type'     => $post['use_time_type'], | |||
|  |             'use_time_start'    => $post['use_time_type'] == 1 ? strtotime($post['use_time_start']) : '', | |||
|  |             'use_time_end'      => $post['use_time_type'] == 1 ? strtotime($post['use_time_end']) : '', | |||
|  |             'use_time'          => $post['use_time_type'] == 2 ? $post['use_time'] : '', | |||
|  |             'get_type'          => $post['get_type'], | |||
|  |             'get_num_type'      => $post['get_num_type'], | |||
|  |             'get_num'           => $post['get_num_type'] == 2 ? $post['get_num'] : '', | |||
|  |             'use_goods_type'    => $post['use_goods_type'], | |||
|  |             'status'            => $post['status'], | |||
|  |             'update_time'       => time() | |||
|  |         ]; | |||
|  |         //用券时间
 | |||
|  |         if($post['use_time_type'] == 3){ | |||
|  |             $update_data['use_time'] = $post['tomorrow_use_time']; | |||
|  |         } | |||
|  |         //领取次数
 | |||
|  |         if($post['get_num_type'] == 3){ | |||
|  |             $update_data['get_num'] = $post['day_get_num']; | |||
|  |         } | |||
|  | 
 | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             $coupon = Coupon::update($update_data,['id'=>$post['id']]); | |||
|  |             CouponGoods::where(['coupon_id'=>$post['id']])->delete(); | |||
|  | 
 | |||
|  |             if($coupon && $coupon['use_goods_type'] != 1){ | |||
|  |                 $goods_coupon = []; | |||
|  |                 $now = time(); | |||
|  |                 foreach ($post['goods_ids'] as $item){ | |||
|  |                     $goods_coupon[] = [ | |||
|  |                         'coupon_id'     => $post['id'], | |||
|  |                         'goods_id'      => $item, | |||
|  |                         'create_time'   => $now, | |||
|  |                     ]; | |||
|  |                 } | |||
|  |                 $couponGoods = new CouponGoods(); | |||
|  |                 $couponGoods->saveAll($goods_coupon); | |||
|  |             } | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         } catch (\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getCoupon($id,$get_data = false){ | |||
|  |         $coupon = Coupon::findOrEmpty($id); | |||
|  |         $coupon['goods_coupon'] = []; | |||
|  |         if($get_data) { | |||
|  |             $coupon = $coupon->getData(); | |||
|  |             $coupon['send_time_start'] = date('Y-m-d H:i:s',$coupon['send_time_start']); | |||
|  |             $coupon['send_time_end'] = date('Y-m-d H:i:s',$coupon['send_time_end']); | |||
|  |             if($coupon['use_goods_type'] != 1){ // 非全部商品
 | |||
|  |                 $goods_coupon= CouponGoods::alias('cg') | |||
|  |                     ->join('goods g','cg.goods_id = g.id') | |||
|  |                     ->where(['coupon_id'=>$id]) | |||
|  |                     ->field('g.id,name,max_price,min_price,stock') | |||
|  |                     ->select(); | |||
|  |                 foreach ($goods_coupon as &$item){ | |||
|  |                     $item['price'] = '¥'.$item['min_price'].'~'.'¥'.$item['max_price']; | |||
|  |                     if($item['max_price'] == $item['min_price']){ | |||
|  |                         $item['price'] = '¥'.$item['min_price']; | |||
|  |                     } | |||
|  |                 } | |||
|  |                 $coupon['goods_coupon'] = $goods_coupon; | |||
|  |             } | |||
|  |             if($coupon['use_time_start']){ | |||
|  |                 $coupon['use_time_start'] = date('Y-m-d H:i:s',$coupon['use_time_start']); | |||
|  |                 $coupon['use_time_end'] = date('Y-m-d H:i:s',$coupon['use_time_end']); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         return $coupon; | |||
|  |     } | |||
|  | 
 | |||
|  |     /* | |||
|  |  * 发放记录 | |||
|  |  */ | |||
|  |     public static function log($get){ | |||
|  |         $where[] = ['cl.del','=',0]; | |||
|  |         $where[] = ['cl.coupon_id','=',$get['id']]; | |||
|  | 
 | |||
|  |         if(isset($get['keyword']) && $get['keyword']){ | |||
|  |             switch($get['search_type']) { | |||
|  |                 case 'sn'; | |||
|  |                     $where[] = ['u.sn', '=', $get['keyword']]; | |||
|  |                     break; | |||
|  |                 case 'nickname'; | |||
|  |                     $where[] = ['u.nickname', '=', $get['keyword']]; | |||
|  |                     break; | |||
|  |                 case 'mobile'; | |||
|  |                     $where[] = ['u.mobile', '=', $get['keyword']]; | |||
|  |                     break; | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         if(isset($get['status']) && $get['status'] != '') { | |||
|  |             $where[] = ['cl.status', '=', $get['status']]; | |||
|  |         } | |||
|  | 
 | |||
|  |         $log_count = CouponList::alias('cl') | |||
|  |             ->join('user u','cl.user_id = u.id') | |||
|  |             ->where($where) | |||
|  |             ->count(); | |||
|  | 
 | |||
|  |         $log_list = CouponList::alias('cl') | |||
|  |             ->join('user u','cl.user_id = u.id') | |||
|  |             ->where($where) | |||
|  |             ->field('cl.coupon_id,cl.status as cl_status,coupon_code,cl.create_time as cl_create_time,cl.use_time,u.nickname,u.avatar,u.mobile,u.sn,u.level') | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->select(); | |||
|  |         $coupon_list = Coupon::where(['del'=>0])->column('name','id'); | |||
|  |         $level_name =  UserLevel::where(['del'=>0])->column('name','id'); | |||
|  |         foreach ($log_list as &$item) | |||
|  |         { | |||
|  |             $item['coupon_name'] = $coupon_list[$item['coupon_id']] ?? ''; | |||
|  |             $item['avatar'] = UrlServer::getFileUrl($item['avatar']); | |||
|  |             $item['level_name'] = $level_name[$item['level']] ?? ''; | |||
|  |             $item['status_desc'] = $item['cl_status'] ? '已使用' : '未使用'; | |||
|  |             $item['cl_create_time'] = date('Y-m-d H:i:s',$item['cl_create_time']); | |||
|  |             $item['use_time_desc'] = $item['use_time'] ? date('Y-m-d H:i:s',$item['use_time']) : ''; | |||
|  |         } | |||
|  |         return ['count'=>$log_count , 'lists'=>$log_list]; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function changeStatus($id) | |||
|  |     { | |||
|  |         try{ | |||
|  |             $coupon = Coupon::findOrEmpty($id); | |||
|  |             if ($coupon['send_time_end'] <= time() && $coupon['status'] == 0) { | |||
|  |                 throw new \Exception('已过发放时间,无法上架'); | |||
|  |             } | |||
|  |             $coupon->status = $coupon->status ? 0 : 1; | |||
|  |             $coupon->update_time = time(); | |||
|  |             $coupon->save(); | |||
|  |             return true; | |||
|  |         }catch(\Exception $e) { | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  |     /* | |||
|  |      * 删除优惠券  删除已领取用户的优惠券 | |||
|  |      */ | |||
|  |     public static function del($id){ | |||
|  |         Db::startTrans(); | |||
|  |         try{ | |||
|  |             $time = time(); | |||
|  |             // 优惠券主表
 | |||
|  |             Coupon::update([ | |||
|  |                 'id' => $id, | |||
|  |                 'del' => 1, | |||
|  |                 'update_time' => $time | |||
|  |             ]); | |||
|  |             // 已发放的优惠券
 | |||
|  |             CouponList::where(['coupon_id'=>$id])->update([ | |||
|  |                 'del' => 1, | |||
|  |                 'update_time' => $time | |||
|  |             ]); | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         }catch(\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 发放优惠券 | |||
|  |      */ | |||
|  |     public static function sendCoupon($post){ | |||
|  |         $user_ids = $post['user_ids']; | |||
|  |         $coupon_ids = $post['coupon_ids']; | |||
|  |         $coupon_list = Coupon::where('id', 'in', $coupon_ids)->column('*', 'id'); | |||
|  |         $user_list = User::where('id', 'in', $user_ids)->column('id,nickname', 'id'); | |||
|  | 
 | |||
|  |         // 判断是否会超发
 | |||
|  |         foreach($coupon_ids as $coupon_id) { | |||
|  |             $coupon = $coupon_list[$coupon_id]; | |||
|  |             if($coupon['send_total_type'] == 2) { // 限制数量的券
 | |||
|  |                 $already_issue = CouponList::where([ | |||
|  |                     ['coupon_id','=',$coupon_id], | |||
|  |                     ['del','=',0] | |||
|  |                 ])->count(); // 已发放数量
 | |||
|  |                 $target_issue = count($user_ids) + $already_issue; // 目标发放总数(若能正常发放的话)
 | |||
|  |                 if($target_issue > $coupon['send_total']) { | |||
|  |                     self::$error = $coupon['name'].'的发放数量已达到限制'; | |||
|  |                     return false; | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         // 判断用户是否超出领取数量
 | |||
|  |         foreach($coupon_ids as $coupon_id) { | |||
|  |             $coupon = $coupon_list[$coupon_id]; | |||
|  |             if($coupon['get_num_type'] == 2) { // 限制次数
 | |||
|  |                 foreach($user_ids as $user_id) { | |||
|  |                     $count = CouponList::where([ | |||
|  |                         'user_id' => $user_id, | |||
|  |                         'coupon_id' => $coupon_id, | |||
|  |                         'del' => 0, | |||
|  |                     ])->count(); | |||
|  |                     if($count >= $coupon['get_num']) { | |||
|  |                         self::$error = $user_list[$user_id]['nickname'].'已超出领取的限制次数'; | |||
|  |                         return false; | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             if($coupon['get_num_type'] == 3) { // 每天领取次数限制
 | |||
|  |                 $timeStr = date('Y-m-d', time()); | |||
|  |                 $today = strtotime($timeStr.' 00:00:00'); | |||
|  |                 foreach($user_ids as $user_id) { | |||
|  |                     $count = CouponList::where([ | |||
|  |                         ['user_id', '=', $user_id], | |||
|  |                         ['coupon_id', '=', $coupon_id], | |||
|  |                         ['del', '=', 0], | |||
|  |                         ['create_time', '>', $today], | |||
|  |                     ])->count(); | |||
|  |                     if($count >= $coupon['get_num']) { | |||
|  |                         self::$error = $user_list[$user_id]['nickname'].'已超出每日领取的限制次数'; | |||
|  |                         return false; | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         try{ | |||
|  |             $addData = []; | |||
|  |             $time = time(); | |||
|  |             foreach ($coupon_ids as $coupon_id){ | |||
|  |                 foreach ($user_ids  as $user_id){ | |||
|  |                     $addData[] = [ | |||
|  |                         'user_id'       => $user_id, | |||
|  |                         'coupon_id'     => $coupon_id, | |||
|  |                         'status'        => 0, | |||
|  |                         'coupon_code'   => create_coupon_code(), | |||
|  |                         'create_time'   => $time, | |||
|  |                         'update_time'   => $time | |||
|  |                     ]; | |||
|  |                 } | |||
|  |             } | |||
|  |             // 批量添加
 | |||
|  |             $couponList = new CouponList(); | |||
|  |             $couponList->saveAll($addData); | |||
|  | 
 | |||
|  |             return true; | |||
|  |         }catch(\Exception $e){ | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getShopCouponList($get) | |||
|  |     { | |||
|  |         $where = [ | |||
|  |             ['del', '=', 0],  // 未删除
 | |||
|  |             ['status', '=', 1], // 上架中
 | |||
|  |             ['get_type', '=', 2], // 商家赠送
 | |||
|  |             ['send_time_start', '<=', time()], // 开始发放时间早于或等于当前时间
 | |||
|  |             ['send_time_end', '>', time()], // 结束发放时间大于当前时间
 | |||
|  |             ['shop_id', '=', $get['shop_id']] | |||
|  |         ]; | |||
|  | 
 | |||
|  |         if(isset($get['name']) && !empty($get['name'])) { | |||
|  |             $where[] = ['name', 'like', '%'.trim($get['name']).'%']; | |||
|  |         } | |||
|  | 
 | |||
|  |         if(isset($get['use_goods_type']) && !empty($get['use_goods_type'])) { | |||
|  |             $where[] = ['use_goods_type', '=', $get['use_goods_type']]; | |||
|  |         } | |||
|  | 
 | |||
|  |         $lists = Coupon::field('id,name,send_time_start,send_time_end,send_time_start as send_time,money,get_type as get_type_desc,condition_type as condition_type_desc_two,condition_money,send_total_type as send_info,send_total,use_goods_type as use_goods_type_desc,use_time_type,use_time_start,use_time_end,use_time,use_time as use_time_desc,status as status_desc,create_time') | |||
|  |             ->where($where) | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->order('id', 'desc') | |||
|  |             ->select() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         $count = Coupon::field('id,name,send_time_start,send_time_end,money,get_type,condition_type,send_total_type') | |||
|  |             ->where($where) | |||
|  |             ->count(); | |||
|  | 
 | |||
|  |         return [ | |||
|  |             'count' => $count, | |||
|  |             'lists' => $lists | |||
|  |         ]; | |||
|  |     } | |||
|  | } |