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