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

210 lines
7.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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