263 lines
7.4 KiB
PHP
263 lines
7.4 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Teachers;
|
|
|
|
use App\Models\Teachers\TeacherClass;
|
|
use App\Services\BaseService;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
|
|
/**
|
|
* 老师班级关联服务类
|
|
*/
|
|
class TeacherClassService extends BaseService
|
|
{
|
|
protected string $modelClass = TeacherClass::class;
|
|
|
|
/**
|
|
* 获取老师班级关联列表
|
|
*/
|
|
public function getList(array $params): LengthAwarePaginator
|
|
{
|
|
$query = TeacherClass::query();
|
|
|
|
// 老师ID筛选
|
|
if (!empty($params['teacher_id'])) {
|
|
$query->where('teacher_id', $params['teacher_id']);
|
|
}
|
|
|
|
// 学校筛选
|
|
if (!empty($params['school_id'])) {
|
|
$query->where('school_id', $params['school_id']);
|
|
}
|
|
|
|
// 班级筛选
|
|
if (!empty($params['class_id'])) {
|
|
$query->where('class_id', $params['class_id']);
|
|
}
|
|
|
|
// 年级筛选
|
|
if (!empty($params['grade_id'])) {
|
|
$query->where('grade_id', $params['grade_id']);
|
|
}
|
|
|
|
// 班主任筛选
|
|
if (isset($params['headman'])) {
|
|
$query->where('headman', $params['headman']);
|
|
}
|
|
|
|
// 包含关联信息
|
|
$query->with([
|
|
'teacher:id,username,nickname',
|
|
'school:id,name,alias',
|
|
'schoolClass:id,name,code,campus_id,grade_id,number'
|
|
]);
|
|
|
|
// 排序
|
|
$query->orderBy('school_id', 'asc')
|
|
->orderBy('grade_id', 'asc')
|
|
->orderBy('class_id', 'asc')
|
|
->orderBy('headman', 'desc');
|
|
|
|
return $query->paginate($params['page_size'] ?? 15);
|
|
}
|
|
|
|
/**
|
|
* 获取老师的班级列表
|
|
*/
|
|
public function getTeacherClasses(int $teacherId): array
|
|
{
|
|
return TeacherClass::where('teacher_id', $teacherId)
|
|
->with([
|
|
'school:id,name,alias',
|
|
'schoolClass:id,name,code,campus_id,grade_id,number'
|
|
])
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取班级的老师列表
|
|
*/
|
|
public function getClassTeachers(int $classId): array
|
|
{
|
|
return TeacherClass::where('class_id', $classId)
|
|
->with([
|
|
'teacher:id,username,nickname',
|
|
'school:id,name,alias'
|
|
])
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取学校的老师列表
|
|
*/
|
|
public function getSchoolTeachers(int $schoolId): array
|
|
{
|
|
return TeacherClass::where('school_id', $schoolId)
|
|
->with([
|
|
'teacher:id,username,nickname',
|
|
'schoolClass:id,name,code,campus_id,grade_id,number'
|
|
])
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取班主任列表
|
|
*/
|
|
public function getHeadmans(?int $schoolId = null, ?int $gradeId = null): array
|
|
{
|
|
$query = TeacherClass::headman();
|
|
|
|
if ($schoolId) {
|
|
$query->where('school_id', $schoolId);
|
|
}
|
|
|
|
if ($gradeId) {
|
|
$query->where('grade_id', $gradeId);
|
|
}
|
|
|
|
return $query->with([
|
|
'teacher:id,username,nickname',
|
|
'school:id,name,alias',
|
|
'schoolClass:id,name,code,campus_id,grade_id,number'
|
|
])->get()->toArray();
|
|
}
|
|
|
|
/**
|
|
* 批量分配老师到班级
|
|
*/
|
|
public function batchAssignTeachersToClass(array $teacherIds, int $classId, ?int $gradeId = null): array
|
|
{
|
|
$class = \App\Models\Schools\SchoolClass::findOrFail($classId);
|
|
$results = [];
|
|
|
|
foreach ($teacherIds as $teacherId) {
|
|
// 检查是否已经存在关联
|
|
$exists = TeacherClass::where('teacher_id', $teacherId)
|
|
->where('class_id', $classId)
|
|
->exists();
|
|
|
|
if (!$exists) {
|
|
$data = [
|
|
'teacher_id' => $teacherId,
|
|
'school_id' => $class->school_id,
|
|
'grade_id' => $gradeId ?? $class->grade_id,
|
|
'class_id' => $classId,
|
|
'headman' => 0,
|
|
];
|
|
|
|
$result = $this->create($data);
|
|
$results[] = $result;
|
|
}
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
/**
|
|
* 批量移除老师班级关联
|
|
*/
|
|
public function batchRemoveTeachersFromClass(array $teacherIds, int $classId): int
|
|
{
|
|
return TeacherClass::whereIn('teacher_id', $teacherIds)
|
|
->where('class_id', $classId)
|
|
->delete();
|
|
}
|
|
|
|
/**
|
|
* 设置班主任
|
|
*/
|
|
public function setHeadman(int $teacherId, int $classId): bool
|
|
{
|
|
// 先清除该班级的所有班主任
|
|
TeacherClass::where('class_id', $classId)->update(['headman' => 0]);
|
|
|
|
// 设置新的班主任
|
|
$teacherClass = TeacherClass::where('teacher_id', $teacherId)
|
|
->where('class_id', $classId)
|
|
->first();
|
|
|
|
if (!$teacherClass) {
|
|
throw new \InvalidArgumentException('该老师不在此班级中');
|
|
}
|
|
|
|
$teacherClass->headman = 1;
|
|
return $teacherClass->save();
|
|
}
|
|
|
|
/**
|
|
* 取消班主任
|
|
*/
|
|
public function removeHeadman(int $classId): bool
|
|
{
|
|
return TeacherClass::where('class_id', $classId)
|
|
->update(['headman' => 0]) > 0;
|
|
}
|
|
|
|
/**
|
|
* 获取老师班级统计信息
|
|
*/
|
|
public function getTeacherClassStats(int $teacherId): array
|
|
{
|
|
$classes = TeacherClass::where('teacher_id', $teacherId)
|
|
->with(['school:id,name', 'schoolClass:id,name'])
|
|
->get();
|
|
|
|
return [
|
|
'total_classes' => $classes->count(),
|
|
'headman_classes' => $classes->where('headman', 1)->count(),
|
|
'schools' => $classes->pluck('school')->unique('id')->values()->toArray(),
|
|
'classes' => $classes->pluck('schoolClass')->toArray(),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 创建前的特殊处理
|
|
*/
|
|
protected function beforeCreate(array &$data): void
|
|
{
|
|
// 设置默认值
|
|
$data['headman'] = $data['headman'] ?? 0;
|
|
|
|
// 验证老师是否存在
|
|
if (!empty($data['teacher_id'])) {
|
|
$teacher = \App\Models\User::find($data['teacher_id']);
|
|
if (!$teacher) {
|
|
throw new \InvalidArgumentException('指定的老师不存在');
|
|
}
|
|
}
|
|
|
|
// 验证学校是否存在
|
|
if (!empty($data['school_id'])) {
|
|
$school = \App\Models\Schools\School::find($data['school_id']);
|
|
if (!$school) {
|
|
throw new \InvalidArgumentException('指定的学校不存在');
|
|
}
|
|
}
|
|
|
|
// 验证班级是否存在
|
|
if (!empty($data['class_id'])) {
|
|
$class = \App\Models\Schools\SchoolClass::find($data['class_id']);
|
|
if (!$class) {
|
|
throw new \InvalidArgumentException('指定的班级不存在');
|
|
}
|
|
|
|
// 验证班级是否属于指定学校
|
|
if (isset($data['school_id']) && $class->school_id !== $data['school_id']) {
|
|
throw new \InvalidArgumentException('指定的班级不属于该学校');
|
|
}
|
|
}
|
|
|
|
// 检查是否已经存在关联
|
|
$exists = TeacherClass::where('teacher_id', $data['teacher_id'])
|
|
->where('class_id', $data['class_id'])
|
|
->exists();
|
|
|
|
if ($exists) {
|
|
throw new \InvalidArgumentException('该老师已经在此班级中');
|
|
}
|
|
}
|
|
}
|