task basic

This commit is contained in:
xiaomlove
2024-05-18 14:53:30 +08:00
parent fc2aaf802b
commit 9ffd5d942a
11 changed files with 125 additions and 20 deletions

View File

@@ -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")),
])

View File

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

View File

@@ -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();

View File

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