Files
2026-04-14 17:46:22 +08:00

210 lines
7.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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