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