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