From 8e649ffafbc68c9b85839b00ce7142c539528d1d Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Wed, 15 Nov 2023 02:19:03 +0800 Subject: [PATCH] exam add user filter: register_days_range --- app/Console/Commands/Test.php | 5 +- .../Resources/System/ExamResource.php | 2 + app/Models/Exam.php | 15 ++++++ app/Repositories/ExamRepository.php | 50 +++++++++++++++++++ include/constants.php | 2 +- resources/lang/en/exam.php | 1 + resources/lang/en/label.php | 4 ++ resources/lang/zh_CN/exam.php | 1 + resources/lang/zh_CN/label.php | 4 ++ resources/lang/zh_TW/exam.php | 1 + resources/lang/zh_TW/label.php | 4 ++ 11 files changed, 86 insertions(+), 3 deletions(-) diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php index 20df6081..09ea04e6 100644 --- a/app/Console/Commands/Test.php +++ b/app/Console/Commands/Test.php @@ -98,8 +98,9 @@ class Test extends Command */ public function handle() { - CleanupRepository::recordBatch(NexusDB::redis(), "1", "5"); - CleanupRepository::runBatchJobCalculateUserSeedBonus("bbbbb"); + $str = "2023-11-14 02:59:00"; + $diff = Carbon::parse($str)->diffInDays(now()); + dd($diff); } } diff --git a/app/Filament/Resources/System/ExamResource.php b/app/Filament/Resources/System/ExamResource.php index 3f0bc949..2ce072a3 100644 --- a/app/Filament/Resources/System/ExamResource.php +++ b/app/Filament/Resources/System/ExamResource.php @@ -100,6 +100,8 @@ class ExamResource extends Resource ->label(__('label.user.class')), Forms\Components\DateTimePicker::make('filters.register_time_range.0')->label(__("label.exam.register_time_range.begin")), Forms\Components\DateTimePicker::make('filters.register_time_range.1')->label(__("label.exam.register_time_range.end")), + Forms\Components\TextInput::make('filters.register_days_range.0')->numeric()->label(__("label.exam.register_days_range.begin")), + Forms\Components\TextInput::make('filters.register_days_range.1')->numeric()->label(__("label.exam.register_days_range.end")), Forms\Components\CheckboxList::make('filters.donate_status') ->options(self::$yesOrNo) ->label(__('label.exam.donated')), diff --git a/app/Models/Exam.php b/app/Models/Exam.php index d8fe5f44..b2cd12ca 100644 --- a/app/Models/Exam.php +++ b/app/Models/Exam.php @@ -51,11 +51,13 @@ class Exam extends NexusModel const FILTER_USER_CLASS = 'classes'; const FILTER_USER_REGISTER_TIME_RANGE = 'register_time_range'; const FILTER_USER_DONATE = 'donate_status'; + const FILTER_USER_REGISTER_DAYS_RANGE = 'register_days_range'; public static $filters = [ self::FILTER_USER_CLASS => ['name' => 'User class'], self::FILTER_USER_REGISTER_TIME_RANGE => ['name' => 'User register time range'], self::FILTER_USER_DONATE => ['name' => 'User donated'], + self::FILTER_USER_REGISTER_DAYS_RANGE => ['name' => 'User register days range'], ]; protected static function booted() @@ -138,6 +140,19 @@ class Exam extends NexusModel } } + $filter = self::FILTER_USER_REGISTER_DAYS_RANGE; + if (!empty($currentFilters[$filter])) { + $range = $currentFilters[$filter]; + if (!empty($range[0]) || !empty($range[1])) { + $arr[] = sprintf( + "%s: %s ~ %s", + nexus_trans("exam.filters.$filter"), + $range[0] ?? "--", + $range[1] ?? '--' + ); + } + } + $filter = self::FILTER_USER_DONATE; if (!empty($currentFilters[$filter])) { $donateStatus = collect(User::$donateStatus)->only($currentFilters[$filter]); diff --git a/app/Repositories/ExamRepository.php b/app/Repositories/ExamRepository.php index 4b7d5d8a..df5894b2 100644 --- a/app/Repositories/ExamRepository.php +++ b/app/Repositories/ExamRepository.php @@ -151,6 +151,30 @@ class ExamRepository extends BaseRepository throw new \InvalidArgumentException("Invalid user register time end: $end"); } } + if ($begin && $end && $begin > $end) { + throw new \InvalidArgumentException("user register time begin must less than end"); + } + + $filter = Exam::FILTER_USER_REGISTER_DAYS_RANGE; + $begin = $filters[$filter][0] ?? null; + $end = $filters[$filter][1] ?? null; + if ($begin) { + if (is_numeric($begin) && $begin >= 0) { + $hasValid = true; + } else { + throw new \InvalidArgumentException("Invalid user register days begin: $begin" ); + } + } + if ($end) { + if (is_numeric($end) && $end >= 0) { + $hasValid = true; + } else { + throw new \InvalidArgumentException("Invalid user register days end: $end"); + } + } + if ($begin && $end && $begin > $end) { + throw new \InvalidArgumentException("user register days begin must less than end"); + } if (!$hasValid) { throw new \InvalidArgumentException("No valid filters"); @@ -276,6 +300,20 @@ class ExamRepository extends BaseRepository return false; } + $filter = Exam::FILTER_USER_REGISTER_DAYS_RANGE; + $filterValues = $filters[$filter] ?? []; + $value = $user->added->diffInDays(now()); + $begin = $filterValues[0] ?? null; + $end = $filterValues[1] ?? null; + if ($begin !== null && $value < $begin) { + do_log("$logPrefix, user registerDays: $value not bigger than begin: " . $begin); + return false; + } + if ($end !== null && $value > $end) { + do_log("$logPrefix, user registerDays: $value not less than end: " . $end); + return false; + } + return true; } @@ -953,6 +991,18 @@ class ExamRepository extends BaseRepository $baseQuery->where("$userTable.added", '<=', Carbon::parse($range[1])->toDateTimeString()); } } + + $filter = Exam::FILTER_USER_REGISTER_DAYS_RANGE; + $range = $filters[$filter] ?? []; + if (!empty($range)) { + if (!empty($range[0])) { + $baseQuery->where("$userTable.added", "<=", now()->subDays($range[0])->toDateTimeString()); + } + if (!empty($range[1])) { + $baseQuery->where("$userTable.added", '>=', now()->subDays($range[1])->toDateTimeString()); + } + } + //Does not has this exam $baseQuery->whereDoesntHave('exams', function (Builder $query) use ($exam) { $query->where('exam_id', $exam->id); diff --git a/include/constants.php b/include/constants.php index debac99b..79698ab7 100644 --- a/include/constants.php +++ b/include/constants.php @@ -1,6 +1,6 @@ 'User class', \App\Models\Exam::FILTER_USER_REGISTER_TIME_RANGE => 'Register time range', \App\Models\Exam::FILTER_USER_DONATE => 'Donated', + \App\Models\Exam::FILTER_USER_REGISTER_DAYS_RANGE => 'Range of days of registration', ], 'require_value' => 'Require', 'current_value' => 'Current', diff --git a/resources/lang/en/label.php b/resources/lang/en/label.php index 4cf1bc97..273b2a4d 100644 --- a/resources/lang/en/label.php +++ b/resources/lang/en/label.php @@ -148,6 +148,10 @@ return [ 'begin' => 'Register time begin', 'end' => 'Register time end', ], + 'register_days_range' => [ + 'begin' => 'Minimum days registered', + 'end' => 'Maximum days registered', + ], 'donated' => 'Donated', 'index_formatted' => 'Exam indexes', 'filter_formatted' => 'Target users', diff --git a/resources/lang/zh_CN/exam.php b/resources/lang/zh_CN/exam.php index c68cd005..caefe846 100644 --- a/resources/lang/zh_CN/exam.php +++ b/resources/lang/zh_CN/exam.php @@ -15,6 +15,7 @@ return [ \App\Models\Exam::FILTER_USER_CLASS => '用户等级', \App\Models\Exam::FILTER_USER_REGISTER_TIME_RANGE => '注册时间范围', \App\Models\Exam::FILTER_USER_DONATE => '是否捐赠', + \App\Models\Exam::FILTER_USER_REGISTER_DAYS_RANGE => '注册天数范围', ], 'require_value' => '要求', 'current_value' => '当前', diff --git a/resources/lang/zh_CN/label.php b/resources/lang/zh_CN/label.php index 370b0998..30fc0381 100644 --- a/resources/lang/zh_CN/label.php +++ b/resources/lang/zh_CN/label.php @@ -150,6 +150,10 @@ return [ 'begin' => '注册时间开始', 'end' => '注册时间结束', ], + 'register_days_range' => [ + 'begin' => '注册天数最少', + 'end' => '注册天数最多', + ], 'donated' => '是否捐赠', 'index_formatted' => '考核指标', 'filter_formatted' => '目标用户', diff --git a/resources/lang/zh_TW/exam.php b/resources/lang/zh_TW/exam.php index d552b442..02d8aae0 100644 --- a/resources/lang/zh_TW/exam.php +++ b/resources/lang/zh_TW/exam.php @@ -15,6 +15,7 @@ return [ \App\Models\Exam::FILTER_USER_CLASS => '用戶等級', \App\Models\Exam::FILTER_USER_REGISTER_TIME_RANGE => '註冊時間範圍', \App\Models\Exam::FILTER_USER_DONATE => '是否捐贈', + \App\Models\Exam::FILTER_USER_REGISTER_DAYS_RANGE => '註冊天數範圍', ], 'require_value' => '要求', 'current_value' => '當前', diff --git a/resources/lang/zh_TW/label.php b/resources/lang/zh_TW/label.php index 0ef19274..258b87d1 100644 --- a/resources/lang/zh_TW/label.php +++ b/resources/lang/zh_TW/label.php @@ -148,6 +148,10 @@ return [ 'begin' => '註冊時間開始', 'end' => '註冊時間結束', ], + 'register_days_range' => [ + 'begin' => '註冊天數最少', + 'end' => '註冊天數最多', + ], 'donated' => '是否捐贈', 'index_formatted' => '考核指標', 'filter_formatted' => '目標用戶',