feat: 项目基础框架+配置+Kernel
This commit is contained in:
@@ -0,0 +1,424 @@
|
||||
<?php
|
||||
namespace App\DAO;
|
||||
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use App\{Users, PrizePool, Setting};
|
||||
use App\DAO\PrizePool\CandySender;
|
||||
use App\Events\RealNameEvent;
|
||||
|
||||
class UserDAO
|
||||
{
|
||||
/**
|
||||
* 检查是否符合升级工作室条件,若符合自动升级
|
||||
*
|
||||
* @param App\Users $user
|
||||
* @return boolean
|
||||
*/
|
||||
public static function checkUpgradeAtelierCondition(&$user) : bool
|
||||
{
|
||||
$user->refresh();
|
||||
//检查自身是否已实名或已经是工作室
|
||||
if ($user->is_realname != 2 || $user->is_atelier == 1) {
|
||||
return false;
|
||||
}
|
||||
$upgrade_atelier_must_has_son = Setting::getValueByKey('upgrade_atelier_must_has_son'); //升级工作室直推实名人数要求
|
||||
$upgrade_atelier_must_team_son = Setting::getValueByKey('upgrade_atelier_must_team_son'); //升级工作室团队实名人数要求
|
||||
$upgrade_atelier_must_team_recharge = Setting::getValueByKey('upgrade_atelier_must_team_recharge'); //升级工作室团队充值金额
|
||||
//检查直推实名人数
|
||||
if ($user->zhitui_real_number < $upgrade_atelier_must_has_son) {
|
||||
return false;
|
||||
}
|
||||
//检查团队实名人数
|
||||
if ($user->real_teamnumber < $upgrade_atelier_must_team_son) {
|
||||
return false;
|
||||
}
|
||||
//检查团队充值金额
|
||||
if ($user->top_upnumber < $upgrade_atelier_must_team_recharge) {
|
||||
return false;
|
||||
}
|
||||
$user->is_atelier = 1;
|
||||
return $user->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查用户的上级是否有通证变动
|
||||
* @param App\Users $user 用户查询的对象
|
||||
*/
|
||||
public static function addCandyNumber($user)
|
||||
{
|
||||
$parents = self::getParentsPathDesc($user);
|
||||
foreach ($parents as $key => $user_id) {
|
||||
$current_user = Users::find($user_id);//检查该上级是否实名认证过
|
||||
if ($current_user->is_realname == 2) {
|
||||
//该上级实名认证过
|
||||
self::checkUserRealNameReward($current_user); //检查是否符合发奖条件,符合就发放奖励
|
||||
self::checkUpgradeAtelierCondition($current_user); //检查是否符合升级工作室条件
|
||||
} else {
|
||||
//该上级还没实名认证
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测用户是否符合实名奖励
|
||||
*
|
||||
* @param App\Users $user
|
||||
* @return bool
|
||||
*/
|
||||
public static function checkUserRealNameReward(&$user)
|
||||
{
|
||||
if (!$user) {
|
||||
return false;
|
||||
}
|
||||
//获取setting值
|
||||
$real_name_candy = Setting::getValueByKey('real_name_candy', '');
|
||||
$zhitui2_number = Setting::getValueByKey('zhitui2_number', '');
|
||||
$zhitui2_candy = Setting::getValueByKey('zhitui2_candy', '');
|
||||
$zhitui3_number = Setting::getValueByKey('zhitui3_number', '');
|
||||
$zhitui3_real_teamnumber = Setting::getValueByKey('zhitui3_real_teamnumber', '');
|
||||
$zhitui3_top_upnumber = Setting::getValueByKey('zhitui3_top_upnumber', '');
|
||||
$zhitui3_candy = Setting::getValueByKey('zhitui3_candy', '');
|
||||
$zhitui4_number = Setting::getValueByKey('zhitui4_number', '');
|
||||
$zhitui4_real_teamnumber = Setting::getValueByKey('zhitui4_real_teamnumber', '');
|
||||
$zhitui4_top_upnumber = Setting::getValueByKey('zhitui4_top_upnumber', '');
|
||||
$zhitui4_candy = Setting::getValueByKey('zhitui4_candy', '');
|
||||
$zhitui5_number = Setting::getValueByKey('zhitui5_number', '');
|
||||
$zhitui5_real_teamnumber = Setting::getValueByKey('zhitui5_real_teamnumber', '');
|
||||
$zhitui5_top_upnumber = Setting::getValueByKey('zhitui5_top_upnumber', '');
|
||||
$zhitui5_candy = Setting::getValueByKey('zhitui5_candy', '');
|
||||
$zhitui6_number = Setting::getValueByKey('zhitui6_number', '');
|
||||
$zhitui6_real_teamnumber = Setting::getValueByKey('zhitui6_real_teamnumber', '');
|
||||
$zhitui6_top_upnumber = Setting::getValueByKey('zhitui6_top_upnumber', '');
|
||||
$zhitui6_candy = Setting::getValueByKey('zhitui6_candy', '');
|
||||
|
||||
$only = 1;
|
||||
$user->refresh();
|
||||
$push_status = $user->push_status;
|
||||
|
||||
//实名认证过的有效直推人数
|
||||
$real_zhitui = Users::where("is_realname", 2)
|
||||
->where("parent_id", $user->id)
|
||||
->count();
|
||||
|
||||
$user->zhitui_real_number = $real_zhitui ?: 0; //更新直推实名人数
|
||||
$user->real_teamnumber += 1;
|
||||
|
||||
if ($push_status == 1) {
|
||||
if ($real_zhitui >= $zhitui2_number) {
|
||||
$user->candy_number += $zhitui2_candy;
|
||||
$user->push_status = 2;
|
||||
$log_candy_number = $zhitui2_candy;
|
||||
$only = 2;
|
||||
}
|
||||
} elseif ($push_status == 2) {
|
||||
if ($real_zhitui >= $zhitui3_number && $user->real_teamnumber >= $zhitui3_real_teamnumber && $user->top_upnumber >= $zhitui3_top_upnumber) {
|
||||
$user->candy_number += $zhitui3_candy;
|
||||
$user->push_status = 3;
|
||||
$log_candy_number = $zhitui3_candy;
|
||||
$only = 2;
|
||||
}
|
||||
} elseif ($push_status == 3) {
|
||||
if ($real_zhitui >= $zhitui4_number && $user->real_teamnumber >= $zhitui4_real_teamnumber && $user->top_upnumber >= $zhitui4_top_upnumber) {
|
||||
$user->candy_number += $zhitui4_candy;
|
||||
$user->push_status = 4;
|
||||
$log_candy_number = $zhitui4_candy;
|
||||
$only = 2;
|
||||
}
|
||||
} elseif ($push_status == 4) {
|
||||
if ($real_zhitui >= $zhitui5_number && $user->real_teamnumber >= $zhitui5_real_teamnumber && $user->top_upnumber >= $zhitui5_top_upnumber) {
|
||||
$user->candy_number += $zhitui5_candy;
|
||||
$user->push_status = 5;
|
||||
$log_candy_number = $zhitui5_candy;
|
||||
$only = 2;
|
||||
}
|
||||
} elseif ($push_status == 5) {
|
||||
if ($real_zhitui >= $zhitui6_number && $user->real_teamnumber >= $zhitui6_real_teamnumber && $user->top_upnumber >= $zhitui6_top_upnumber) {
|
||||
$user->candy_number += $zhitui6_candy;
|
||||
$user->push_status = 6;
|
||||
$log_candy_number = $zhitui6_candy;
|
||||
$only = 2;
|
||||
}
|
||||
}
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
//当天新增实名认证团队人数
|
||||
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
|
||||
if($user->new_isreal_time<$beginToday)
|
||||
{
|
||||
$user->today_real_teamnumber=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$user->today_real_teamnumber=$user->today_real_teamnumber+1;
|
||||
}
|
||||
$user->new_isreal_time=time();
|
||||
|
||||
|
||||
|
||||
$result = $user->save();
|
||||
if (!$result) {
|
||||
throw new \Exception('用户' . $user->account_number . '更新信息失败');
|
||||
}
|
||||
//开始记录日志
|
||||
if ($only == 2) {
|
||||
$prize_pool = new PrizePool();
|
||||
$prize_pool->scene = PrizePool::CERTIFICATION;//const CERTIFICATION = 1; //实名认证奖励
|
||||
$prize_pool->reward_type = PrizePool::REWARD_CANDY;//const REWARD_CANDY = 0; //奖励通证
|
||||
$prize_pool->reward_qty = $log_candy_number;
|
||||
$prize_pool->from_user_id = $user->id;
|
||||
$prize_pool->to_user_id = $user->id;
|
||||
$prize_pool->status = 1;
|
||||
$prize_pool->memo = '下级直推' . $real_zhitui . '人,实名认证团队' . $user->real_teamnumber . '人,充值金额' . $user->top_upnumber . '美金,触发通证奖励' . $log_candy_number;
|
||||
$prize_pool->create_time = time();
|
||||
$prize_pool->receive_time = time();
|
||||
$result = $prize_pool->save();
|
||||
if (!$result) {
|
||||
throw new \Exception('用户' . $user->account_number . '奖励记录失败');
|
||||
}
|
||||
}
|
||||
DB::commit();
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 取用户的上级工作室
|
||||
*
|
||||
* @param App\Users $user
|
||||
* @return App\Users||null
|
||||
*/
|
||||
public static function getParentsAtelier($user)
|
||||
{
|
||||
$parents = UserDAO::getParentsPathDesc($user);
|
||||
//将所有上级工作室查出来
|
||||
$parent_atelier = Users::where('is_atelier', 1)
|
||||
->whereIn('id', $parents)
|
||||
->get();
|
||||
if (count($parent_atelier) <= 0) {
|
||||
return $parent_atelier;
|
||||
}
|
||||
$parents_sort = array_flip($parents);
|
||||
//检测有没有达到封页
|
||||
$sorted = $parent_atelier->sortBy(function ($item, $key) use ($parents_sort) {
|
||||
$sort = $parents_sort[$item->id];
|
||||
return $sort;
|
||||
});
|
||||
$sorted = $sorted->values();
|
||||
return $sorted;
|
||||
}
|
||||
|
||||
//递归查询用户下级所有人数
|
||||
public function GetTeamMember($members, $mid)
|
||||
{
|
||||
$Teams = array();//最终结果
|
||||
$mids = array($mid);//第一次执行时候的用户id
|
||||
do {
|
||||
$othermids = array();
|
||||
$state = false;
|
||||
foreach ($mids as $valueone) {
|
||||
foreach ($members as $key => $valuetwo) {
|
||||
if ($valuetwo['parent_id'] == $valueone && $valuetwo['is_realname'] == 2) //实名认证通过的团队人数
|
||||
{
|
||||
$Teams[] = $valuetwo['id'];//找到我的下级立即添加到最终结果中
|
||||
$othermids[] = $valuetwo['id'];//将我的下级id保存起来用来下轮循环他的下级
|
||||
// array_splice($members,$key,1);//从所有会员中删除他
|
||||
$state = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
$mids = $othermids;//foreach中找到的我的下级集合,用来下次循环
|
||||
} while ($state == true);
|
||||
$Teams = Users::whereIn("id", $Teams)->where("is_realname", "=", 2)->count();
|
||||
|
||||
return $Teams;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户团队充值业绩金额
|
||||
* @param integer $id 用户的id值,用于查询更新该用户上级的团队充值金额
|
||||
* @return $number 充值金额值
|
||||
* * @param integer $qty 要取的上级代数,不传或传null则取全部
|
||||
*/
|
||||
public static function updateTopUpnumber($id, $number, $qty = null)
|
||||
{
|
||||
$user = Users::find($id);
|
||||
$parents = self::getParentsPathDesc($user, $qty);
|
||||
$result = Users::whereIn('id', $parents)->increment('top_upnumber', $number);
|
||||
//此处应再遍历检查一下$parents是否符合升级条件
|
||||
foreach ($parents as $key => $current_user_id) {
|
||||
$current_user = Users::find($current_user_id);
|
||||
if (!$current_user) {
|
||||
continue;
|
||||
}
|
||||
self::checkUserRealNameReward($current_user);
|
||||
self::checkUpgradeAtelierCondition($current_user);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询用户的指定代数的上级(根据parents_path信息)
|
||||
*
|
||||
* @param App\Users $user 用户模型实例
|
||||
* @param integer $qty 要取的上级代数,不传或传null则取全部
|
||||
* @return array 返回包含上级id的数组
|
||||
*/
|
||||
public static function getParentsPathDesc($user, $qty = null)
|
||||
{
|
||||
$path = $user->parents_path;
|
||||
if ($path == null || empty($path)) {
|
||||
return [];
|
||||
}
|
||||
$parents = explode(',', $path);
|
||||
$parents = array_filter($parents);
|
||||
krsort($parents);
|
||||
$parents = array_slice($parents, 0, $qty);
|
||||
return $parents;
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归查询上级
|
||||
*
|
||||
* @param App\Users $user 用户模型实例
|
||||
* @return array
|
||||
*/
|
||||
public static function getRealParents($user)
|
||||
{
|
||||
$found_parent_node = [];
|
||||
$parents = self::findParent($user, $found_parent_node);
|
||||
return $parents;
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归查询上级(字符串)
|
||||
*
|
||||
* @param App\Users $user 用户模型实例
|
||||
* @return string 返回逗号间隔的path
|
||||
*/
|
||||
public static function getRealParentsPath($user)
|
||||
{
|
||||
$parents = self::getRealParents($user);
|
||||
if (count($parents) > 0) {
|
||||
return implode(',', $parents);
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
private static function findParent($user, &$found_parent_node)
|
||||
{
|
||||
$parent_id = $user->parent_id;
|
||||
|
||||
if ($parent_id) {
|
||||
//检测节点关系是否有死循环
|
||||
if (in_array($parent_id, $found_parent_node)) {
|
||||
$context = [
|
||||
'user_id' => $user->id,
|
||||
'parent_id' => $parent_id,
|
||||
'found_parent_node' => $found_parent_node,
|
||||
];
|
||||
//记录错误日志
|
||||
Log::useDailyFiles(base_path('storage/logs/user/'), 7);
|
||||
Log::critical('id:' . $user->id . '的用户,上级关系存在死循环', $context);
|
||||
return [];
|
||||
}
|
||||
array_unshift($found_parent_node, $parent_id);
|
||||
$parent = Users::find($parent_id);
|
||||
$result = self::findParent($parent, $found_parent_node);
|
||||
unset($parent);
|
||||
array_push($result, $parent_id);
|
||||
return $result;
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查用户是否符合对应级别的升级,若符合就升级(不降级)
|
||||
*
|
||||
* @param App\Users $user 要升级的用户模型实例
|
||||
* @param App\Users $from_user 触发者用户模型实例
|
||||
* @return void 无返回值
|
||||
*/
|
||||
public static function upgradeCheck($user)
|
||||
{
|
||||
$before_level = $user->level_id;
|
||||
$new_level = 2;
|
||||
if ($user->is_disable == 1) {
|
||||
$new_level = 1;
|
||||
} else if ($user->total_integral >= 1000000) {
|
||||
$new_level = 5;
|
||||
} else if ($user->total_topup >= 10000) {
|
||||
$new_level = 4;
|
||||
} else if ($user->total_topup >= 300) {
|
||||
$new_level = 3;
|
||||
}
|
||||
|
||||
//查询等级对应的id
|
||||
$level = Level::where('code', $new_level)->first();
|
||||
//不掉级处理
|
||||
if ($before_level < $new_level) {
|
||||
try {
|
||||
DB::transaction(function () use ($user, $level, $before_level, $new_level) {
|
||||
$user_upgrade_log = new UserUpgradeLog();
|
||||
$user_upgrade_log->user_id = $user->id;
|
||||
$user_upgrade_log->from_user_id = $user->id;
|
||||
$user_upgrade_log->before_level = $before_level;
|
||||
$user_upgrade_log->after_level = $new_level;
|
||||
$user_upgrade_log->memo = '用户等级变更:由[' . self::get_level_name($before_level) . ']升级到[' . self::get_level_name($new_level) . ']';
|
||||
$user_upgrade_log->created_time = time();
|
||||
$result = $user_upgrade_log->save();
|
||||
if (!$result) {
|
||||
throw new \Exception('记录用户升级日志失败');
|
||||
}
|
||||
$user->level_id = $level->id;
|
||||
$result = $user->save();
|
||||
if (!$result) {
|
||||
throw new \Exception('变更用户等级失败');
|
||||
}
|
||||
});
|
||||
} catch (\Exception $e) {
|
||||
echo '<pre>';
|
||||
echo '错误:' . $e->getMessage() . PHP_EOL . ',文件:' . $e->getFile() . PHP_EOL . '行号:' . $e->getLine();
|
||||
return;
|
||||
}
|
||||
// $parent = Users::find($user->parent_id);
|
||||
// if ($parent) {
|
||||
// self::upgradeCheck($parent, $user);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static function get_level_name($id = 2)
|
||||
{
|
||||
|
||||
$name = '';
|
||||
switch ($id) {
|
||||
case 1:
|
||||
$name = '限制会员';
|
||||
break;
|
||||
case 2:
|
||||
$name = '临时会员';
|
||||
break;
|
||||
case 3:
|
||||
$name = '正式会员';
|
||||
break;
|
||||
case 4:
|
||||
$name = '五星会员';
|
||||
break;
|
||||
case 5:
|
||||
$name = 'VIP会员';
|
||||
break;
|
||||
default:
|
||||
$name = '临时会员';
|
||||
}
|
||||
|
||||
return $name;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user