study-api-v2/app/Services/Students/StudentClassService.php

207 lines
5.6 KiB
PHP

<?php
namespace App\Services\Students;
use App\Models\Students\StudentClass;
use App\Services\BaseService;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* 学生班级关联服务类
*/
class StudentClassService extends BaseService
{
protected string $modelClass = StudentClass::class;
/**
* 获取学生班级关联列表
*/
public function getList(array $params): LengthAwarePaginator
{
$query = StudentClass::query();
// 学生ID筛选
if (!empty($params['student_id'])) {
$query->where('student_id', $params['student_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']);
}
// 包含关联信息
$query->with([
'school:id,name,alias',
'schoolClass:id,name,code,campus_id,grade_id,number'
]);
// 排序
$query->orderBy('school_id', 'asc')
->orderBy('class_id', 'asc')
->orderBy('id', 'desc');
return $query->paginate($params['page_size'] ?? 15);
}
/**
* 获取学生的班级列表
*/
public function getStudentClasses(int $studentId): array
{
return StudentClass::where('student_id', $studentId)
->with([
'school:id,name,alias',
'schoolClass:id,name,code,campus_id,grade_id,number'
])
->get()
->toArray();
}
/**
* 获取班级的学生列表
*/
public function getClassStudents(int $classId): array
{
return StudentClass::where('class_id', $classId)
->with([
'school:id,name,alias'
])
->get()
->toArray();
}
/**
* 获取学校的学生列表
*/
public function getSchoolStudents(int $schoolId): array
{
return StudentClass::where('school_id', $schoolId)
->with([
'schoolClass:id,name,code,campus_id,grade_id,number'
])
->get()
->toArray();
}
/**
* 批量分配学生到班级
*/
public function batchAssignStudentsToClass(array $studentIds, int $classId): array
{
$class = \App\Models\Schools\SchoolClass::findOrFail($classId);
$results = [];
foreach ($studentIds as $studentId) {
// 检查是否已经存在关联
$exists = StudentClass::where('student_id', $studentId)
->where('class_id', $classId)
->exists();
if (!$exists) {
$data = [
'student_id' => $studentId,
'school_id' => $class->school_id,
'class_id' => $classId,
];
$result = $this->create($data);
$results[] = $result;
}
}
return $results;
}
/**
* 批量移除学生班级关联
*/
public function batchRemoveStudentsFromClass(array $studentIds, int $classId): int
{
return StudentClass::whereIn('student_id', $studentIds)
->where('class_id', $classId)
->delete();
}
/**
* 转移学生到新班级
*/
public function transferStudentToClass(int $studentId, int $oldClassId, int $newClassId): bool
{
$newClass = \App\Models\Schools\SchoolClass::findOrFail($newClassId);
// 删除旧的关联
StudentClass::where('student_id', $studentId)
->where('class_id', $oldClassId)
->delete();
// 创建新的关联
$data = [
'student_id' => $studentId,
'school_id' => $newClass->school_id,
'class_id' => $newClassId,
];
$this->create($data);
return true;
}
/**
* 获取学生班级统计信息
*/
public function getStudentClassStats(int $studentId): array
{
$classes = StudentClass::where('student_id', $studentId)
->with(['school:id,name', 'schoolClass:id,name'])
->get();
return [
'total_classes' => $classes->count(),
'schools' => $classes->pluck('school')->unique('id')->values()->toArray(),
'classes' => $classes->pluck('schoolClass')->toArray(),
];
}
/**
* 创建前的特殊处理
*/
protected function beforeCreate(array &$data): void
{
// 验证学校是否存在
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 ($class->school_id !== $data['school_id']) {
throw new \InvalidArgumentException('指定的班级不属于该学校');
}
}
// 检查是否已经存在关联
$exists = StudentClass::where('student_id', $data['student_id'])
->where('class_id', $data['class_id'])
->exists();
if ($exists) {
throw new \InvalidArgumentException('该学生已经在此班级中');
}
}
}