用户每日活跃检测
This commit is contained in:
@ -4,6 +4,10 @@ namespace App\Models\Customer;
|
||||
|
||||
use App\Exceptions\ModelException;
|
||||
use App\Models\Base\CustomerBaseModel;
|
||||
use App\Models\WebSocket\CustomerWsHistoryModel;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class CustomerUserExtendModel extends CustomerBaseModel
|
||||
{
|
||||
@ -19,6 +23,8 @@ class CustomerUserExtendModel extends CustomerBaseModel
|
||||
'updated_at',
|
||||
];
|
||||
|
||||
const COL_IS_ACTIVE = 'is_active';
|
||||
|
||||
//是否活跃用户
|
||||
const IS_ACTIVE_YES = 1;
|
||||
const IS_ACTIVE_NO = 2;
|
||||
@ -69,4 +75,80 @@ class CustomerUserExtendModel extends CustomerBaseModel
|
||||
return $this->newQuery()->where('uid',$uid)->decrement('follow_num');
|
||||
}
|
||||
|
||||
//获取用户活跃信息
|
||||
function getUserActiveListLimit($nowUid, $limit = 500): \Illuminate\Database\Eloquent\Collection|array
|
||||
{
|
||||
return $this->newQuery()
|
||||
->where('id', '>=', $nowUid)
|
||||
->limit($limit)
|
||||
->orderBy('id')
|
||||
->get(['uid', 'is_active']);
|
||||
}
|
||||
|
||||
//检测所有用户活跃状态
|
||||
function updateUserActiveStatus($date = null): void
|
||||
{
|
||||
if(empty($date)) $date = Carbon::yesterday()->toDateString();
|
||||
|
||||
$oCustomerWsHistoryModel = new CustomerWsHistoryModel();
|
||||
$aActiveUserIdList = $oCustomerWsHistoryModel->getActiveUserIdList($date); //三日内活跃用户
|
||||
if(empty($aActiveUserIdList)) return;
|
||||
$oCustomerChangeInfoLogModel = new CustomerChangeInfoLogModel();
|
||||
|
||||
$nowUid = 0;
|
||||
while (true){
|
||||
try{
|
||||
Db::beginTransaction();
|
||||
$aUserList = $this->getUserActiveListLimit($nowUid, 500);
|
||||
if(empty($aUserList)) break;
|
||||
$nowUid = max($aUserList->pluck('uid')->toArray());
|
||||
|
||||
foreach ($aUserList as $oUser){
|
||||
$isChanged = false;
|
||||
$aLogInsert = [
|
||||
'type' => CustomerChangeInfoLogModel::TYPE_CHANG_USER_ACTIVE_STATUS,
|
||||
'uid' => $oUser->uid,
|
||||
'column' => self::COL_IS_ACTIVE,
|
||||
'before_value' => $oUser->is_active,
|
||||
'pid' => CustomerChangeInfoLogModel::PID_SYSTEM,
|
||||
];
|
||||
|
||||
if(in_array($oUser->uid, $aActiveUserIdList)){ //在活跃列表中
|
||||
if($oUser->is_active == self::IS_ACTIVE_YES) continue; //已经是活跃用户
|
||||
//变更用户状态
|
||||
$res = $this->newQuery()->where('uid',$oUser->uid)->update(['is_active'=>self::IS_ACTIVE_YES]);
|
||||
if($res) {
|
||||
$isChanged = true;
|
||||
$aLogInsert['value'] = self::IS_ACTIVE_YES;
|
||||
$aLogInsert['after_value'] = self::IS_ACTIVE_YES;
|
||||
$aLogInsert['remark_key'] = CustomerChangeInfoLogModel::REMARK_DAILY_CHECK_USER_ACTIVE_STATUS_YES;
|
||||
$aLogInsert['remark_desc'] = CustomerChangeInfoLogModel::REMARK[CustomerChangeInfoLogModel::REMARK_DAILY_CHECK_USER_ACTIVE_STATUS_YES];
|
||||
}
|
||||
}else{ //三日内不活跃
|
||||
if($oUser->is_active == self::IS_ACTIVE_NO) continue; //已经是不活跃用户
|
||||
//变更用户状态
|
||||
$res = $this->newQuery()->where('uid',$oUser->uid)->update(['is_active'=>self::IS_ACTIVE_NO]);
|
||||
if($res) {
|
||||
$isChanged = true;
|
||||
$aLogInsert['value'] = self::IS_ACTIVE_NO;
|
||||
$aLogInsert['after_value'] = self::IS_ACTIVE_NO;
|
||||
$aLogInsert['remark_key'] = CustomerChangeInfoLogModel::REMARK_DAILY_CHECK_USER_ACTIVE_STATUS_NO;
|
||||
$aLogInsert['remark_desc'] = CustomerChangeInfoLogModel::REMARK[CustomerChangeInfoLogModel::REMARK_DAILY_CHECK_USER_ACTIVE_STATUS_NO];
|
||||
}
|
||||
}
|
||||
|
||||
if($isChanged){ //有变化插入日志
|
||||
$oCustomerChangeInfoLogModel->addLog($aLogInsert);
|
||||
}
|
||||
|
||||
}
|
||||
Db::commit();
|
||||
}catch (\Exception $e){
|
||||
Log::error('updateUserActiveStatus error:'.$e->getMessage());
|
||||
Db::rollBack();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user