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