Files
KnowledgeBase/database/seeders/DatabaseSeeder.php
lizhuoran 0fb9b1938d fix(队列&seeder): 修复队列超时和文档创建问题
- 修复队列超时问题:
  - 将 queue:listen 改为 queue:work,提高性能和稳定性
  - 增加超时时间从 300 秒到 600 秒,确保大文件转换任务有足够时间
  - 同时更新 dev 和 dev-octane 脚本

- 修复 DatabaseSeeder 文档创建问题:
  - 不再使用 factory 创建文档,避免生成不存在的文件路径
  - 直接使用 Document::create() 明确指定所有字段
  - 所有文档状态设置为 pending,表示等待转换
  - 使用 UUID 生成唯一文件路径,便于管理
2026-03-12 14:37:15 +08:00

329 lines
14 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\Document;
use App\Models\Group;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Seed the application's database.
*/
public function run(): void
{
$this->command->info('开始生成演示数据...');
// 0. 创建权限和角色(必须最先执行)
$this->call(PermissionSeeder::class);
// 1. 创建系统设置
$this->call(SystemSettingSeeder::class);
// 2. 创建管理员用户
$this->command->info('创建管理员用户...');
$admin = User::factory()->create([
'name' => '系统管理员',
'email' => 'admin@example.com',
'password' => Hash::make('password'),
]);
// 为管理员分配 super-admin 角色
$admin->assignRole('super-admin');
// 3. 创建普通用户
$this->command->info('创建普通用户...');
$user1 = User::factory()->create([
'name' => '张三',
'email' => 'zhangsan@example.com',
'password' => Hash::make('password'),
]);
$user1->assignRole('user');
$user2 = User::factory()->create([
'name' => '李四',
'email' => 'lisi@example.com',
'password' => Hash::make('password'),
]);
$user2->assignRole('user');
$user3 = User::factory()->create([
'name' => '王五',
'email' => 'wangwu@example.com',
'password' => Hash::make('password'),
]);
$user3->assignRole('admin');
$user4 = User::factory()->create([
'name' => '赵六',
'email' => 'zhaoliu@example.com',
'password' => Hash::make('password'),
]);
$user4->assignRole('user');
// 3. 创建分组
$this->command->info('创建分组...');
$techGroup = Group::factory()->create([
'name' => '技术部',
'description' => '负责公司技术研发和系统维护工作',
]);
$marketGroup = Group::factory()->create([
'name' => '市场部',
'description' => '负责市场推广和品牌建设工作',
]);
$hrGroup = Group::factory()->create([
'name' => '人力资源部',
'description' => '负责人力资源管理和员工关系维护',
]);
// 4. 建立用户和分组的关联关系
$this->command->info('建立用户和分组的关联关系...');
// 管理员属于所有分组
$admin->groups()->attach([$techGroup->id, $marketGroup->id, $hrGroup->id]);
// 张三和李四属于技术部
$user1->groups()->attach($techGroup->id);
$user2->groups()->attach($techGroup->id);
// 王五属于市场部
$user3->groups()->attach($marketGroup->id);
// 赵六属于人力资源部
$user4->groups()->attach($hrGroup->id);
// 5. 创建全局文档(仅元数据,不创建实际文件)
$this->command->info('创建全局文档...');
Document::create([
'title' => '公司员工手册',
'description' => '包含公司规章制度、员工福利、考勤制度等重要信息',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '员工手册_2024.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'global',
'group_id' => null,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '办公室使用规范',
'description' => '办公室设施使用规范和注意事项',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '办公室规范.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'global',
'group_id' => null,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '公司年度总结报告',
'description' => '2024年度公司发展总结和2025年规划',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '年度总结_2024.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'global',
'group_id' => null,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '安全管理制度',
'description' => '公司信息安全和物理安全管理制度',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '安全管理制度.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'global',
'group_id' => null,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
// 6. 创建技术部专用文档
$this->command->info('创建技术部专用文档...');
Document::create([
'title' => '系统架构设计文档',
'description' => '公司核心系统的架构设计和技术选型说明',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '系统架构设计.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $techGroup->id,
'uploaded_by' => $user1->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '代码规范指南',
'description' => '团队代码编写规范和最佳实践',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '代码规范.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $techGroup->id,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '数据库设计文档',
'description' => '数据库表结构设计和关系说明',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '数据库设计.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $techGroup->id,
'uploaded_by' => $user2->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => 'API 接口文档',
'description' => '系统对外提供的 API 接口说明和使用示例',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => 'API接口文档.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $techGroup->id,
'uploaded_by' => $user1->id,
'conversion_status' => 'pending',
]);
// 7. 创建市场部专用文档
$this->command->info('创建市场部专用文档...');
Document::create([
'title' => '市场推广方案',
'description' => '2025年第一季度市场推广计划和预算',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '市场推广方案_Q1.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $marketGroup->id,
'uploaded_by' => $user3->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '品牌宣传策略',
'description' => '品牌定位和宣传渠道策略',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '品牌宣传策略.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $marketGroup->id,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '客户调研报告',
'description' => '目标客户群体调研分析报告',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '客户调研报告.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $marketGroup->id,
'uploaded_by' => $user3->id,
'conversion_status' => 'pending',
]);
// 8. 创建人力资源部专用文档
$this->command->info('创建人力资源部专用文档...');
Document::create([
'title' => '招聘流程指南',
'description' => '公司招聘流程和面试评估标准',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '招聘流程指南.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $hrGroup->id,
'uploaded_by' => $user4->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '员工培训计划',
'description' => '2025年员工培训计划和课程安排',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '员工培训计划_2025.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $hrGroup->id,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '薪酬福利制度',
'description' => '公司薪酬结构和福利政策说明',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '薪酬福利制度.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $hrGroup->id,
'uploaded_by' => $user4->id,
'conversion_status' => 'pending',
]);
Document::create([
'title' => '绩效考核标准',
'description' => '员工绩效考核指标和评估流程',
'file_path' => 'documents/' . date('Y/m/d') . '/' . fake()->uuid() . '.docx',
'file_name' => '绩效考核标准.docx',
'file_size' => fake()->numberBetween(100000, 500000),
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'type' => 'dedicated',
'group_id' => $hrGroup->id,
'uploaded_by' => $admin->id,
'conversion_status' => 'pending',
]);
$this->command->info('演示数据生成完成!');
// 9. 创建终端数据
$this->call(TerminalSeeder::class);
// 10. 创建SOP模板数据
$this->call(SopTemplateSeeder::class);
$this->command->newLine();
$this->command->info('=== 生成的数据摘要 ===');
$this->command->info('用户数量: ' . User::count());
$this->command->info('分组数量: ' . Group::count());
$this->command->info('文档数量: ' . Document::count());
$this->command->info(' - 全局文档: ' . Document::global()->count());
$this->command->info(' - 专用文档: ' . Document::dedicated()->count());
$this->command->newLine();
$this->command->info('=== 测试账号信息 ===');
$this->command->info('超级管理员: admin@example.com / password (super-admin)');
$this->command->info('张三(技术部): zhangsan@example.com / password (user)');
$this->command->info('李四(技术部): lisi@example.com / password (user)');
$this->command->info('王五(市场部): wangwu@example.com / password (admin)');
$this->command->info('赵六(人力资源部): zhaoliu@example.com / password (user)');
}
}