exam index seed time average think about all active torrent

This commit is contained in:
xiaomlove
2026-02-01 13:52:49 +07:00
parent f07e0a5013
commit a712a3f1e4
21 changed files with 51 additions and 11 deletions

View File

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

View File

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

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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' => '批量免罪',

View File

@@ -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' => '批量免罪',