medal add bonus addition duration

This commit is contained in:
xiaomlove
2025-07-14 21:03:09 +07:00
parent b81cf0c1c6
commit 3ffdec1f4a
11 changed files with 78 additions and 17 deletions
@@ -75,6 +75,14 @@ class MedalResource extends Resource
->label(__('medal.fields.bonus_addition_factor'))
->helperText(__('medal.fields.bonus_addition_factor_help'))
->numeric()
->minValue(0)
->default(0)
,
Forms\Components\TextInput::make('bonus_addition_duration')
->label(__('medal.fields.bonus_addition_duration'))
->helperText(__('medal.fields.bonus_addition_duration_help'))
->numeric()
->minValue(0)
->default(0)
,
Forms\Components\TextInput::make('gift_fee_factor')
@@ -109,6 +117,7 @@ class MedalResource extends Resource
->formatStateUsing(fn ($record) => new HtmlString(sprintf('%s ~<br/>%s', $record->sale_begin_time ?? nexus_trans('nexus.no_limit'), $record->sale_end_time ?? nexus_trans('nexus.no_limit'))))
,
Tables\Columns\TextColumn::make('bonus_addition_factor')->label(__('medal.fields.bonus_addition_factor')),
Tables\Columns\TextColumn::make('bonus_addition_duration')->label(__('medal.fields.bonus_addition_duration')),
Tables\Columns\TextColumn::make('gift_fee_factor')->label(__('medal.fields.gift_fee_factor')),
Tables\Columns\TextColumn::make('price')->label(__('label.price'))->formatStateUsing(fn ($state) => number_format($state)),
+1 -1
View File
@@ -18,7 +18,7 @@ class Medal extends NexusModel
protected $fillable = [
'name', 'description', 'image_large', 'image_small', 'price', 'duration', 'get_type',
'display_on_medal_page', 'sale_begin_time', 'sale_end_time', 'inventory', 'bonus_addition_factor',
'gift_fee_factor', 'priority'
'gift_fee_factor', 'priority', 'bonus_addition_duration'
];
public $timestamps = true;
+1 -1
View File
@@ -4,7 +4,7 @@ namespace App\Models;
class UserMedal extends NexusModel
{
protected $fillable = ['uid', 'medal_id', 'expire_at', 'status'];
protected $fillable = ['uid', 'medal_id', 'expire_at', 'status', 'bonus_addition_expire_at'];
const STATUS_NOT_WEARING = 0;
const STATUS_WEARING = 1;
+2 -5
View File
@@ -70,11 +70,8 @@ class BonusRepository extends BaseRepository
], $user->locale);
do_log("comment: $comment");
$this->consumeUserBonus($user, $requireBonus, BonusLogs::BUSINESS_TYPE_BUY_MEDAL, "$comment(medal ID: {$medal->id})");
$expireAt = null;
if ($medal->duration > 0) {
$expireAt = Carbon::now()->addDays((int)$medal->duration)->toDateTimeString();
}
$user->medals()->attach([$medal->id => ['expire_at' => $expireAt, 'status' => UserMedal::STATUS_NOT_WEARING]]);
$medalRep = new MedalRepository();
$medalRep->userAttachMedal($user, $medal);
if ($medal->inventory !== null) {
$affectedRows = NexusDB::table('medals')
->where('id', $medal->id)
+19 -4
View File
@@ -68,12 +68,27 @@ class MedalRepository extends BaseRepository
if ($exists) {
throw new \LogicException("user: $uid already own this medal: $medalId.");
}
$this->userAttachMedal($user, $medal);
}
public function userAttachMedal(User $user, Medal $medal): void
{
$expireAt = null;
if ($duration > 0) {
$expireAt = Carbon::now()->addDays(intval($duration))->toDateTimeString();
$bonusAdditionExpireAt = null;
if ($medal->duration > 0) {
$expireAt = Carbon::now()->addDays((int)$medal->duration)->toDateTimeString();
}
clear_user_cache($uid);
return $user->medals()->attach([$medal->id => ['expire_at' => $expireAt, 'status' => UserMedal::STATUS_NOT_WEARING]]);
if ($medal->bonus_addition_duration > 0) {
$bonusAdditionExpireAt = Carbon::now()->addDays((int)$medal->bonus_addition_duration)->toDateTimeString();
}
$user->medals()->attach([
$medal->id => [
'expire_at' => $expireAt,
'bonus_addition_expire_at' => $bonusAdditionExpireAt,
'status' => UserMedal::STATUS_NOT_WEARING,
]
]);
clear_user_cache($user->id);
}
public function toggleUserMedalStatus($id, $userId)
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('medals', function (Blueprint $table) {
$table->integer('bonus_addition_duration')->default(0)->after('bonus_addition_factor')->comment('魔力加成有效天数,0 永久有效');
});
Schema::table('user_medals', function (Blueprint $table) {
$table->dateTime('bonus_addition_expire_at')->nullable()->after('expire_at')->comment('魔力加成过期时间,null 永不过期');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('medals', function (Blueprint $table) {
$table->dropColumn('bonus_addition_duration');
});
Schema::table('user_medals', function (Blueprint $table) {
$table->dropColumn('bonus_addition_expire_at');
});
}
};
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
defined('VERSION_NUMBER') || define('VERSION_NUMBER', '1.9.7');
defined('RELEASE_DATE') || define('RELEASE_DATE', '2025-07-13');
defined('RELEASE_DATE') || define('RELEASE_DATE', '2025-07-14');
defined('IN_TRACKER') || define('IN_TRACKER', false);
defined('PROJECTNAME') || define("PROJECTNAME","NexusPHP");
defined('NEXUSPHPURL') || define("NEXUSPHPURL","https://nexusphp.org");
+5 -5
View File
@@ -6035,7 +6035,7 @@ function calculate_seed_bonus($uid, $torrentIdArr = null): array
$officialAdditionalFactor = \App\Models\Setting::get('bonus.official_addition');
$zeroBonusTag = \App\Models\Setting::get('bonus.zero_bonus_tag');
$zeroBonusFactor = \App\Models\Setting::get('bonus.zero_bonus_factor');
$userMedalResult = \Nexus\Database\NexusDB::select("select sum(bonus_addition_factor) as factor from medals where id in (select medal_id from user_medals where uid = $uid and (expire_at is null or expire_at > '$nowStr'))");
$userMedalResult = \Nexus\Database\NexusDB::select("select sum(bonus_addition_factor) as factor from medals where id in (select medal_id from user_medals where uid = $uid and (expire_at is null or expire_at > '$nowStr') and (bonus_addition_expire_at is null or bonus_addition_expire_at > '$nowStr'))");
$medalAdditionalFactor = floatval($userMedalResult[0]['factor'] ?? 0);
do_log("$logPrefix, sql: $sql, count: " . count($torrentResult) . ", officialTag: $officialTag, officialAdditionalFactor: $officialAdditionalFactor, zeroBonusTag: $zeroBonusTag, zeroBonusFactor: $zeroBonusFactor, medalAdditionalFactor: $medalAdditionalFactor");
$last_action = "";
@@ -6350,7 +6350,7 @@ function build_bonus_table(array $user, array $bonusResult = [], array $options
$baseBonusFactor,
number_format($baseBonus,3),
$rowSpan,
$totalBonus
number_format($totalBonus, 3)
);
if ($hasMedalAddition) {
$table .= sprintf(
@@ -6360,7 +6360,7 @@ function build_bonus_table(array $user, array $bonusResult = [], array $options
mksize($bonusResult['size']),
number_format($bonusResult['A'], 3),
number_format($bonusResult['medal_bonus'], 3),
$bonusResult['medal_additional_factor'],
number_format($bonusResult['medal_additional_factor'], 3),
number_format($bonusResult['medal_bonus'] * $bonusResult['medal_additional_factor'], 3)
);
}
@@ -6373,7 +6373,7 @@ function build_bonus_table(array $user, array $bonusResult = [], array $options
mksize($bonusResult['official_size']),
number_format($bonusResult['official_a'], 3),
number_format($bonusResult['official_bonus'], 3),
$officialAdditionalFactor,
number_format($officialAdditionalFactor, 3),
number_format($bonusResult['official_bonus'] * $officialAdditionalFactor, 3)
);
}
@@ -6386,7 +6386,7 @@ function build_bonus_table(array $user, array $bonusResult = [], array $options
'--',
'--',
number_format($haremAddition, 3),
$haremFactor,
number_format($haremFactor, 3),
number_format($haremAddition * $haremFactor, 3)
);
}
+2
View File
@@ -32,6 +32,8 @@ return [
'gift_fee_factor' => 'Gift fee factor',
'gift_fee' => 'Gift fee',
'gift_fee_factor_help' => 'The additional fee charged for gifts to other users is equal to the price multiplied by this factor',
'bonus_addition_duration' => 'Bonus addition duration',
'bonus_addition_duration_help' => 'Unit: days. Set to 0 for permanent effect. Counts from the time of acquisition, regardless of whether it is equipped or not',
],
'buy_already' => 'Already buy',
'buy_btn' => 'Buy',
+2
View File
@@ -32,6 +32,8 @@ return [
'gift_fee_factor' => '赠送手续费系数',
'gift_fee' => '手续费',
'gift_fee_factor_help' => '赠送给其他用户时额外收取手续费等于价格乘以此系数',
'bonus_addition_duration' => '魔力加成有效时长',
'bonus_addition_duration_help' => '单位:天,设置为 0 表示永久有效。从获得时开始算,无论是否佩戴',
],
'buy_already' => '已经购买',
'buy_btn' => '购买',
+2
View File
@@ -32,6 +32,8 @@ return [
'gift_fee_factor' => '贈送手續費系數',
'gift_fee' => '手續費',
'gift_fee_factor_help' => '贈送給其他用戶時額外收取手續費等於價格乘以此系數',
'bonus_addition_duration' => '魔力加成有效時長',
'bonus_addition_duration_help' => '單位:天,設置爲 0 表示永久有效。從獲得時開始算,無論是否佩戴',
],
'buy_already' => '已經購買',
'buy_btn' => '購買',