From a712a3f1e45e30291ef8312ff138aca1965b21e5 Mon Sep 17 00:00:00 2001 From: xiaomlove <1939737565@qq.com> Date: Sun, 1 Feb 2026 13:52:49 +0700 Subject: [PATCH] exam index seed time average think about all active torrent --- app/Models/Exam.php | 1 + app/Repositories/ExamRepository.php | 42 +++++++++++++++++++++-------- resources/lang/cs/admin.php | 1 + resources/lang/da/admin.php | 1 + resources/lang/de/admin.php | 1 + resources/lang/el/admin.php | 1 + resources/lang/en/admin.php | 1 + resources/lang/es/admin.php | 1 + resources/lang/fi/admin.php | 1 + resources/lang/fr/admin.php | 1 + resources/lang/it/admin.php | 1 + resources/lang/ja/admin.php | 1 + resources/lang/nb/admin.php | 1 + resources/lang/nl/admin.php | 1 + resources/lang/pl/admin.php | 1 + resources/lang/pt/admin.php | 1 + resources/lang/ro/admin.php | 1 + resources/lang/ru/admin.php | 1 + resources/lang/sv/admin.php | 1 + resources/lang/zh_CN/admin.php | 1 + resources/lang/zh_TW/admin.php | 1 + 21 files changed, 51 insertions(+), 11 deletions(-) diff --git a/app/Models/Exam.php b/app/Models/Exam.php index 01e9c04d..f1e79814 100644 --- a/app/Models/Exam.php +++ b/app/Models/Exam.php @@ -235,6 +235,7 @@ class Exam extends NexusModel public function getRecurringBegin(Carbon $time): Carbon { + $time = $time->copy(); $recurring = $this->recurring; if ($recurring == self::RECURRING_WEEKLY) { return $time->startOfWeek(); diff --git a/app/Repositories/ExamRepository.php b/app/Repositories/ExamRepository.php index efb0c5dc..8d789b83 100644 --- a/app/Repositories/ExamRepository.php +++ b/app/Repositories/ExamRepository.php @@ -31,8 +31,8 @@ class ExamRepository extends BaseRepository public function store(array $params) { - $this->checkIndexes($params); - $this->checkBeginEnd($params); + $diffInHours = $this->checkBeginEnd($params); + $this->checkIndexes($params, $diffInHours); $this->checkFilters($params); /** * does not limit this @@ -48,8 +48,8 @@ class ExamRepository extends BaseRepository public function update(array $params, $id) { - $this->checkIndexes($params); - $this->checkBeginEnd($params); + $diffInHours = $this->checkBeginEnd($params); + $this->checkIndexes($params, $diffInHours); $this->checkFilters($params); /** * does not limit this @@ -76,7 +76,7 @@ class ExamRepository extends BaseRepository return $params; } - private function checkIndexes(array $params): bool + private function checkIndexes(array $params, float $examDuration): bool { if (empty($params['indexes'])) { throw new \InvalidArgumentException("Require index."); @@ -94,6 +94,14 @@ class ExamRepository extends BaseRepository 'Invalid require value for index: %s.', $index['index'] )); } + if ($index['index'] == Exam::INDEX_SEED_TIME_AVERAGE) { + if ($index['require_value'] > $examDuration) { + throw new \InvalidArgumentException(nexus_trans( + 'admin.resources.exam.index_seed_time_average_require_value_invalid', + ['index_seed_time_average_require_value' => $index['require_value'], 'duration' => $examDuration] + )); + } + } $validIndex[$index['index']] = $index; } if (empty($validIndex)) { @@ -102,28 +110,40 @@ class ExamRepository extends BaseRepository return true; } - private function checkBeginEnd(array $params): bool + /** + * check if begin/end valid, if yes, return diff in hours, else throw InvalidArgumentException + * @param array $params + * @return float + */ + private function checkBeginEnd(array $params): float { if ( !empty($params['begin']) && !empty($params['end']) && empty($params['duration']) && empty($params['recurring']) ) { - return true; + $begin = Carbon::parse($params['begin']); + $end = Carbon::parse($params['end']); + return round($begin->diffInHours($end, true)); } if ( empty($params['begin']) && empty($params['end']) && isset($params['duration']) && ctype_digit((string)$params['duration']) && $params['duration'] > 0 && empty($params['recurring']) ) { - return true; + //unit: day + return round(floatval($params['duration']) * 24); } if ( empty($params['begin']) && empty($params['end']) && empty($params['duration']) && !empty($params['recurring']) ) { - return true; + $exam = new Exam(['recurring' => $params['recurring']]); + $now = Carbon::now(); + $begin = $exam->getRecurringBegin($now); + $end = $exam->getRecurringEnd($now); + return round($begin->diffInHours($end, true)); } throw new \InvalidArgumentException(nexus_trans("exam.time_condition_invalid")); @@ -672,8 +692,8 @@ class ExamRepository extends BaseRepository if ($index['index'] == Exam::INDEX_SEED_TIME_AVERAGE) { $torrentCountsRes = Snatch::query() ->where('userid', $user->id) - ->where('completedat', '>=', $begin) - ->where('completedat', '<=', $end) + ->where('last_action', '>=', $begin) + ->where('last_action', '<=', $end) ->selectRaw("count(distinct(torrentid)) as counts") ->first(); do_log("special index: {$index['index']}, get torrent count by: " . last_query()); diff --git a/resources/lang/cs/admin.php b/resources/lang/cs/admin.php index d1df04c3..5210ee79 100644 --- a/resources/lang/cs/admin.php +++ b/resources/lang/cs/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::index duplicitní!', + 'index_seed_time_average_require_value_invalid' => 'Požadovaný průměrný čas distribuce :index_seed_time_average_require_value je větší než celková doba trvání zkoušky :duration. Prosím změňte jej!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/da/admin.php b/resources/lang/da/admin.php index b8103be6..94e9bb93 100644 --- a/resources/lang/da/admin.php +++ b/resources/lang/da/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Indeks::index dublet!', + 'index_seed_time_average_require_value_invalid' => 'Den krævede gennemsnitlige seeding tid :index_seed_time_average_require_value er større end den samlede eksamen varighed :duration. Rediger den!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/de/admin.php b/resources/lang/de/admin.php index a8365751..f27372b2 100644 --- a/resources/lang/de/admin.php +++ b/resources/lang/de/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::Index duplizieren !', + 'index_seed_time_average_require_value_invalid' => 'Die erforderliche durchschnittliche Verteilungszeit :index_seed_time_durchschnitage_require_value ist größer als die Gesamtprüfungsdauer :Dauer. Bitte ändern!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/el/admin.php b/resources/lang/el/admin.php index a25dc1bf..c95b953f 100644 --- a/resources/lang/el/admin.php +++ b/resources/lang/el/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::index duplicate !', + 'index_seed_time_average_require_value_invalid' => 'Ο απαιτούμενος μέσος χρόνος σποράς :index_seed_time_average_require_value είναι μεγαλύτερος από τη συνολική διάρκεια εξετάσεων :duration. Παρακαλώ τροποποιήστε το!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index 3a9f951f..f97b4747 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::index duplicate !', + 'index_seed_time_average_require_value_invalid' => 'The required average seeding time :index_seed_time_average_require_value is greater than the total exam duration :duration. Please modify it!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/es/admin.php b/resources/lang/es/admin.php index 92838dfb..6f2969a3 100644 --- a/resources/lang/es/admin.php +++ b/resources/lang/es/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Índice::índice duplicado!', + 'index_seed_time_average_require_value_invalid' => 'El tiempo de semilla requerido :index_seed_time_average_require_value es mayor que el tiempo total del examen :duración. ¡Por favor, modifícalo!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/fi/admin.php b/resources/lang/fi/admin.php index 68438c66..e49eac5b 100644 --- a/resources/lang/fi/admin.php +++ b/resources/lang/fi/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Indeksi::index kopioi !', + 'index_seed_time_average_require_value_invalid' => 'Vaadittu keskimääräinen lähetysaika :index_seed_time_average_require_value on suurempi kuin kokonaistentin kesto :duration. Muokkaa sitä!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/fr/admin.php b/resources/lang/fr/admin.php index 0f0d4d42..61213859 100644 --- a/resources/lang/fr/admin.php +++ b/resources/lang/fr/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::index dupliqué !', + 'index_seed_time_average_require_value_invalid' => 'Le temps moyen requis pour le seeding :index_seed_time_average_require_value est supérieur à la durée totale de l\'examen :duration. Veuillez le modifier !' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/it/admin.php b/resources/lang/it/admin.php index d3c6ac41..316c4559 100644 --- a/resources/lang/it/admin.php +++ b/resources/lang/it/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Indice::index duplicato !', + 'index_seed_time_average_require_value_invalid' => 'Il tempo medio richiesto di seeding :index_seed_time_average_require_value è maggiore della durata totale dell\'esame :duration. Modificalo!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/ja/admin.php b/resources/lang/ja/admin.php index a30db75c..d8fdb5a6 100644 --- a/resources/lang/ja/admin.php +++ b/resources/lang/ja/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'インデックス::index duplication!', + 'index_seed_time_average_require_value_invalid' => '必要なシード時間 :index_seed_time_average_require_value は、合計試験時間 :durationよりも大きいです。変更してください!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/nb/admin.php b/resources/lang/nb/admin.php index 35838250..d4755708 100644 --- a/resources/lang/nb/admin.php +++ b/resources/lang/nb/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Indeks::index duplisert !', + 'index_seed_time_average_require_value_invalid' => 'Gjennomsnittlig gjennomsnittlig tid for seeding :index_seed_time_average_require_value er større enn total eksamens varighet :duration. Endre den!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/nl/admin.php b/resources/lang/nl/admin.php index 544f8eca..96ff208b 100644 --- a/resources/lang/nl/admin.php +++ b/resources/lang/nl/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::index duplicaat!', + 'index_seed_time_average_require_value_invalid' => 'De vereiste gemiddelde seeding tijd :index_seed_time_average_require_value is groter dan de totale examenduur :duur. Wijzig deze!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/pl/admin.php b/resources/lang/pl/admin.php index 8385645f..b50dbf42 100644 --- a/resources/lang/pl/admin.php +++ b/resources/lang/pl/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Indeks::index duplikat!', + 'index_seed_time_average_require_value_invalid' => 'Wymagany średni czas seedowania :index_seed_time_average_require_value jest większy niż całkowity czas trwania egzaminu :duration. Zmodyfikuj go!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/pt/admin.php b/resources/lang/pt/admin.php index 8a4fad98..45b55e60 100644 --- a/resources/lang/pt/admin.php +++ b/resources/lang/pt/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Índice::index duplicado!', + 'index_seed_time_average_require_value_invalid' => 'O tempo médio de semeamento necessário :index_seed_time_average_require_value é maior do que a duração total do exame :duration. Por favor, modifique!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/ro/admin.php b/resources/lang/ro/admin.php index e26fe664..7e334aea 100644 --- a/resources/lang/ro/admin.php +++ b/resources/lang/ro/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::index duplicat!', + 'index_seed_time_average_require_value_invalid' => 'Timpul mediu necesar pentru seeding :index_seed_time_average_require_value este mai mare decât durata totală de exam :duration. Vă rugăm să o modificați!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/ru/admin.php b/resources/lang/ru/admin.php index e3f88f21..89dea464 100644 --- a/resources/lang/ru/admin.php +++ b/resources/lang/ru/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Индекс::index дубликат !', + 'index_seed_time_average_require_value_invalid' => 'Требуемое среднее время раздачи :index_seed_time_average_require_value больше, чем общая продолжительность экзамена :duration. Пожалуйста, измените его!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/sv/admin.php b/resources/lang/sv/admin.php index 964a72b4..9a35591e 100644 --- a/resources/lang/sv/admin.php +++ b/resources/lang/sv/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => 'Index::index dubblett!', + 'index_seed_time_average_require_value_invalid' => 'Den nödvändiga genomsnittliga såddtiden :index_seed_time_average_require_value är större än den totala testtiden :duration. Vänligen ändra det!' ], 'hit_and_run' => [ 'bulk_action_pardon' => 'Bulk pardon', diff --git a/resources/lang/zh_CN/admin.php b/resources/lang/zh_CN/admin.php index 3616c5d2..da8c2f77 100644 --- a/resources/lang/zh_CN/admin.php +++ b/resources/lang/zh_CN/admin.php @@ -108,6 +108,7 @@ return [ ], 'exam' => [ 'index_duplicate' => '指标::index 重复!', + 'index_seed_time_average_require_value_invalid' => '指标平均做种时间的要求量::index_seed_time_average_require_value 大于整个考核时长::duration,请修改!' ], 'hit_and_run' => [ 'bulk_action_pardon' => '批量免罪', diff --git a/resources/lang/zh_TW/admin.php b/resources/lang/zh_TW/admin.php index 1367941e..b22ff3e2 100644 --- a/resources/lang/zh_TW/admin.php +++ b/resources/lang/zh_TW/admin.php @@ -110,6 +110,7 @@ return [ ], 'exam' => [ 'index_duplicate' => '指標::index 重復!', + 'index_seed_time_average_require_value_invalid' => '指標平均做種時間的要求量::index_seed_time_average_require_value 大於整個考核時長::duration,請修改!' ], 'hit_and_run' => [ 'bulk_action_pardon' => '批量免罪',