210 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			210 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | namespace app\admin\logic\user; | |||
|  | 
 | |||
|  | use app\common\basics\Logic; | |||
|  | use app\common\model\user\User; | |||
|  | use app\common\model\user\UserLevel; | |||
|  | use app\common\server\UrlServer; | |||
|  | use think\facade\Db; | |||
|  | 
 | |||
|  | class LevelLogic extends Logic | |||
|  | { | |||
|  |     public static function lists($get) | |||
|  |     { | |||
|  |         $count = UserLevel::where(['del'=>0])->count(); | |||
|  |         $lists = UserLevel::where(['del'=>0])->order('growth_value', 'asc')->page($get['page'], $get['limit'])->select()->toArray(); | |||
|  | 
 | |||
|  |         foreach ($lists as &$item){ | |||
|  |             $item['image'] = UrlServer::getFileUrl($item['image']); | |||
|  |             $item['background_image'] = UrlServer::getFileUrl($item['background_image']); | |||
|  |         } | |||
|  |         return ['count' => $count, 'lists' => $lists]; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function add($post) | |||
|  |     { | |||
|  |         Db::startTrans(); | |||
|  |         try{ | |||
|  |             $userLevel = UserLevel::where(['name'=>trim($post['name']), 'del'=>0])->findOrEmpty(); | |||
|  |             if(!$userLevel->isEmpty()) { | |||
|  |                 throw new \think\Exception('等级名称已被使用,请更换后重试'); | |||
|  |             } | |||
|  |             $userLevel = UserLevel::where(['growth_value'=>intval($post['growth_value']), 'del'=>0])->findOrEmpty(); | |||
|  |             if(!$userLevel->isEmpty()) { | |||
|  |                 throw new \think\Exception('指定成长值的等级已存在'); | |||
|  |             } | |||
|  |             $time = time(); | |||
|  |             $data = [ | |||
|  |                 'name' => trim($post['name']), | |||
|  |                 'growth_value' => intval($post['growth_value']), | |||
|  |                 'image' => clearDomain($post['image']), | |||
|  |                 'background_image' => clearDomain($post['background_image']), | |||
|  |                 'remark' => trim($post['remark']), | |||
|  |                 'discount' => $post['discount'], | |||
|  |                 'create_time' => $time, | |||
|  |                 'update_time' => $time, | |||
|  |                 'del' => 0 | |||
|  |             ]; | |||
|  |             UserLevel::create($data); | |||
|  |             // 更新会员等级
 | |||
|  |             $userArr = User::field('id,level,user_growth')->where('del', 0)->select()->toArray(); | |||
|  |             self::updateUserLevel($userArr); | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         }catch(\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getUserLevel($id){ | |||
|  |         $detail = UserLevel::where(['id'=>$id,'del'=>0])->findOrEmpty(); | |||
|  |         if($detail->isEmpty()) { | |||
|  |             return []; | |||
|  |         } | |||
|  |         $detail = $detail->toArray(); | |||
|  |         $detail['image'] = UrlServer::getFileUrl($detail['image']); | |||
|  |         $detail['background_image'] = UrlServer::getFileUrl($detail['background_image']); | |||
|  |         return $detail; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function edit($post) | |||
|  |     { | |||
|  |         if(empty($post['discount']) || $post['discount'] === ''){ | |||
|  |             $post['discount'] = 10; | |||
|  |         } | |||
|  |         Db::startTrans(); | |||
|  |         try{ | |||
|  |             $userLevel = UserLevel::where([ | |||
|  |                 ['name', '=', trim($post['name'])], | |||
|  |                 ['del', '=', 0], | |||
|  |                 ['id', '<>', $post['id']] | |||
|  |             ])->findOrEmpty(); | |||
|  |             if(!$userLevel->isEmpty()) { | |||
|  |                 throw new \think\Exception('等级名称已被使用,请更换后重试'); | |||
|  |             } | |||
|  |             $userLevel = UserLevel::where([ | |||
|  |                 ['growth_value', '=', intval($post['growth_value'])], | |||
|  |                 ['del', '=', 0], | |||
|  |                 ['id', '<>', $post['id']] | |||
|  |             ])->findOrEmpty(); | |||
|  |             if(!$userLevel->isEmpty()) { | |||
|  |                 throw new \think\Exception('指定成长值的等级已存在'); | |||
|  |             } | |||
|  |             $time = time(); | |||
|  |             $data = [ | |||
|  |                 'id' => $post['id'], | |||
|  |                 'name' => trim($post['name']), | |||
|  |                 'growth_value' => intval($post['growth_value']), | |||
|  |                 'image' => clearDomain($post['image']), | |||
|  |                 'background_image' => clearDomain($post['background_image']), | |||
|  |                 'discount' => $post['discount'], | |||
|  |                 'remark' => trim($post['remark']), | |||
|  |                 'update_time' => $time, | |||
|  |                 'del' => 0 | |||
|  |             ]; | |||
|  |             UserLevel::update($data); | |||
|  |             // 更新会员等级
 | |||
|  |             $userArr = User::field('id,level,user_growth')->where('del', 0)->select()->toArray(); | |||
|  |             self::updateUserLevel($userArr); | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         }catch(\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function del($id) | |||
|  |     { | |||
|  |         Db::startTrans(); | |||
|  |         try{ | |||
|  |             $data = [ | |||
|  |                 'id' => $id, | |||
|  |                 'del' => 1, | |||
|  |                 'update_time' => time() | |||
|  |             ]; | |||
|  |             UserLevel::update($data); | |||
|  |             // 更新会员等级
 | |||
|  |             $userArr = User::field('id,level,user_growth')->where('del', 0)->select()->toArray(); | |||
|  |             self::updateUserLevel($userArr); | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         }catch(\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 更新会员等级 | |||
|  |      * 原则:只升不降 | |||
|  |      * $userArr 需要更新会员等级的用户数组,必须的字段:id,level,user_growth | |||
|  |      */ | |||
|  |     public static function updateUserLevel($userArr) | |||
|  |     { | |||
|  |         // 所有会员等级
 | |||
|  |         $userLevelArr = UserLevel::field('id,growth_value')->where('del', 0) | |||
|  |             ->order('growth_value', 'desc') | |||
|  |             ->select() | |||
|  |             ->toArray(); | |||
|  |         if(empty($userLevelArr)) { // 未设置会员等级
 | |||
|  |             // 全部会员等级统一更新为0
 | |||
|  |             User::where('del', 0)->update([ | |||
|  |                 'level' => 0, | |||
|  |                 'update_time' => time() | |||
|  |             ]); | |||
|  |         } | |||
|  |         // 转格式,变为id为数组下标
 | |||
|  |         $levelArr = []; | |||
|  |         foreach($userLevelArr as $item) { | |||
|  |             $levelArr[$item['id']] = $item; | |||
|  |         } | |||
|  | 
 | |||
|  |         $updateData = []; | |||
|  |         foreach($levelArr as $level) { | |||
|  |             $filterIds = []; // 本轮结束已处理的会员id
 | |||
|  |             foreach($userArr as $user) { | |||
|  |                 if($user['user_growth'] >= $level['growth_value']) { | |||
|  |                     $targetLevelGrwothValue = $level['growth_value']; // 目标会员等级成长值
 | |||
|  |                     // 原会员等级成长值
 | |||
|  |                     $originLevelGrowthValue = isset($levelArr[$user['level']]) ? $levelArr[$user['level']]['growth_value'] : 0; | |||
|  |                     // 降级或等级一样,不处理直接下一轮循环
 | |||
|  |                     if($originLevelGrowthValue > $targetLevelGrwothValue) { | |||
|  |                         $filterIds[] = $user['id']; | |||
|  |                         continue; | |||
|  |                     } | |||
|  |                     $updateData[] = ['id'=>$user['id'], 'level'=>$level['id']]; | |||
|  |                     $filterIds[] = $user['id']; | |||
|  |                 } | |||
|  |             } | |||
|  |             // 过滤已处理过的用户,避免重复更新
 | |||
|  |             $userArr = array_filter($userArr, function($item) use ($filterIds){ | |||
|  |                 return !in_array($item['id'], $filterIds); | |||
|  |             }); | |||
|  |         } | |||
|  | 
 | |||
|  |         // 剩余未处理的会员,若原有等级已被删除掉,直接置为0
 | |||
|  |         foreach($userArr as $user) { | |||
|  |             if(!isset($levelArr[$user['level']])) { | |||
|  |                 $updateData[] = ['id'=>$user['id'], 'level'=>0]; | |||
|  |             } | |||
|  |         } | |||
|  |         $userModel = new User(); | |||
|  |         $userModel->saveAll($updateData); | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getLevelList() | |||
|  |     { | |||
|  |         $levelArr = UserLevel::field('id,name') | |||
|  |             ->where('del', 0) | |||
|  |             ->order('growth_value', 'asc') | |||
|  |             ->select() | |||
|  |             ->toArray(); | |||
|  |         $levelArr[0] = ['id'=>0, 'name'=>'暂无等级']; | |||
|  |         return $levelArr; | |||
|  |     } | |||
|  | } |