You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
4.1 KiB
95 lines
4.1 KiB
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use App\Models\DictItem;
|
|
use App\Models\DictType;
|
|
use App\Models\ResearchDirection;
|
|
use App\Models\Teacher;
|
|
use App\Models\University;
|
|
use App\Services\TeacherFollowPlanService;
|
|
use Illuminate\Database\Seeder;
|
|
|
|
/**
|
|
* 演示数据(对齐 prototype 四所高校)。
|
|
*/
|
|
class TeacherSampleSeeder extends Seeder
|
|
{
|
|
public function run(): void
|
|
{
|
|
$plan = app(TeacherFollowPlanService::class);
|
|
|
|
$universities = [
|
|
['name' => '上海交通大学', 'city' => '上海', 'province' => '上海', 'latitude' => 31.2041, 'longitude' => 121.4377],
|
|
['name' => '苏州大学', 'city' => '苏州', 'province' => '江苏', 'latitude' => 31.3041, 'longitude' => 120.6396],
|
|
['name' => '浙江大学', 'city' => '杭州', 'province' => '浙江', 'latitude' => 30.2994, 'longitude' => 120.0856],
|
|
['name' => '复旦大学', 'city' => '上海', 'province' => '上海', 'latitude' => 31.2970, 'longitude' => 121.5031],
|
|
];
|
|
|
|
$uniMap = [];
|
|
foreach ($universities as $row) {
|
|
$u = University::query()->firstOrCreate(
|
|
['name' => $row['name']],
|
|
[
|
|
'city' => $row['city'],
|
|
'province' => $row['province'],
|
|
'latitude' => $row['latitude'],
|
|
'longitude' => $row['longitude'],
|
|
'status' => 1,
|
|
]
|
|
);
|
|
$u->fill([
|
|
'city' => $row['city'],
|
|
'province' => $row['province'],
|
|
'latitude' => $row['latitude'],
|
|
'longitude' => $row['longitude'],
|
|
]);
|
|
$u->save();
|
|
$uniMap[$row['name']] = $u;
|
|
}
|
|
|
|
$source = fn (string $v) => DictItem::query()
|
|
->where('dict_type_id', DictType::query()->where('code', 'teacher_source')->value('id'))
|
|
->where('value', $v)->value('id');
|
|
$level = fn (string $v) => DictItem::query()
|
|
->where('dict_type_id', DictType::query()->where('code', 'teacher_level')->value('id'))
|
|
->where('value', $v)->value('id');
|
|
$status = fn (string $v) => DictItem::query()
|
|
->where('dict_type_id', DictType::query()->where('code', 'teacher_status')->value('id'))
|
|
->where('value', $v)->value('id');
|
|
|
|
$samples = [
|
|
['name' => '张某某', 'uni' => '上海交通大学', 'title' => '副教授', 'dir' => 'AI for Science', 'source' => 'paper', 'star' => '3', 'st' => 'active'],
|
|
['name' => '王某某', 'uni' => '苏州大学', 'title' => '教授', 'dir' => '纳米材料', 'source' => 'manual', 'star' => '5', 'st' => 'partner'],
|
|
['name' => '李某某', 'uni' => '浙江大学', 'title' => '讲师', 'dir' => '计算材料学', 'source' => 'miniapp', 'star' => '3', 'st' => 'paused'],
|
|
['name' => '周某某', 'uni' => '复旦大学', 'title' => '副研究员', 'dir' => '多模态学习', 'source' => 'paper', 'star' => '4', 'st' => 'active'],
|
|
];
|
|
|
|
foreach ($samples as $row) {
|
|
$starId = $level($row['star']);
|
|
$starItem = $starId ? DictItem::query()->find($starId) : null;
|
|
$isPartner = $row['st'] === 'partner';
|
|
|
|
$teacher = Teacher::query()->updateOrCreate(
|
|
['name' => $row['name'], 'university_id' => $uniMap[$row['uni']]->id],
|
|
[
|
|
'city' => $uniMap[$row['uni']]->city,
|
|
'title' => $row['title'],
|
|
'source_dict_item_id' => $source($row['source']),
|
|
'star_level_dict_item_id' => $starId,
|
|
'status_dict_item_id' => $status($row['st']),
|
|
'next_follow_date' => $plan->nextFollowDateFromStar($starItem),
|
|
'is_partner' => $isPartner,
|
|
'converted_at' => $isPartner ? now() : null,
|
|
]
|
|
);
|
|
|
|
$directionId = ResearchDirection::query()->firstOrCreate(
|
|
['name' => $row['dir']],
|
|
['sort' => 0, 'status' => 1]
|
|
)->id;
|
|
$teacher->researchDirections()->sync([$directionId]);
|
|
}
|
|
}
|
|
}
|