glhcp/server/app/admin/logic/user/LevelLogic.php

210 lines
7.6 KiB
PHP
Raw Normal View History

2023-08-10 06:59:52 +00:00
<?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;
}
}