feat: 添加 PHPSpreadsheet 支持以增强报表导出功能

- 在 `composer.json` 中新增 `phpoffice/phpspreadsheet` 依赖。
- 更新 `ReportJobDownloadController` 以使用 `AdminReportSpreadsheetExporter` 进行 XLSX 格式的报表导出,简化导出逻辑并确保文件名包含动态生成的输出路径后缀。
- 更新 `AdminAuthorizationRegistry` 中的权限定义,扩展相关权限以支持新的设置管理功能。
This commit is contained in:
2026-05-26 13:53:18 +08:00
parent bba084b3c1
commit 3c74ffc2d5
9 changed files with 538 additions and 75 deletions

View File

@@ -10,13 +10,6 @@ return new class extends Migration
public function up(): void
{
$now = Carbon::now();
$menuActionId = DB::table('admin_menu_actions')
->where('permission_code', 'dashboard.view')
->value('id');
if ($menuActionId === null) {
return;
}
$resource = collect(AdminAuthorizationRegistry::resources())
->firstWhere('code', 'admin.dashboard.analytics');

View File

@@ -0,0 +1,72 @@
<?php
use App\Support\AdminAuthorizationRegistry;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
/**
* `dashboard.view` 2026_05_26 才写入 admin_menu_actions此前 sync 无法绑定
* admin.dashboard / admin.dashboard.analytics导致 permission_required 资源无 bindings。
*/
return new class extends Migration
{
public function up(): void
{
$now = Carbon::now();
$menuActionIds = DB::table('admin_menu_actions')->pluck('id', 'permission_code');
foreach (AdminAuthorizationRegistry::resources() as $resource) {
$resourceId = DB::table('admin_api_resources')
->where('code', $resource['code'])
->value('id');
$payload = [
'module_code' => $resource['module_code'],
'name' => $resource['name'],
'http_method' => $resource['http_method'],
'uri_pattern' => $resource['uri_pattern'],
'route_name' => $resource['route_name'],
'auth_mode' => $resource['auth_mode'],
'is_audit_required' => $resource['is_audit_required'],
'status' => 1,
'meta_json' => null,
'updated_at' => $now,
];
if ($resourceId === null) {
$resourceId = DB::table('admin_api_resources')->insertGetId($payload + [
'code' => $resource['code'],
'created_at' => $now,
]);
} else {
DB::table('admin_api_resources')
->where('id', (int) $resourceId)
->update($payload);
}
DB::table('admin_api_resource_bindings')
->where('api_resource_id', (int) $resourceId)
->delete();
foreach ($resource['permission_codes'] as $permissionCode) {
$menuActionId = $menuActionIds[$permissionCode] ?? null;
if ($menuActionId === null) {
continue;
}
DB::table('admin_api_resource_bindings')->insert([
'api_resource_id' => (int) $resourceId,
'menu_action_id' => (int) $menuActionId,
'created_at' => $now,
'updated_at' => $now,
]);
}
}
}
public function down(): void
{
// 数据修复迁移:不在 down 中回滚 bindings避免误删线上授权关系。
}
};