mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-14 20:40:49 +08:00
task basic
This commit is contained in:
@@ -48,6 +48,22 @@ class ExamResource extends Resource
|
||||
->schema([
|
||||
Forms\Components\Section::make(__('label.exam.section_base_info'))->schema([
|
||||
Forms\Components\TextInput::make('name')->required()->columnSpan(['sm' => 2])->label(__('label.name')),
|
||||
Forms\Components\Select::make('type')
|
||||
->required()->columnSpan(['sm' => 2])
|
||||
->label(__('exam.type'))
|
||||
->options(Exam::listTypeOptions())
|
||||
->helperText(__('exam.type_help'))
|
||||
->reactive()
|
||||
,
|
||||
Forms\Components\TextInput::make('success_reward_bonus')
|
||||
->label(__('exam.success_reward_bonus'))
|
||||
->hidden(fn (\Closure $get) => $get('type') != Exam::TYPE_TASK)
|
||||
,
|
||||
Forms\Components\TextInput::make('fail_deduct_bonus')
|
||||
->label(__('exam.fail_deduct_bonus'))
|
||||
->hidden(fn (\Closure $get) => $get('type') != Exam::TYPE_TASK)
|
||||
,
|
||||
|
||||
Forms\Components\Repeater::make('indexes')->schema([
|
||||
Forms\Components\Select::make('index')
|
||||
->options(Exam::listIndex(true))
|
||||
@@ -124,6 +140,7 @@ class ExamResource extends Resource
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('id')->sortable(),
|
||||
Tables\Columns\TextColumn::make('name')->searchable()->label(__('label.name')),
|
||||
Tables\Columns\TextColumn::make('typeText')->label(__('exam.type')),
|
||||
Tables\Columns\TextColumn::make('indexFormatted')->label(__('label.exam.index_formatted'))->html(),
|
||||
Tables\Columns\TextColumn::make('begin')->label(__('label.begin')),
|
||||
Tables\Columns\TextColumn::make('end')->label(__('label.end')),
|
||||
@@ -136,6 +153,7 @@ class ExamResource extends Resource
|
||||
])
|
||||
->defaultSort('id', 'desc')
|
||||
->filters([
|
||||
Tables\Filters\SelectFilter::make('type')->options(Exam::listTypeOptions())->label(__("exam.type")),
|
||||
Tables\Filters\SelectFilter::make('is_discovered')->options(self::IS_DISCOVERED_OPTIONS)->label(__("label.exam.is_discovered")),
|
||||
Tables\Filters\SelectFilter::make('status')->options(self::getEnableDisableOptions())->label(__("label.status")),
|
||||
])
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Filament\Resources\User\UserResource\Pages;
|
||||
|
||||
use App\Filament\OptionsTrait;
|
||||
use App\Filament\Resources\User\UserResource;
|
||||
use App\Models\Exam;
|
||||
use App\Models\Invite;
|
||||
use App\Models\Medal;
|
||||
use App\Models\User;
|
||||
|
||||
@@ -11,7 +11,7 @@ class Exam extends NexusModel
|
||||
{
|
||||
protected $fillable = [
|
||||
'name', 'description', 'begin', 'end', 'duration', 'status', 'is_discovered', 'filters', 'indexes', 'priority',
|
||||
'recurring',
|
||||
'recurring', 'type', 'success_reward_bonus', 'fail_deduct_bonus'
|
||||
];
|
||||
|
||||
public $timestamps = true;
|
||||
@@ -69,6 +69,9 @@ class Exam extends NexusModel
|
||||
const RECURRING_WEEKLY = "Weekly";
|
||||
const RECURRING_MONTHLY = "Monthly";
|
||||
|
||||
const TYPE_EXAM = 1;
|
||||
const TYPE_TASK = 2;
|
||||
|
||||
protected static function booted()
|
||||
{
|
||||
static::saving(function (Model $model) {
|
||||
@@ -99,6 +102,21 @@ class Exam extends NexusModel
|
||||
self::RECURRING_MONTHLY => nexus_trans("exam.recurring_monthly"),
|
||||
];
|
||||
}
|
||||
|
||||
public static function listTypeOptions(): array
|
||||
{
|
||||
return [
|
||||
self::TYPE_EXAM => nexus_trans("exam.type_exam"),
|
||||
self::TYPE_TASK => nexus_trans("exam.type_task"),
|
||||
];
|
||||
}
|
||||
|
||||
public function getTypeTextAttribute()
|
||||
{
|
||||
return self::listTypeOptions()[$this->type] ?? "";
|
||||
}
|
||||
|
||||
|
||||
protected function getRecurringTextAttribute(): string
|
||||
{
|
||||
$options = self::listRecurringOptions();
|
||||
|
||||
@@ -241,7 +241,7 @@ class ExamRepository extends BaseRepository
|
||||
* @param null $excludeId
|
||||
* @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public function listValid($excludeId = null, $isDiscovered = null)
|
||||
public function listValid($excludeId = null, $isDiscovered = null, $type = null)
|
||||
{
|
||||
$now = Carbon::now();
|
||||
$query = Exam::query()
|
||||
@@ -255,6 +255,9 @@ class ExamRepository extends BaseRepository
|
||||
if (!is_null($isDiscovered)) {
|
||||
$query->where('is_discovered', $isDiscovered);
|
||||
}
|
||||
if (!is_null($type)) {
|
||||
$query->where("type", $type);
|
||||
}
|
||||
return $query->orderBy('priority', 'desc')->orderBy('id', 'asc')->get();
|
||||
}
|
||||
|
||||
@@ -266,19 +269,25 @@ class ExamRepository extends BaseRepository
|
||||
*/
|
||||
public function listMatchExam($uid)
|
||||
{
|
||||
$logPrefix = "uid: $uid";
|
||||
$exams = $this->listValid();
|
||||
if ($exams->isEmpty()) {
|
||||
do_log("$logPrefix, no valid exam.");
|
||||
return $exams;
|
||||
}
|
||||
$matched = $exams->filter(function (Exam $exam) use ($uid, $logPrefix) {
|
||||
return $this->isExamMatchUser($exam, $uid);
|
||||
});
|
||||
|
||||
return $matched;
|
||||
$exams = $this->listValid(null, null, Exam::TYPE_EXAM);
|
||||
return $this->filterForUser($exams, $uid);
|
||||
}
|
||||
|
||||
public function listMatchTask($uid)
|
||||
{
|
||||
$exams = $this->listValid(null, null, Exam::TYPE_TASK);
|
||||
return $this->filterForUser($exams, $uid);
|
||||
}
|
||||
|
||||
private function filterForUser(Collection $exams, $uid): Collection
|
||||
{
|
||||
$userInfo = User::query()->findOrFail($uid, User::$commonFields);
|
||||
return $exams->filter(function (Exam $exam) use ($userInfo) {
|
||||
return $this->isExamMatchUser($exam, $userInfo);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private function isExamMatchUser(Exam $exam, $user): bool
|
||||
{
|
||||
if (!$user instanceof User) {
|
||||
@@ -917,7 +926,7 @@ class ExamRepository extends BaseRepository
|
||||
|
||||
public function cronjonAssign()
|
||||
{
|
||||
$exams = $this->listValid(null, Exam::DISCOVERED_YES);
|
||||
$exams = $this->listValid(null, Exam::DISCOVERED_YES, Exam::TYPE_EXAM);
|
||||
if ($exams->isEmpty()) {
|
||||
do_log("No valid and discovered exam.");
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user