feat: 新增命令和迁移以优化抽奖数据管理

- 新增 `LotteryDevPruneDrawBacklogCommand` 命令,用于按营业日区间删除积压的抽奖期号,并支持干运行和级联删除相关数据。
- 添加多个迁移文件以同步数据库结构,包括重命名重复的迁移文件、添加用户名字段、迁移抽奖状态到领域字典、合并显示名称字段、扩展审计日志目标类型字段,以及细化后台权限管理。
- 更新 `AdminRbacAndUserSeeder` 以包含角色代码字段,确保一致性与可维护性。
This commit is contained in:
2026-05-25 15:33:33 +08:00
parent e27a00f260
commit 6a8cdbe3b8
9 changed files with 258 additions and 4 deletions

View File

@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
/**
* 将历史上重复时间戳的 migration 文件名同步到 migrations 表,避免重命名后被视为未执行。
*
* 新装库UPDATE 命中 0 行,无影响。
* 已有库:把旧文件名改为新文件名,与重命名后的 PHP 文件一致。
*
* 若从旧文件名升级且 `php artisan migrate` 报「列已存在」等重复执行错误,请先单独执行本文件再全量 migrate
* php artisan migrate --path=database/migrations/2026_05_09_119999_rename_duplicate_migration_filenames_in_table.php
* php artisan migrate
*/
return new class extends Migration
{
/** @var array<string, string> */
private const RENAMES = [
'2026_05_09_120000_add_username_and_nullable_email_to_admin_users' => '2026_05_09_120001_add_username_and_nullable_email_to_admin_users',
'2026_05_09_120000_migrate_draw_status_to_domain_dict' => '2026_05_09_120002_migrate_draw_status_to_domain_dict',
'2026_05_25_120000_consolidate_play_display_name_columns' => '2026_05_25_120001_consolidate_play_display_name_columns',
'2026_05_25_120000_expand_audit_logs_target_type' => '2026_05_25_120002_expand_audit_logs_target_type',
'2026_05_25_120000_refine_admin_permission_granularity' => '2026_05_25_120003_refine_admin_permission_granularity',
];
public function up(): void
{
foreach (self::RENAMES as $from => $to) {
DB::table('migrations')->where('migration', $from)->update(['migration' => $to]);
}
}
public function down(): void
{
foreach (self::RENAMES as $from => $to) {
DB::table('migrations')->where('migration', $to)->update(['migration' => $from]);
}
}
};

View File

@@ -0,0 +1,25 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* admin_api_resources.code 最长可达 128;中间件将完整 code 写入 audit_logs.target_type。
*/
return new class extends Migration
{
public function up(): void
{
Schema::table('audit_logs', function (Blueprint $table): void {
$table->string('target_type', 128)->nullable()->change();
});
}
public function down(): void
{
Schema::table('audit_logs', function (Blueprint $table): void {
$table->string('target_type', 32)->nullable()->change();
});
}
};

View File

@@ -30,13 +30,13 @@ final class AdminRbacAndUserSeeder extends Seeder
{
$super = AdminRole::query()->updateOrCreate(
['slug' => AdminUser::ROLE_SUPER_ADMIN],
['name' => '超级管理员'],
['code' => AdminUser::ROLE_SUPER_ADMIN, 'name' => '超级管理员'],
);
$this->syncRolePermissions($super, $this->allCatalogSlugs());
$risk = AdminRole::query()->updateOrCreate(
['slug' => 'risk_operator'],
['name' => '风控运营员'],
['code' => 'risk_operator', 'name' => '风控运营员'],
);
$this->syncRolePermissions($risk, [
'prd.dashboard.view',
@@ -59,7 +59,7 @@ final class AdminRbacAndUserSeeder extends Seeder
$finance = AdminRole::query()->updateOrCreate(
['slug' => 'finance'],
['name' => '财务/对账员'],
['code' => 'finance', 'name' => '财务/对账员'],
);
$this->syncRolePermissions($finance, [
'prd.dashboard.view',
@@ -79,7 +79,7 @@ final class AdminRbacAndUserSeeder extends Seeder
$cs = AdminRole::query()->updateOrCreate(
['slug' => 'customer_service'],
['name' => '客服人员'],
['code' => 'customer_service', 'name' => '客服人员'],
);
$this->syncRolePermissions($cs, [
'prd.dashboard.view',